gpt4 book ai didi

java - 为什么 javax.sql 包中的类使用 new String(str)?

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:27 26 4
gpt4 key购买 nike

javax.sql 包中的许多类都使用new String(str) 构造函数。例如:

public void setCatalogName(int columnIndex, String catalogName) throws SQLException {
checkColRange(columnIndex);
if (catalogName != null)
colInfo[columnIndex].catName = new String(catalogName);
else
colInfo[columnIndex].catName = new String("");
}

或者

public void setUsername(String name) {
if(name == null)
{
username = null;
} else {
username = new String(name);
}
}

还有更多:

javax.sql.rowset.serial.SerialStruct.SerialStruct(SQLData, Map>) javax.sql.rowset.serial.SerialStruct.SerialStruct(Struct, Map>) javax.sql.rowset.RowSetMetaDataImpl.setCatalogName(int, String) javax.sql.rowset.RowSetMetaDataImpl.setColumnLabel(int, String) javax.sql.rowset.RowSetMetaDataImpl.setColumnName(int, String) javax.sql.rowset.RowSetMetaDataImpl.setColumnTypeName(int, String) javax.sql.rowset.BaseRowSet.setCommand(String) javax.sql.rowset.BaseRowSet.setDataSourceName(String) java.text.DateFormatSymbols.setLocalPatternChars(String) javax.sql.rowset.BaseRowSet.setNull(int, int, String)

这样做的目的是什么?这不是在堆上创建不必要的字符串实例吗?

最佳答案

它们可能会防止“大字符串的一小部分”问题:

String x = getHugeStringFromSomewhere();
String y = x.substring(0, 5);
foo(y);

现在假设 y 引用的字符串仍然是必需的,但 x 不是。因为 y 指的是原始 char[],所以您最终会得到占用大量内存的那个小字符串。

如果您改为创建新字符串,则复制数据:

String x = getHugeStringFromSomewhere();
String y = new String(x.substring(0, 5));
foo(y);

...然后与原始字符串关联的底层大字符数组可以与字符串同时被垃圾回收。

我发现这在从大型文本文件(例如字典中的单词)中读取大量细小行时会产生巨大差异。 IIRC,BufferedReader.readLine 创建一个 80 个字符的缓冲区,因此每个字符串返回至少一个 80 个字符的 char[],即使它只有 5 个字符长。这一切加起来......(根据评论,显然这在 Java 1.5 中对 readLine 进行了更改 - 但 substring 仍然以相同的方式工作。)

编辑:当然这仍然只是对原因的猜测,它绝对不能解释 new String("") 部分...

关于java - 为什么 javax.sql 包中的类使用 new String(str)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11870354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com