fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. /* Name of the class has to be "Main" only if the class is public. */
  8. class Ideone
  9. {
  10. static class Foo
  11. {
  12. private static String str = "abcd";
  13. static String getAbcdOfFoo() {
  14. return str;
  15. }
  16. }
  17.  
  18. static String getAbcd() {
  19. return "abcd";
  20. }
  21.  
  22. public static void main (String[] args) throws java.lang.Exception
  23. {
  24. // your code goes here
  25.  
  26. String a = "abcd";
  27. String b = "abcd";
  28. String c = new String("abcd");
  29. String d = "a" + ("b" + "c") + "d";
  30. String e = "ab";
  31. String f = "cd";
  32. String g = e + "cd";
  33. String h = e + f;
  34. String i = Ideone.getAbcd();
  35. String j = Ideone.Foo.getAbcdOfFoo();
  36. String k = Bar.getAbcdOfBar();
  37. String l = (new Baz()).getAbcdOfBaz();
  38. String m = "a".concat("bcd");
  39. String n, o;
  40. String p = (n = "ab") + (o = "cd");
  41. String q = "ab"; q += "cd";
  42.  
  43. b = b.intern();
  44. c = c.intern();
  45. d = d.intern();
  46. e = e.intern();
  47. f = f.intern();
  48. g = g.intern();
  49. h = h.intern();
  50. i = i.intern();
  51. j = j.intern();
  52. k = k.intern();
  53. l = l.intern();
  54. m = m.intern();
  55. n = n.intern();
  56. o = o.intern();
  57. p = p.intern();
  58. q = q.intern();
  59.  
  60. System.out.println("== operator");
  61. System.out.println("a = \"abcd\"");
  62. System.out.println("a == b -> " + (a == b) + "\t // b = \"abcd\"; b = b.intern();");
  63. System.out.println("a == c -> " + (a == c) + "\t // c = new String(\"abcd\"); c = c.intern();");
  64. System.out.println("a == d -> " + (a == d) + "\t // d = \"a\" + (\"b\" + \"c\") + \"d\"; d = d.intern();");
  65. System.out.println("a == g -> " + (a == g) + "\t // e = \"ab\"; g = e + \"cd\"; g = g.intern();");
  66. System.out.println("a == h -> " + (a == h) + "\t // f = \"cd\"; h = e + f; h = h.intern();");
  67. System.out.println("a == i -> " + (a == i) + "\t // i = Ideone.getAbcd(); i = i.intern();");
  68. System.out.println("a == j -> " + (a == j) + "\t // j = Ideone.Foo.getAbcdOfFoo(); j = j.intern();");
  69. System.out.println("a == k -> " + (a == k) + "\t // k = Bar.getAbcdOfBar(); k = k.intern();");
  70. System.out.println("a == l -> " + (a == l) + "\t // l = (new Baz()).getAbcdOfBaz(); l = l.intern();");
  71. System.out.println("a == m -> " + (a == m) + "\t // m = \"a\".concat(\"bcd\"); m = m.intern();");
  72. System.out.println("a == p -> " + (a == p) + "\t // p = (n = \"ab\") + (o = \"cd\"); p = p.intern();");
  73. System.out.println("a == q -> " + (a == q) + "\t // q = \"ab\"; q += \"cd\"; q = q.intern();");
  74.  
  75.  
  76. }
  77. }
  78.  
  79. class Bar
  80. {
  81. private static String str = "abcd";
  82. static String getAbcdOfBar() {
  83. return str;
  84. }
  85. }
  86.  
  87. class Baz
  88. {
  89. private String str;
  90. Baz() {
  91. str = "abcd";
  92. }
  93. String getAbcdOfBaz() {
  94. return str;
  95. }
  96. }
Success #stdin #stdout 0.07s 380224KB
stdin
Stringクラスのinternメソッドと使ったらどうなるか?

internメソッドは同一文字列をひとつの共通インスタンスとして管理したいときに使うメソッドだ
リテラル文字列は全てinternメソッドによってStringクラスの内部で共通インスタンスとして管理されている(プールされている)
internメソッドを呼び出すと
internメソッドを呼び出したインスタンスと同一の文字列をもつ共通インスタンスが存在する場合、その共通インスタンスを返してくれる
また、同一文字列の共通インスタンスがない場合、internメソッドを呼び出したインスタンスを共通インスタンスとして新しく登録してくれるのだ

String a = "abcd";
String c = new String("abcd");
ここまでは a と c は別のインスタンスだが
c = c.intern();
とすることによって c には a と同一のインスタンスが代入され a == c が true になる


同一の文字列を変数や配列・コレクション等に大量に長期保持する必要がある場合はinternメソッドでメモリの節約になるかもしれない
stdout
== operator
a = "abcd"
a == b -> true	 // b = "abcd"; b = b.intern();
a == c -> true	 // c = new String("abcd"); c = c.intern();
a == d -> true	 // d = "a" + ("b" + "c") + "d"; d = d.intern();
a == g -> true	 // e = "ab"; g = e + "cd"; g = g.intern();
a == h -> true	 // f = "cd"; h = e + f; h = h.intern();
a == i -> true	 // i = Ideone.getAbcd(); i = i.intern();
a == j -> true	 // j = Ideone.Foo.getAbcdOfFoo(); j = j.intern();
a == k -> true	 // k = Bar.getAbcdOfBar(); k = k.intern();
a == l -> true	 // l = (new Baz()).getAbcdOfBaz(); l = l.intern();
a == m -> true	 // m = "a".concat("bcd"); m = m.intern();
a == p -> true	 // p = (n = "ab") + (o = "cd"); p = p.intern();
a == q -> true	 // q = "ab"; q += "cd"; q = q.intern();