表达式“新字符串(…)”的目的是什么?在爪哇?

表达式“新字符串(…)”的目的是什么?在爪哇?

在查看在线代码示例时,我有时会遇到通过使用新运算符将字符串常量赋值给String对象的情况。

例如:

String s;...s = new String("Hello World");

当然,与

s = "Hello World";

我不熟悉这个语法,也不知道它的目的或效果。由于字符串常量通常存储在常量池中,然后以JVM用于处理字符串常量的任何表示形式存储,那么堆中甚至会分配任何内容吗?


胡说叔叔
浏览 405回答 3
3回答

鸿蒙传说

你可能需要的地方new String(String)强制子字符串复制到新的基础字符数组,如small=new String(huge.substring(10,20))然而,不幸的是,这种行为是无文档化的,并且依赖于实现。当我将大型文件(有些高达20 MIB)读入字符串并在事实发生后将其刻在行中时,我就被这种情况烧死了。最后,我得到了引用char[]的所有字符串,这些字符串由整个文件组成。不幸的是,在我保留的几行代码中,无意中保留了对整个数组的引用,时间比处理文件的时间还要长-我被迫使用。new String()来解决这个问题。唯一与实现无关的方法是:small=new String(huge.substring(10,20).toCharArray());不幸的是,这个数组必须复制两次,一次是toCharArray()一次在字符串构造函数中。需要有一种有文档化的方法,通过复制现有字符串的字符或String(String)需要加以改进,以使它更加明确(其中有一个含义,但它相当模糊和开放的解释)。假定“医生”没有规定的错误针对不断出现的评论,请注意new String()曾:public String(String string) {     value = string.value;     offset = string.offset;     count = string.count;}没错,那里没有底层数组的副本。然而,它仍然符合(Java 7)字符串文档,因为它:初始化新创建的字符串对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。除非需要一个原始的显式副本,否则就没有必要使用这个构造函数,因为String是不可变的。突出的一段是“论点的副本”。弦;它没有说“参数字符串和支持该字符串的底层字符数组的副本”。请注意,请将程序编写到文献资料而不是一 实施.

jeck猫

我发现这种方法唯一有用的地方是声明锁变量:private final String lock = new String("Database lock");....synchronized(lock){     // do something}在本例中,Eclipse等调试工具将在列出线程当前持有或正在等待的锁时显示字符串。您必须使用“新字符串”,即分配一个新的字符串对象,因为否则共享字符串文本可能会锁定在其他一些无关的代码中。

一只甜甜圈

字符串S1=“foo”;文字将在StringPool中,S1将引用。字符串s2=“foo”;这一次,它将检查“foo”文字是否已经在StringPool中可用,因为它现在已经存在,因此S2将引用相同的文字。字符串S3=新字符串(“foo”);“foo”文字将首先在StringPool中创建,然后通过String Arg构造函数创建String对象,即由于通过新操作符创建对象而在堆中创建“foo”,然后S3将引用它。字符串S4=新字符串(“foo”);与S3相同所以System.out.println(S1=S2); //千真万确因为字面上的比较。和System.out.println(S3=S4);// 假的由于对象比较(S3和S4在堆中的不同位置创建)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java