
Javaには擬似プリミティブ型なるものがあると、今朝初めて知りました。どうやらStringにおける==
とequals()
の違い(下記コードを参照)を説明するのに使われるようです。
Java
1String a = "abc"; 2String b = "abc"; 3String c = new String("abc"); 4System.out.println(a == b); // true 5System.out.println(a == c); // false 6System.out.println(a.equals(b)); // true 7System.out.println(a.equals(c)); // true
調べるといくつかのサイトで上の動作の説明として擬似プリミティブ型という用語を使っています。
- http://javatechnology.net/java/if_string_equals/
- https://javayuri.wordpress.com/2010/10/12/javaequals%E3%81%A8%E3%81%AE%E9%81%95%E3%81%84%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
- http://hrastaman.blog92.fc2.com/blog-entry-6.html
- http://j2sdk.blog77.fc2.com/blog-entry-45.html
- http://piyopiyocs.blog115.fc2.com/blog-entry-598.html
- http://bugks.blog.fc2.com/blog-entry-9.html
fc2 blogの多さも気になるところですが、コレは単に「文字列リテラル(及び定数式)は以前作られたオブジェクトと同じであれば再利用されて同じオブジェクトになる」ということだけで説明が足りるのではないかと思っています。
参考: Java言語規定 字句文法#3.10.5 文字列リテラル
それに、擬似プリミティブ型を宣言するとか言っている記事もあり、普通のStringを代入はできない型になってしまうとでも言うのでしょうか。さらには参照値ではなく、文字列が直接変数に入れられるという説明をしているところまであります(JavaScriptの話ではないはずなんですが…)。言語仕様として擬似プリミティブ型なる用語が使われている所も見つけられませんでしたし、公式の用語なのかもよくわかりません。
そこで質問です。
擬似プリミティブ型はJavaの用語の一つであり、この擬似プリミティブ型を使った==
の説明は妥当であると言えるのでしょうか?
ここでの妥当であるとは、teratailの回答として採用すべきかどうかと言うことです。もし、妥当であるというのであれば、擬似プリミティブ型の定義とは何なのか?何が他と異なるのか?同じように再利用される場合があるオートボクシングされたプリミティブ型のラッパークラスも同じように擬似プリミティブ型と言うのか?リテラル(及び定数式)はオブジェクトが再利用されるという説明ではどのような不備がある、または、その説明よりも優れているというのか?そういった点を教えて欲しいです。また、Oracles(旧Sun)の公式資料があるというのであれば、ぜひ紹介してください。
あと、擬似なのか疑似なのかも気になる所なので、どっちが良いかもあわせて答えてくれたら嬉しいです。
参考質問
Java - String型の比較について
Java - [==]と[equals]の挙動の違いを確認したい。
回答5件
あなたの回答
tips
プレビュー