我想知道在哪里使用字符串对象(在我的java代码中的哪个场景)。 好吧,我理解diff btwn字符串文字和字符串对象,但我想知道,因为java给了我们制作字符串对象的能力,必须有一些原因,在某些时候字符串对象的创建会很有用。所以我想知道在哪种情况下我们可以选择字符串对象来代替字符串文字。
答案 0 :(得分:6)
在大多数情况下,您应该使用String文字来避免创建不必要的对象。这实际上是第5项:避免创建有效Java的不必要的对象:
第5项:避免创建不必要的对象
重复使用通常是合适的 单个对象而不是创建一个 新的功能等同对象 每次需要时。重用可以 更快更时尚。一个 如果是,对象总是可以重用 不可变的(第15项)。作为极端 考虑什么不做的例子 这句话:
String s = new String("stringette"); // DON'T DO THIS!
该语句创建一个新的
String
实例每次执行时,和 这些对象创作都不是 必要。 String的参数 构造函数("stringette"
)本身就是一个 字符串实例,功能上 与所有对象相同 由构造函数创建。如果这 用法发生在循环或循环中 经常被调用的方法,数百万 可以创建字符串实例 不必要的。改进版是 只需以下内容:String s = "stringette";
此版本使用单个
String
例如,而不是创建一个新的 每次执行一次。 此外,它保证了 对象将被任何其他对象重用 代码在同一个虚拟机中运行 恰好包含机器的机器 相同的字符串文字[JLS,3.10.5]
但是有一种情况需要使用new String(String)
构造函数:当你想强制子字符串复制到新的基础字符数组时,如:
String tiny = new String(huge.substring(0, 10));
这将允许GC回收原始char[]
字符串中的大底层huge
。
答案 1 :(得分:4)
如果您知道字符串是什么,请不要使用 new String
对象。例如:
String str = new String("foo"); // don't do this
因此,您创建了一个不必要的对象 - 一旦您从文字中创建了一个String
对象,然后再创建另一个,将第一个作为构造函数参数。
答案 2 :(得分:2)
与您的问题相反,与String字面值相比,使用String对象存在DISADVANTAGE。
当声明字符串文字String s = "foo"
时,编译器将检查堆上现有的“foo”对象并将“s”分配给已存在的“foo”。
但是,如果创建一个String对象String s = new String("foo")
,将在堆上创建一个全新的对象(即使已经存在“foo”)。字符串是不可变的,这是完全没必要的。
这是一个很好的参考:http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html
答案 3 :(得分:2)
String a = "ABC";
String b = new String("ABC");
String c = "ABC";
a == b // false
a == c // true
a.equals(b) // true
a.equals(c) // true
重点是& c指向相同的“ABC”对象(JVM魔术)。使用“new String”每次都会创建一个新对象。 IMO,使用字符串对象是一个缺点,而不是一个优点。但是,正如另一张海报所说,字符串对象对于转换byte [],char [],StringBuffer非常有用 - 如果你需要这样做的话。
答案 4 :(得分:1)
字符串文字被转换为String对象,正如其他人指出的那样,创建显式的String对象是不必要的和不可靠的,因为它会使String pooling失败。
但是,有一种情况需要显式创建新的字符串:如果只使用很长字符串的一小部分。 String.substring()
阻止原始String获取GC,因此您可以在编写
String s = new String(veryLongString.substring(1,3));
而不是
String s = veryLongString.substring(1,3);
答案 5 :(得分:0)
文字字符串是在字符串池中创建的对象,如果它们具有相同的值,则它们引用同一个对象。
System.out.println("abc"=="abc"); // the output is true
同时,字符串对象是内存中的真实对象,如果它们具有相同的值,则无法保证它们引用同一对象。
String a = new String("abc");
String b = new String("abc");
System.out.println(a==b); // the output is false