文字列は、その名の通り連続した文字です。
java では文字列は、基本型ではなくクラスです。
文字列リテラルを扱う String クラスは、 読み出しのみ可能な文字列とそれを操作するメソッドを提供しています。 そのため、変更可能な文字列を扱う StringBuffer クラスも提供しています。 ここでは、この2つのクラスについて説明します。
このクラスでは、以下の機能がサポートされています。
文字列リテラルは、String クラスのインスタンスのようにふるまいます。 文字列リテラルに対してメソッドを呼ぶこともできますし、 それへの参照をコピーすることもできます。
String peach = "Thomsa the Tank Engine\n";
これは、new を使って以下のように書くのと同じです。
String peach = new String("Thomsa the Tank Engine\n");
+の引数の1つが文字列である場合は、 コンパイラは算術演算の加算を行わず、 もう一方の引数を文字列に変換し、2つの文字列を結合しようとします。
+演算子は、オブジェクトにも適用できます。 +の一方の引数にオブジェクトを書くと、そのオブジェクトに toString メソッドを呼び出して、そのオブジェクトの文字列を作り、 他方の引数である文字列とつなぎ合わせます。 そのオブジェクトに toString メソッドがない場合は、 スーパークラスである Object の toString メソッドをそのまま 継承して使います。これは、インスタンスのアドレスの文字列を返します。
注意 |
System.out.println("your value is "+2+3); System.out.println(2+3+" are your value"); 上記の結果は以下のようになります。
your value is 23 5 are your value
|
String クラスの主なコンストラクタは以下の通りです。
public String() | 新しい String を値 "" で生成する |
public String(String value) | 新しい String を値 value で生成する |
メソッド | 戻り値 |
---|---|
indexOf(char ch) | ch が現れる最初の位置 |
indexOf(char ch,int start) | ch >= start を満たす最初の位置 |
indexOf(String str) | str が現れる最初の位置 |
indexOf(String str,int start) | str >= start を満たす最初の位置 |
lastIndexOf(char ch) | ch が現れる最終の位置 |
lastIndexOf(char ch,int start) | ch >= start を満たす最終の位置 |
lastIndexOf(String str) | str が現れる最終の位置 |
LastIndexOf(String str,int start) | str >= start を満たす最終の位置 |
注意 | 配列のサイズを得る場合とは対照的に、
String や StringBuffer の長さを得るには、
length メソッド呼び出しが必要です。
String str = "ABCDEFG"; int i = str.length();
|
java Core API の java.lang.String を見てみましょう。 |
文字列を比較するメソッドには equals があります。 これは同じ内容の String オブジェクトへの参照であると、 true を返します。 同じ内容であるとは、2つの文字列の長さが等しく、 かつ完全に同じ Unicode 文字であるということです。 片方のオブジェクトが String でなかったり、 内容が異なる場合は false を返します。
大文字小文字を区別しないで文字列を比較するときは equalsIgnoreCase メソッドを使います。
compareTo メソッドは文字列の辞書的順序を比較するのに便利です。
次のメソッド position は、 ソートされた文字列配列をもつクラスに対して、 2分木探索を行います。
private String[] table; public int position(String key) { int lo = 0; int hi = table.length - 1; while (lo <= hi) { int mid = lo + (hi -lo) / 2; int cmp = key.compareTo(table[mid]); if (cmp == 0) // Found return mid; else if (cmp < 0) // search lower hi = mid - 1; else // search higer lo = mid + 1; } return -1; // Not found }
次のメソッド quotedString は、 start と end で囲まれた最も長い部分文字列を取り出すものです。
class Qstr { public static String quotedString(String from,char start,char end) { int startPos = from.indexOf(start); int endPos = from.lastIndexOf(end); if (startPos == -1) // Not found start char return null; else if (endPos == -1) // Not found end char return from.substring(startPos); else // Found start and end return from.substring(startPos,endPos+1); } public static void main(String[] arg) { System.out.println(quotedString("aaa bbb < pickUp >\n",'<','>')); System.out.println(quotedString("aaa bbb < pickUp)",'<','>')); System.out.println(quotedString("aaa bbb cccc\"AAApickUp\"\n",'"','"')); } }
文字列を他のタイプに変換しなければならないことは多いでしょう。 変換に関する習慣は、 変換先のタイプが変換のためのメソッドを持っているというものです。
例えば、String から int への変換では Integer クラスの static メソッドが使われます。 以下に String と変換できるすべてのタイプと変換方法を示します。
タイプ | String へ | String から |
---|---|---|
boolean | String.valueOf(boolean) | new Boolean(String).booleanValue() |
int | String.valueOf(int) | Integer.parseInt(String),Integer.parseInt(String,int) |
long | String.valueOf(long) | Long.parseLong(String),Long.parseLong(String,int) |
float | String.valueOf(float) | new Float(String).floatValue() |
double | String.valueOf(double) | new Double(String).doubleValue() |
String は char 配列に変換できるし、その逆も可能です。
質問 | java Core API の どのメソッドを使えばよいでしょうか? |
8ビット文字を16ビット Unicode の String オブジェクトに変換する メソッドがあります。このメソッドは特に ASCII や ISO-Latin-1 などの文字から Unicode 文字セットのはじめの256文字を生成します。
public String(byte[] bytes,int hiByte,int offset,int count) public String(byte[] bytes,int hiByte)
また String をプラットフォームのデフォルトの文字エンコーディングに従って、 バイトに変換し結果を新しいバイト配列に格納するメソッドもあります。 これを使用すると、文字列のバイト数を知ることができます。
public byte[] getBytes() [例] String str; str.getBytes().length;
StringBuffer は複数の String をつなげて長い String を作るクラスで、 以下の機能があります。
構成した文字列を保持するための StringBuffer オブジェクトは、 1つしか生成されません。 これにいろいろ追加し、 最後の toString によって、 String を生成します。
StringBuffer オブジェクトは、変更可能なので、 処理の中間結果を保持するために新たにオブジェクトを作る必要がなく、 効率のよいコードを生成できます。
public StringBuffer() | 新しい StringBuffer を値 "" で生成する |
public StringBuffer(int capacity) | 新しい StringBuffer の容量を capacity で値 "" で生成する |
public StringBuffer(String value) | 新しい StringBuffer を値 value で生成する |
StringBuffer sb = new StringBuffer(); sb = sb.append(" (0X"+Integer.toHexString(ival)).append("\"");
StringBuffer オブジェクトのバッファには容量があります。 これは新しく領域を確保せずに保持できる文字列の長さです。 バッファの大きさは文字列を加えるごとに増やされますが、 バッファの大きさを1回だけ指定するようにした方が効率的です。
まとめ |
文字列の宣言 | String 変数名 ; |
---|---|
文字列の初期化 | String 変数名 = { 初期値 } |
文字列の生成 | String 変数名 = new String() ; |
文字列のサイズ | 変数名.length() |
StringBuffer の宣言 | StringBuffer 変数名 ; |
StringBuffer の生成 | StringBuffer 変数名 = new StringBuffer() ; |
StringBuffer への追加 | 変数名 = 変数名.append(文字列1).append(文字列2) ; |