与字符串文字相比,字符串对象的优点是什么

kak*_*aka 7 java

我想知道在哪里使用字符串对象(在我的java代码中的哪种情况).好吧,我理解diff btwn字符串文字和字符串对象,但我想知道,因为java给了我们制作字符串对象的能力,必须有一些原因,在某些时候字符串对象的创建会很有用.所以我想知道在哪种情况下我们可以选择字符串对象来代替字符串文字.

Pas*_*ent 6

在大多数情况下,您应该使用String文字来避免创建不必要的对象.这实际上是第5项:避免创建有效Java的不必要对象:

第5项:避免创建不必要的对象

通常适合重用单个对象,而不是每次需要时创建一个新的功能等效对象.重复使用可以更快,更时尚.如果一个对象是不可变的,那么它总是可以被重用(第15项).作为不该做的极端例子,请考虑以下声明:

String s = new String("stringette"); // DON'T DO THIS!
Run Code Online (Sandbox Code Playgroud)

该语句在String 每次执行时都会创建一个新实例,并且这些对象创建都不是必需的.String构造函数("stringette")的参数本身就是一个String实例,在功能上与构造函数创建的所有对象完全相同.如果在循环或频繁调用的方法中发生此用法,则可以不必要地创建数百万个String实例.改进版本简单如下:

String s = "stringette";
Run Code Online (Sandbox Code Playgroud)

此版本使用单个String 实例,而不是每次执行时都创建一个新实例.此外,保证对象将被同一虚拟机中运行的任何其他代码重用,恰好包含相同的字符串文字[JLS,3.10.5]

但是,有一种情况需要使用new String(String)构造函数:当您想强制子字符串复制到新的基础字符数组时,如:

String tiny = new String(huge.substring(0, 10));
Run Code Online (Sandbox Code Playgroud)

这将允许GC回收char[]原始hugeString 的大底层.

  • @Sujee使用`tiny = huge.substring(0,10)`,`tiny`将使用**相同的**`char []`而不是`huge`.使用`String tiny = new String(huge.substring(0,10))`,`tiny`将使用一个新的(较小的)`char []`,允许大的回收.检查来源以获取详细信息. (3认同)

Boz*_*zho 4

如果您知道字符串是什么,请不要使用新对象。 String例如:

String str = new String("foo"); // don't do this
Run Code Online (Sandbox Code Playgroud)

因此,您创建了一个不必要的对象 - 一旦您String从文字创建了一个对象,然后您创建了另一个对象,并将第一个对象作为构造函数参数。