我知道Immutable对象是无法修改的对象。但是当我们使用函数时,字符串可以被修改。那么我们怎么说字符串是不可变的?这是一个接受采访的问题。 Need asap为什么字符串在java中被称为immutable?
回答
但是在使用函数时可以修改字符串。
不,你回来的是不同字符串。例如:
String a, b, c;
a = "testing 1 2 3";
b = a.substring(0, 7); // Creates new string for `b`, does NOT modify `a`
c = a.substring(8);
System.out.println(b); // "testing"
System.out.println(c); // "1 2 3", proves that `a` was not modified when we created `b`
正如你所看到的,字符串"testing 1 2 3"
是不由substring
通话修改;相反,我们收到新的字符串,只有"testing"
。
String
对象是在Java中不变的,因为他们没有提供方法是修改现有String
对象的状态。他们仅提供基于现有内容的对象创建对象的新方法 String
。
(以上内容,当然,除非你与反思玩很调皮的游戏确实。)
谢谢你的信息。 – Nithya 2013-03-05 13:42:46
@Nithya:不客气! – 2013-03-05 13:43:54
我知道你说的是100%正确的,只需要在专家的话中多一点解释,a = a +“something”,现在,System.out.println(a); ,绝对是它的改变,请把你的专家解释到这个 – 2013-11-05 06:33:07
一件事是,当你创建一个字符串,内存块在分配给它堆,当你改变它的价值,是该字符串创建一个新的内存块,并且首先是创建一个内存块时,保持旧有资格进行垃圾回收,例如现在
String first = "xyz";
String second = "xyz";
second = "abc";
对于堆中的“第一”,对于“第二”新的空间不分配,因为它们指向sa因此第二点指向堆中的相同空间,最后当第二个值改变时它指向一个新的内存位置。因此,字符串是不可变的,因为它的内容永远不会改变..他们被删除,并分配新的内容... 使用dubugger,看看如何占用内存..并注意与原始数据类型相同的东西...有内容改变不是他们的记忆位置..
希望它有帮助!
原因1.字符串是java中的一个对象。因此,您无法随时更改。举例
String s= new String ("Md Omar Faroque");
s.concat("anik");
System.out.println(s);
输出结果为:“Md Omar Faroque”。
这是为什么?当您将“Anik”添加为“Md Omar Faroque”时,它会成为名为“Md Omar Faroque Anik”的新字符串。这个新的字符串没有被引用到任何新的变量。 S仍然是“Md Omar Faroque”的参考变量。
再举一个例子:
1. String s1 = "spring ";
2. String s2 = s1 + "summer ";
3. s1.concat("fall ");
4. s2.concat(s1);
5. s1 += "winter ";
6. System.out.println(s1 + " " + s2);
输出应该是 “春冬春夏”
这是为什么?在第5行中,s1成为一个新的字符串“春天的冬天”。它忘记了以前的价值“春天”。由于s1现在引用了“春天的冬天”,所以它已经打印了。
在第2行中,s2引用了“春夏”。所以它已经在第二行打印了,它再次和s1连接在一起,并创建了新的字符串“春夏之春”。但没有新的变量参考这个值“春夏季春”,仍然s2指向“春夏”。
public class Example{
public static void main(String[] args) {
String s = "hello";
String a = s;
if (a == s) {// it will print if part of statement
System.out.println("same reference");
} else {
System.out.println("not same reference");
}
s = "hi";// now we have change this 's'
if (a == s) { // if we have changed the same s reference the it should
// print same reference
System.out.println("same reference");
} else {
System.out.println("not same reference");// but it will printed
}
}
}
这里主要要注意的是,每当你改变或更新相同的刺新的内存块将被创建(创建一个新的参考)。 – 2015-06-14 18:30:15
- 1. 为什么java将字符串创建为IMMUTABLE CLASS?
- 2. 为什么字符串被称为“字符串”?
- 3. 为什么被称为“字符串”对数组不可见?
- 4. 为什么字符串存储在Java中的字符串池?
- 5. 为什么c字符串被释放?
- 6. 什么是字符串...对象被称为?
- 7. 为什么字符串在java中以空字符结尾?
- 8. 为什么字符或字符串被认为是在javascript中的falsy
- 9. 为什么Kotlin的字符串插值在Java中串联字符串?
- 10. 为什么字节[]被转换为字符串JSON视图
- 11. 为什么空字符串文字被视为true?
- 12. Javascript:为什么一个数字被视为一个字符串?
- 13. 为什么数字+字符串在JavaScript中的字符串?
- 14. 为什么在java中使用request.getParameter()时字符被损坏?
- 15. 为什么字符串[]被识别为只是一个字符串
- 16. 为什么在这里字符串字面不被禁用?
- 17. 使用字符串值作为函数的名称被称为
- 18. 为什么Java中的lambda表达式被称为“lambda”?
- 19. JQuery.each将字符串文字转换为字符串。为什么?
- 20. Django模板:为什么变量名称评估为字符串
- 21. 为什么字符串被指定为空(C#)的String.Empty?
- 22. 为什么普通字符串被认为是无缺陷的?
- 23. Angular UI Select2,为什么ng-model被设置为JSON字符串?
- 24. 字符串被分割为'list()'而不是'[]'为什么?
- 25. 为什么这些字符串被评估为不相等?
- 26. 为什么这个字符串不会被转换为DateTime?
- 27. 为什么这个字符串被转换为JQuery?
- 28. 为什么NULL被转换为字符串*?
- 29. Java:强制字符串名称被接受为一个类?
- 30. 为什么字符串a被附加到此代码中的字符串b
相似的文章在这里 - http://stackoverflow.com/questions/1552301/immutability-of-strings-in-java – mtk 2013-03-04 14:05:26