java中new string()_Java中的表达式“new String(…)”的用途是什么?

本文讨论了在Java中复制String对象的几种方式及其潜在的问题。特别是当从大文件中读取并分割字符串时,如何避免不必要的内存占用。文章还提到了String(String)构造函数的行为,并提出了一种虽然低效但实现不可知的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

您可能需要新的String(String)的一个地方是强制子字符串复制到一个新的底层字符数组,如

small=new String(huge.substring(10,20))

然而,这种行为是不幸的是没有记录和实现依赖。

我读到大文件(一些高达20 MiB)成一个字符串,并将其刻成线后,事实已被烧毁了。我结束了引用包含整个文件的char []的行的所有字符串。不幸的是,无意中保持了对整个数组的引用,我持有的几行比处理文件更长的时间 – 我被迫使用新的String()来解决它。

唯一的实现不可知的方法是:

small=new String(huge.substring(10,20).toCharArray());

这不幸的是必须复制数组两次,一次forCharArray()和一次在String构造函数。

需要有一个文档化的方式来通过复制一个现有的字符串来获得一个新的字符串;或String(String)的文档需要改进,使其更加明确(有一个暗示,但它是相当模糊和开放解释)。

假设文件不陈述的缺陷

回应意见,进来,观察Apache Harmony实现新的String()是什么:

public String(String string) {

value = string.value;

offset = string.offset;

count = string.count;

}

没错,没有底层数组的副本。但是,它仍然符合(Java 7)String文档,因为它:

Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string. Unless an explicit copy of original is needed, use of this constructor is unnecessary since Strings are immutable.

显着片是“参数字符串的副本”;它不会说“参数字符串的副本和支持字符串的底层字符数组”。

小心你编程文档而不是一个实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值