为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡说叔叔 2019-06-19 11:25:01
表达式“新字符串(…)”的目的是什么?在爪哇?在查看在线代码示例时,我有时会遇到通过使用新运算符将字符串常量赋值给String对象的情况。例如:String s;...s = new String("Hello World");当然,与s = "Hello World";我不熟悉这个语法,也不知道它的目的或效果。由于字符串常量通常存储在常量池中,然后以JVM用于处理字符串常量的任何表示形式存储,那么堆中甚至会分配任何内容吗?
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

你可能需要的地方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是不可变的。

突出的一段是“论点的副本”。;它没有说“参数字符串和支持该字符串的底层字符数组的副本”。

请注意,请将程序编写到文献资料而不是 实施.


查看完整回答
反对 回复 2019-06-19
?
jeck猫

TA贡献1909条经验 获得超7个赞

我发现这种方法唯一有用的地方是声明锁变量:

private final String lock = new String("Database lock");....synchronized(lock){
    // do something}

在本例中,Eclipse等调试工具将在列出线程当前持有或正在等待的锁时显示字符串。您必须使用“新字符串”,即分配一个新的字符串对象,因为否则共享字符串文本可能会锁定在其他一些无关的代码中。


查看完整回答
反对 回复 2019-06-19
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

字符串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在堆中的不同位置创建)


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 404 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号