JVM中的字符串池

时间:2013-06-10 06:47:54

标签: java string

我真的很困惑字符串池

在这种情况下将创建多少个对象

String a=new String("Hi"); //1
String b=new String("Hi"); //2
String c="hi"; //3

如果在第2和第3个字符串的情况下正在创建一个对象,那么为什么它在(a == b)....

的情况下返回FALSE

4 个答案:

答案 0 :(得分:4)

  

为什么它在(a == b)

的情况下返回FALSE

因为您正在使用new String因此获取String的新对象引用。

请注意,将代码更改为

String a = "Hi"; //1
String b = "Hi"; //2

System.out.println(a == b);打印true

进一步说明:The String Pool

答案 1 :(得分:2)

在Java中,对于非基本类型,==运算符会比较引用,而不是值。

如果您创建了一堆等效的字符串文字,例如:

String sLit1 = "test";
String sLit2 = "test";

(sLit1 == sLit2)将是true,因为Java没有为每个新的字符串文字分配新的内存,它只是将它们全部指向内存中的相同位置。但是,在创建String对象时:

String sObj = new String("test") 

Java始终会创建一个新对象,它占用内存中的新位置。因此sLit1 == sObj始终为false

这意味着当且仅当两个参数引用同一个对象时==才会产生true。要比较字符串,请使用equals方法,如(sObj.equals(sLit1))

答案 2 :(得分:1)

它不是一个对象,您正在使用new关键字创建字符串,因此jvm在Heap中创建这些字符串,因此两个对象的地址都不同。

并且==检查对象解决了为什么它返回false的原因。

并且在String c =“hi”的情况下;

这不是使用new创建的,因此这些文字在String池中创建。并且jvm对这些文字有实习过程。

如果还有一个字符串d =“hi”;然后c == d将返回true。

答案 3 :(得分:0)

在这里,

String c = "Hi"; 

将在String文字池中创建字符串文字,这是为java中的字符串文字提供的单独内存。 当你写

String c = "Hi";
String d = "Hi";

它们将引用字符串常量池中的相同文字。 和==运算符检查参考变量引用相同的对象

因此,c == d将返回true。