Javaにやられた話

今、ボスが受け持っている実験のTAをやっています。 Javaでアレコレやる実験なのですが、 受講している学生から質問(ヘルプ)を受けたにも関わらず 解決に導くことができなかったので、 反省と後学のためにメモしておきます。

今日やられた内容は、String.valueOfというメソッドです。 受けた質問は、こいつにchar型の配列を投げ込んで作ったStringと 同じ内容の文字列リテラルを比較しても一致しない、というものでした。

で、何が原因だったかというと、「char型の配列の長さが作成する文字列よりも長かった」ということでした。

全く知らなかったんですけど、String.valueOfで文字列作るとき、多分newしてそのままの0が入っている部分もNULL文字が入っているものとして文字列作ってくれやがります。

実際に以下のコードを試してみると分かるかと思います。

String a = "hoge";

char b[] = new char[3];
b[0] = a.charAt(0);
b[1] = a.charAt(1);

String c = String.valueOf(b);

System.out.println(c);

for(byte d: c.getBytes()){
  System.out.printf("%x ", d);
}
System.out.println();

System.out.println("## equals ##");
System.out.println(c.equals("ho"));
System.out.println("## compareTo##");
System.out.println(c.compareTo("ho"));

文字列が一致しないときに、「見えない文字で文字数が異なる」という点に頭が働かなかったのが悔やまれますが、なんでこんなときだけNULL文字までしっかり見てやがるんだと思いました。