每次我使用String时,它是否会创建一个新的String对象?

时间:2014-07-11 19:13:35

标签: java string hashmap

假设我需要从Java哈希映射中迭代检索相同键的值。

  for(int i=0; i<INTEGER.MAX; i++)   
          map.get("KEY");

在这种情况下,每次调用map.get(“KEY”)时都会创建“KEY”字符串吗?我想知道是否总是更好地拥有一个String常量,或者无关紧要。

3 个答案:

答案 0 :(得分:4)

没有。字符串常量是自动实现的,因此任何相同的字符串文字都引用内存中的同一个对象。

有关此问题的更多信息:http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3

这方面的一个例子:

String s1 = "Test";
String s2 = "Test";
String s3 = new String("Test");
s1 == s2;//Evaluates to true, because they are the same object (both created with string literals)
s1 == s3;//Evaluates to false, because they are different objects containing identical data

答案 1 :(得分:2)

是/否答案取决于您如何创建字符串对象。以下是我现在能想到的四种情景。

是案例

  1. new String()始终创建新的Object。这不是你的实习 不能从记忆中取回来。
  2. 连接(“a”+“b”)始终会创建新的String对象,而不是     实习。
  3. 无案例

    1. 字符串a =“aa”; 如果已经可以从池中检索,则当它不可用时,它会创建一个也被实习的新对象。
    2. new String()。intern()或“aa”.intern();如果已经可用它从池中检索,当它不可用时,它会创建新的对象 也是实习生。

答案 2 :(得分:1)

  

是&#34; KEY&#34;每次调用map.get(&#34; KEY&#34;)时都会创建字符串?

没有

Java Strings是不可变的,它允许Java编译器对所有字符串文字使用单个实例。 即:程序中所有相同的字符串文字都将引用单个字符串对象。

在极少数情况下,您需要将相同的字符串包装在两个单独的对象中,您必须明确指出 实例化一个String对象:

String s1 = "bla";
String s2 = "bla";
// s1 == s2 
String s3 = new String ("bla");
// s1 != s3