Java Stringクラス

概要

Stringクラスは、文字列を生成して操作できるように、さまざまなコンストラクタとメソッドを持っている。
C言語と比べると、メモリ関連の演算子を使わないため、文字列の生成や操作が便利である。

Stringコンストラクタ

コンストラクタ 説明
String() デフォルトコンストラクタ。文字列を持たないオブジェクトを生成する。
String(String original) 他のStringオブジェクトを利用して文字列を生成する。
String(char value[]) 文字配列を利用してオブジェクトを生成する。
String(char value[], int offset, int count) 文字配列の内容のうち、指定した位置から指定した数だけを使ってオブジェクトを生成する。
String(int[] codePoints, int offset, int count) (J2SE5) Unicodeコードポイントを含む配列を利用してオブジェクトを生成する。
String(byte bytes[]) バイト配列を利用してオブジェクトを生成する。
String(byte bytes[], String charsetName) バイト配列の内容を、指定したCharset名を利用してオブジェクトとして生成する。
String(byte bytes[], Charset charset) バイト配列の内容を、指定したCharsetを利用してオブジェクトとして生成する。
String(StringBuffer buffer) StringBufferオブジェクトを利用してオブジェクトを生成する。
String(StringBuilder builder) (J2SE5) StringBuilderオブジェクトを利用してオブジェクトを生成する。

文字列の生成 - コンストラクタを使わない

Javaでは、Stringオブジェクトは他のオブジェクトとは異なり、コンストラクタを使わなくても文字列オブジェクトを生成できる。

次はnewを使わず、リテラルを使って文字列を生成する例である。

package com.devkuma.tutorial.string;

public class StringJava {

    public static void main(String[] args) {
        String str = "This is java.";
        System.out.println(str);
    }
}

結果は以下のとおりである。

This is java.

Javaのクラスの中で、このような特殊性を持つのはStringクラスだけである。Stringクラスがそうだからといって、他のクラスも同じようにできると考えてはいけない。似たクラスもなく、作ることもできない。

文字列の生成 - なぜコンストラクタを使わないのか

上で、Stringオブジェクトは生成時に別途newを使わなくても、リテラルの代入だけで生成できると説明した。もちろんnewを使い、リテラルをパラメータとして渡すことも可能である。しかし、一般的にリテラルを使った文字列はnewで生成しない。なぜだろうか。コードを短くできることも理由だが、内部的にも別の理由がある。

以下の例では、newを使ってリテラルを渡し、文字列オブジェクトを生成している。

package com.devkuma.tutorial.string;

public class StringJava2 {

    public static void main(String[] args) {
        String str = new String("This is java.");
        System.out.println(str);
    }
}

先に示した例と同じく、結果は同じである。

This is java.

結果は同じでも、内部的にはメモリアドレスが2つ作られる可能性がある。まず"This is Java.“として作られ、さらにnew String(“This is java”)として作られる可能性があるということだ。1回の動作でオブジェクトを生成できるのに、あえて2回の作業をして2つのメモリアドレスを作る必要はない。もちろんガベージコレクタがメモリを処理してくれるが、わずかな性能にも関係するため、できるだけ避けよう。

文字列の結合 - メソッドを使わない

Stringオブジェクトは、メソッドを使わなくても文字列演算子である”+“演算子を利用して結合できる。

package com.devkuma.tutorial.string;

public class StringConcat2 {

    public static void main(String[] args) {
        String age = "30";
        System.out.println("He is " + age + " years old");
    }
}

文字列ではない他のデータ型とも結合できる。

package com.devkuma.tutorial.string;

public class StringConcat3 {

    public static void main(String[] args) {
        int age = 30;
        System.out.println("He is " + age + " years old");
    }
}

既存の文字列が変更されるたびに、変更後の文字列を持つ新しいStringオブジェクトが生成される。元の文字列は変更されず、そのまま残る。これはガベージコレクタによって管理される。

Stringの主なメソッド

メソッド 説明

文字列の長さ

文字列の長さとは、文字列に含まれる文字数のことである。 文字列の長さはlength()メソッドを使って確認できる。

準備中...

文字列から文字を抽出

  • char charAt(int index)
  • void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)

文字列の比較

  • boolean equals(Object anObject)
  • boolean startsWith(String prefix, int toffset)
  • boolean startsWith(String prefix)
  • boolean endsWith(String suffix)
  • int compareTo(String anotherString)

文字列の検索

文字列に含まれるサブ文字列を検索するために使用する。

  • int indexOf(int ch)
  • int indexOf(int ch, int fromIndex)
  • int lastIndexOf(int ch)
  • int lastIndexOf(int ch, int fromIndex)
  • int indexOf(String str)
  • int indexOf(String str, int fromIndex)
  • int lastIndexOf(String str)
  • int lastIndexOf(String str, int fromIndex)

文字列の変換

  • String substring(int beginIndex)
  • String substring(int beginIndex, int endIndex)
  • String concat(String str)
  • String replace(char oldChar, char newChar)
  • String replaceAll(String regex, String replacement)
  • String replace(CharSequence target, CharSequence replacement)
  • String trim()
  • String toLowerCase()
  • String toUpperCase()

型変換

  • String valueOf(Object obj)
  • String valueOf(char data[])
  • String valueOf(char data[], int offset, int count)
  • String valueOf(boolean b)
  • String valueOf(char c)
  • String valueOf(int i)
  • String valueOf(long l)
  • String valueOf(float f)
  • String valueOf(double d)