So where does the object holding "Hello" go
所提到的“你好”,海峡,被赋予新的价值,所以参考价值“你好”丢失,但它仍然在池中,可用,垃圾收集器可以收集并从中删除堆,我们不知道确切,让您还在用未来的代码说“你好”字符串
String againhello= "Hello" ;
在这种情况下
然后,垃圾收集器不应该收集起来,因为,“你好”字符串创建并仍然再次使用,只有新的参考已分配。
的可变性和对象的不变性背后的概念是,任何两个物体是否有相同的价值,应该有相同的hashCode和equals方法应该返回true,则此举行真正的String对象,而是以提高性能
他们成立String作为不可改变的,因为他们不想要堆到充满同样的价值和不同的对象的数量,例如,让说
String sre="Hello";
String str="Hello";
如果没有字符串的不变性,那么就会出现两个物体在堆中,但只有一个对象,这里只有两个引用变量。
what is difference between String and StringBuilder class.
StringBuilder类已经在Java 5中添加并在对字符串每次修改,没有新的对象被创建使用StringBuilder的是现在的好处提供的StringBuffer的类似的功能(即..可变的字符串),其相对更快因为StringBuffer是一个同步类,而StringBuilder不是,所以如果你想在不担心线程安全的环境中使用StringBuffer,可以考虑使用StringBuilder来获得更好的性能。
默认情况下,所有Java类都是可变的,即它们的实例的内容可以修改。但是不变性提供的优势很少(http://download.oracle.com/javase/tutorial/essential/concurrency/immutable.html),这就是为什么有些类通过将它们标记为final而成为不可变的原因。有问题的类是String和Wrapper类,如果你从逻辑上思考它们(任何不可变类),那么提供的链接中的描述就会开始有意义。让我们解决各两个分开的:
String class:
正如凯西Siera和贝尔·贝茨在433 SCJP页提到,作为应用的增长,其很常见的有很多冗余的某个程序的字符串文字。因此,为了解决这个问题,Java的设计者提出了字符串池的概念,通过有效利用可用内存来提高性能。但是现在,正如你可能想象的那样,如果几个引用变量在不知道它的情况下引用相同的字符串,那么如果它们中的任何一个都可以改变字符串的值,那将是不好的。因此,出现了使这个String类不可变的需要。
Wrapper classes:
一个使包装类的目标是提供一种机制,以治疗与用于对象保留,像被添加到集合,或从与对象返回值的方法返回活动原语。如果你考虑一个集合,通常情况是它被多个线程访问。如果包装类不是可变的,它将面临并发修改的风险,从而导致不一致的状态。因此,为了避免冲突,包装类是不可变的。
因此,一般来说,每当遇到一个不可变类时,想到其并发使用的实例是合乎逻辑的。另外,如果您不希望修改对象内容(其中一个原因是并发访问),那么使该类不可变。
很好的问题! – anshulkatta
不可变对象不具有仅状态值。 – vemv