我真的很困惑字符串池
在这种情况下将创建多少个对象
String a=new String("Hi"); //1
String b=new String("Hi"); //2
String c="hi"; //3
如果在第2和第3个字符串的情况下正在创建一个对象,那么为什么它在(a == b)....
的情况下返回FALSE答案 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。