2
A
回答
0
汇集以避免重复表示相同的对象。
不可变使分享更容易。
6
字符串对象不是通常仅合并字符串常量通过实习自动合并。 (您可以手动调用intern
的过程中,甚至通过HashSet<String>
等创建自己的池)这是唯一安全的因为字符串是不可变的 - 这是有道理的,以确保任何编译时间常数只在内存中出现一次。
你不会愿意支付的查找在实习生池的字符串(或保持它撒手人寰)为每字符串中的系统的价格,因为有可能会随着时间的推移许多不同的字符串。然而,从类加载的字符串常量只要这些类一直存在,并且通过将它们内联一次,您可以减少GC流失所需的内存。
+0
@Downvoter:小心评论? –
2
An Immutable object是存在的最佳设计决策之一。它旨在简化并发编程。共享对象的线程不能相互干扰。
如果你想可变字符串检查:StringBuffer和StringBuilder
3
如果字符串是不是一成不变的,你将无法
- 安全地从一个getter返回一个字符串字段不破坏封装,因为调用者可能会修改背后的字符串的内容以在线程之间共享字符串,因为某些线程可能会修改其内容。所有对字符串的访问都必须进行同步。
- 使用字符串作为包含HashMap /树状键,因为有人可能会改变其价值,因此其的hashCode /比较顺序
- 汇集字符串,以具有相同的常量字符串的单个实例
- 有串共享其串相同的字符数组
总之,生活会复杂得多,因为你将不得不作出的字符串的防守拷贝无处不在,StackOverflow上会提供关于微妙的错误,其中一些问题被淹没字符串存储在地图中,但无法找到。
1
可变字符串检出:java.lang中的StringBuffer和StringBuilder。
相关问题
- 1. 这是什么样的设计模式?
- 2. JDK的概念,为什么它是这样的设计
- 3. 为什么String类是final?
- 4. 为什么std :: string的空rep是这样的?
- 5. 为什么总是这样?
- 6. 这是为什么这样做呢?
- 7. 这是为什么这样工作?
- 8. 这个例子是什么样的Java设计模型?
- 9. 这是什么样的网络程序设计语言? <!-- -->
- 10. 这是什么类型(Swift)? var something = [(item1:String,item2:Float,item3:[String])]()
- 11. 为什么String是一个类?
- 12. 为什么可空类型的行为是这样
- 13. 为什么输出是这样的?
- 14. 为什么IE8不是这样的JS?
- 15. 为什么输出是这样的?
- 16. 什么是String类内部?
- 17. 什么是String类型
- 18. 为什么golang文件结构设计这样
- 19. 为什么UNIX时间(2)系统调用是这样设计的?
- 20. 这是什么样的HTML?
- 21. 这是什么样的? - Java
- 22. 为什么像concat这样的String方法创建一个新的String对象?
- 23. 设计这样
- 24. 为什么这样去代码输出是这样的?
- 25. 为什么数组的类型是这样的?
- 26. 这些角色是什么,他们为什么这样渲染?
- 27. 这是什么JS设计模式?
- 28. 这是什么设计模式?
- 29. 设计模式 - 这是什么模式?
- 30. 这是什么设计模式?
为了防止缓冲区过载,如在C.这个想法源于LISP –