文字列を複製する

文字列を複製するには、代入するか、新しくStringオブジェクトを作る
StringクラスはCloneable インタフェースを未サポートclone()は使えない。なんでだっけ?

ソース

str1  = "This is a String"
str2  = new String(str1)
str1.hashCode()
str2.hashCode()


str3 = str1
str1.hashCode()
str3.hashCode()

str1 = "This is another string"
str1.hashCode()
str2.hashCode()
str3.hashCode()

str1
str2
str3

str1 == str2
str1 == str3

str1.equals(str2)
str1.equals(str3)

実行環境

結果

groovy:000> str1  = "This is a String"
===> This is a String
groovy:000> str2  = new String(str1)
===> This is a String
groovy:000> str1.hashCode()
===> 682948772
groovy:000> str2.hashCode()
===> 682948772

↑new しても同じオブジェクト

groovy:000> str3 = str1
===> This is a String
groovy:000> str3.hashCode()
===> 682948772

↑代入しても同じオブジェクト

groovy:000> str1 = "This is another string"
===> This is another string
groovy:000> str1.hashCode()
===> 612531362
groovy:000> str2.hashCode()
===> 682948772
groovy:000> str3.hashCode()
===> 682948772

↑str1を変更すると、str1のオブジェクトが変わる。str2、str3は変更されない。

groovy:000> println str1
This is another string
===> null
groovy:000> println str2
This is a String
===> null
groovy:000> println str3
This is a String
===> null

↑Stringの中身。str1は変わってるけど、str2、str3は変わらない。

groovy:000> str1 == str2
===> false
groovy:000> str1 == str3
===> false
groovy:000> str1.equals(str2)
===> false
groovy:000> str1.equals(str3)
===> false

↑比較。falseになる。



ちなみにclone()メソッドを使うと

groovy:000> str4 = str1.clone()
ERROR java.lang.CloneNotSupportedException: java.lang.String
        at groovysh_evaluate.run (groovysh_evaluate:2)
        ...

↑CloneNotSupportedExceptionになる。