2-2 文字列の操作
2-2-1 Stringクラス
Stringクラスの説明。
推奨しない書き方としながら、最初は下のコードのような説明になるのは仕方がないのかな・・・
String s = new String("0123456789")
Stringオブジェクトは不変だという説明がきちんとされているけど、初学者はなかなか理解できないだろうな。特に、中身は文字配列という記述が前にあるし。
2-2-2 Stringクラスの使用例
サンプルコードはサポートサイトからダウンロードができる。
isEmptyメソッドで空文字の判定が可能という記述を見て、
if (s == null || s.isEmpty() || s.equals("")) {
}
という職場で見たコードを思い出したw
2-2-3 文字列リテラル
ここで、前節のnew String("0123456789")の書き方が推奨されない理由を説明している。
オブジェクトを生成して変数がそれを参照するという説明を最初からしているのはいい。
文字列と改行
複数行で文字列リテラルを記述するとき。コンパイル時に評価されるので実行速度の低下はない。このあたりは、コンパイルしたclassファイルをみたらよくわかる。
String s = "0123"
+ "345"
2-2-4 StringBuilderクラス
変更可能文字列クラスとしてStringBuilderを紹介。
サンプルコードの注意点として、引数オブジェクトの中身を書き変えている点を指摘している。
2-2-5 文字列の結合
- 文字列結合の注意と効率
- ループでの結合ではStringBUilderを使わないとパフォーマンスが低下することがある。
public class Main {
static String concat(String[] array) {
String result = "";
for (String s : array) {
result += s; // +=演算で文字列結合(裏でStringBuilderオブジェクト生成コードになる)
}
return result;
}
public static void main(String... args) {
}
}
↓ 下の書き方で書く。
public class Main {
static String concat(String[] arr) {
StringBuilder result = new StringBuilder();
for (String s : arr) {
result.append(s);
}
return result.toString();
}
public static void main(String... args) {
}
}
joinメソッド
Java8から登場したAPI。
- 引数が可変長引数
- 引数がコレクション(文字列のリストなど)
String s = String.join(",", "abc", "def", "ghi"); // 区切り文字","
System.out.println(s); //=> "abc,def,ghi" を出力
2-2-6 文字列の比較
よくある==演算子での文字列比較はダメという話。
StringとStringBuilderの同値比較
StringBuilderオブジェクトと同値の比較をする場合、contentEqualsメソッドを使う。このメソッドは知らなかった。
boolean contentEquals(CharSequence cs)
StringBuilder同士の比較
toStringしてからcontentEqualsを使う。メソッドとしてあってもいいのにと思う。
2-2-7 文字列の大小比較とソート処理
compareToメソッドの紹介。順序は直感とは違う場合があるので注意が必要(コラム参照)。
2-2-8 数値と文字列の相互変換
数値の内部表現への変換
これも知らなかった。バイナリを扱うクラスのtoString()で使うとデバッグが楽になりそう。
String s = Integer.toHexString(-1) //=> "ffffffff"
String b = Interger.toBinaryString(-1) //=> "1111..."
文字列から数値への変換
セキュリティホールの多くは、利用者の入力した文字列を内部値に変換するときの甘さから生じている。注意して使用すること。
valueOfメソッドよりもparse系メソッドのほうが効率が良い。
2-3 文字
2-3-1 文字とは
文字コード。Javaの世界の文字コードはUTF-16。
char型は数値ですよというお話。
2-3-3 文字と文字列
Javaの思想に純粋に従うと、文字は長さ1の文字列として扱うべき。
ただし、実行速度を追求すると、文字として扱う場面が出てくる。自分も文字として戦わざるを得ない状況は何回か経験している。
2-3-5 文字とコードポイント
Unicodeは21ビット長の範囲を文字として扱うように進化したので、コードポイントといい、16ビット長のchar型と区別している。
2-4 バイトと文字
ここでは特にUTF-8のバイト列を変換するときを扱っている。
java.nio.charset.StandardCharsets.UTF_8でやるとtry-catchを書かなくてよくなるというのは、昔からJavaをやっている人は意外に知らない?(昔のコードを直してないだけなのかよく見かける。)
String s = new String(bytes, java.nio.charset.StandardCharsets.UTF_8)