在查看在线代码示例时,我有时会通过使用new运算符将String常量赋值给String对象.
例如:
String s;
...
s = new String("Hello World");
Run Code Online (Sandbox Code Playgroud)
当然,这与之相比
s = "Hello World";
Run Code Online (Sandbox Code Playgroud)
我不熟悉这种语法,也不知道目的或效果是什么.由于String常量通常存储在常量池中,然后以JVM处理String常量的任何表示形式存在,甚至还会在堆上分配任何内容?
我正在浏览String类API,看起来像substring方法导致潜在的内存泄漏,因为它与原始String共享相同的字符数组.
如果原始字符串很大,则子字符串返回的小字符串可以防止原始字符串(由大数组备份)从Java中的垃圾收集.
任何想法或我读错了API.
我一直以为如果我这样做String s = "Hello World".substring(0, 5),那么我就得到一个新的字符串s = "Hello".Java API文档中也记录了这一点:"返回一个新字符串,它是该字符串的子字符串".
但当我看到以下两个链接时,我开始怀疑.
Java中表达"new String(...)"的目的是什么?
基本上,他们说如果我使用String s = "Hello World".subString(0, 5),我仍然得到一个String,其中包含"Hello World"的char数组.
为什么?Java是否真的以这种方式实现了子串?为什么这样?为什么不返回一个全新的更短的子串?
假设我有一个字符串
msg = "hello"
Run Code Online (Sandbox Code Playgroud)
现在我得到来自字符串的子串msg状msg.substring(1,msg.length())
并将子字符串存储到msg.
所以msg指的是新的字符串.如果旧字符串也保留在java的缓冲区中,那么如何访问它?
我记得读过一篇可能在Bloch的Effective Java中的部分,它说大多数情况下,在哪里
String a = "fish";
String b = "fish";
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,a == b因为字符串是不可变的.但是由于临时构造对象或其他一些东西,新的String("fish")会产生一个独特的对象引用.
我通过Bloch章节了解了equals(),不变性和对象创建,但是找不到这一点我记得!! 撕掉我的头发,有没有人记得这是什么原因的描述?它甚至可能不在EJ中,但我想找到它.提示:这解释的是我的实际问题.
我知道字符串(至少在Java中)是不可变的.我不是要清空字符串的内容.
如果我这样做,我会用这个: output.setText( outputString );
我的问题是:如果你想通过放弃存储字符串的位来最小化程序所需的空间量,有没有办法做到这一点?