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文字までしっかり見てやがるんだと思いました。