下面这两种说法有什么不同?
String s = "text";
String s = new String("text");
下面这两种说法有什么不同?
String s = "text";
String s = new String("text");
当前回答
尽管从程序员的角度来看,它们看起来是一样的,但它对性能有很大的影响。你几乎总是想用第一种形式。
其他回答
String str = new String("hello")
它将检查字符串常量池是否已经包含字符串“hello”? 如果存在,则不会在String常量池中添加条目。如果不存在,它将在String常量池中添加一个条目。
对象将在堆内存区域中创建,str引用指向在堆内存位置中创建的对象。
如果你想要str引用String常量池中包含的点对象,则必须显式调用str.intern();
String str = "world";
它将检查字符串常量池是否已经包含字符串“hello”? 如果存在,则不会在String常量池中添加条目。如果不存在,它将在String常量池中添加一个条目。
在上述两种情况下,str引用指向常量池中存在的字符串“world”。
尽管从程序员的角度来看,它们看起来是一样的,但它对性能有很大的影响。你几乎总是想用第一种形式。
@Braj:我想你已经提到了另一种方式。如果我错了,请指正
逐行创建对象:
字符串 str1 = new String(“java5”)
Pool- "java5" (1 Object)
Heap - str1 => "java5" (1 Object)
String str2 = "java5"
pool- str2 => "java5" (1 Object)
heap - str1 => "java5" (1 Object)
字符串 str3 = 新字符串(str2)
pool- str2 => "java5" (1 Object)
heap- str1 => "java5", str3 => "java5" (2 Objects)
String str4 = "java5"
pool - str2 => str4 => "java5" (1 Object)
heap - str1 => "java5", str3 => "java5" (2 Objects)
当您将字符串存储为
String string1 = "Hello";
然后JVM在称为String常量池的单独内存块中创建一个具有给定价格的String对象。
当我们有尝试生成另一个String的倾向时
String string2 = "Hello";
JVM验证String常量池中是否存在价格恒定的String对象,如果存在,JVM不会创建一个全新的对象,而是将现有对象的引用赋值给新变量。
当我们存储String为
String string = new String("Hello");
使用new关键字,不管String常量池的内容是什么,都会生成一个具有给定价格的全新对象。
把“bla”想象成一个魔法工厂,就像Strings.createString(“bla”)(pseudo)。工厂保存了所有以这种方式创建的字符串池。
如果它被调用,它会检查池中是否已经有这个值的字符串。如果为真,则返回此string对象,因此以这种方式获得的字符串确实是同一个对象。
如果不是,它在内部创建一个新的字符串对象,将其保存在池中,然后返回它。因此,当下次查询相同的字符串值时,它将返回相同的实例。
手动创建新的String("")通过绕过字符串字面量池来覆盖这种行为。因此,应该始终使用equals()检查相等性,它比较字符序列,而不是对象引用相等性。