问:下面两行代码执行完成后,原始的 String 对象中的内容到底变了没有?
String str = "Hello";
str = str + " world!”;
答:没有。因为 java 中的 String 是被设计成不可变类的,所以它的所有对象都是不可变的。在上面那段代码中,str 首先指向一个 String 对象,内容是 "Hello",接着我们对 str 进行了 + 操作,这时 str 不会再指向原来那个对象,而是指向了另一个 String 对象,其内容为 "Hello world!",原来那个对象还存在于内存之中,只是 str 这个引用变量不再指向它了。
所以,如果我们需要经常对字符串进行修改,使用 String 来代表字符串一般会引起比较大的内存开销。因为 String 对象一旦创建后就不能再改变,所以对于每一个不同的字符串都需要一个新的 String 对象来表示。这种情况下我们应该使用 StrinBuffer 或者 StringBuilder 类。
此外,对于字符串常量,如果内容相同,Java 会认为它们代表的是同一个 String 对象。而用关键字 new 调用构造器,无论内容是否相同,总是会创建一个新的对象。
网友评论