为什么String类是这样设计的?

时间:2011-09-14 14:55:50

标签: java jvm jls

为什么String类的设计方式是这个类的实例是汇集的还是不可变的?

谢谢&问候, Vidyakar Sharma。

5 个答案:

答案 0 :(得分:6)

字符串对象通常不是 - 只有字符串常量通过实习自动合并。 (当然,您可以手动调用intern,甚至可以通过HashSet<String>等创建自己的池。)这只是安全的,因为字符串是不可变的 - 并且它是有意义的确保任何编译时常量只在内存中出现一次。

您不希望为系统中的每个字符串支付在实习池中查找字符串(或永久保留它)的价格,因为可能有许多不同的字符串时间。但是,从类中加载的字符串常量只要这些类就会存在,并且通过实例一次,可以减少GC流失所需的内存。

答案 1 :(得分:3)

如果String不是不可变的,你将无法

  • 安全地从getter返回String字段而不破坏封装,因为调用者可能会修改背后的字符串内容
  • 在线程之间共享一个String,因为某些线程可能会修改其内容。必须同步对String的所有访问。
  • 使用字符串作为HashMaps / TreeMaps中的键,因为有人可能会更改其值并因此更改其hashCode /比较顺序
  • 汇集字符串以便拥有相同常量字符串的单个实例
  • 让子字符串共享其字符串
  • 的相同char数组

简而言之,生活会变得复杂得多,因为你必须在任何地方制作字符串的防御性副本,而StackOverflow会充斥着关于某些字符串存储在地图中却无法找到的细微错误的问题了。

答案 2 :(得分:2)

An Immutable object是存在的最佳设计决策之一。它旨在简化并发编程。共享对象的线程不会相互干扰。

如果您想要可变字符串,请查看:StringBufferStringBuilder

答案 3 :(得分:1)

for mutable strings check out:来自java.lang的StringBuffer和StringBuilder。

答案 4 :(得分:0)

汇集以避免出现代表相同的重复对象。

可以更容易分享。