Simple Java—Strings and Arrays(三)为什么String被设计成了不可变型
来源:互联网 发布:js实现bind 编辑:程序博客网 时间:2024/06/05 07:18
Translate from Simple java
为什么String被设计成了不可变型?
1. 字符串池的需要
String string1 = "abcd";String string2 = "abcd";
如果字符串是可变的,那通过一个引用改变字符串的值将会导致另外一个引用有了错误的值
2. hashcode的缓存化
String的hashcode经常被使用,例如,HashMap的key值。String的不可变性保证了hashcode一直是相同的,这样可以方便把String的hashcode放在缓存中而不用担心它的改变。这意味着,不用每次使用它时都计算它的hashcode,这是一个非常效率的做法
3. 方便其他对象使用
为了更具体的表现,思考一下下面的问题:
HashSet<String> set = new HashSet<String>();set.add(new String("a"));set.add(new String("b"));set.add(new String("c"));for(String a: set) a.value = "a";
在这个例子中,如果String是可变的,它的值可以改变,那set的设计(不包含重复的元素)将被违反。
4. 安全
String作为形参被广泛的运用在许多java类中,像网络连接,打开文件。如果String可变,一个连接或者文件可以被改变将导致严重的线程安全问题。下面是代码实例:
boolean connect(string s){ if (!isSecure(s)) { throw new SecurityException(); } //here will cause problem, if s is changed before this by using other references. causeProblem(s);}
5. 不可变的对象天然线程安全
因为不可变的对象不能够被改变,它们能被多个线程自由的共享。这减少了synchronization的使用。
总之,String被设计成不可变是为了效率和安全的目的。这也是为什么不可变对象在通常使用中被偏爱的原因
0 0
- Simple Java—Strings and Arrays(三)为什么String被设计成了不可变型
- Simple Java—Strings and Arrays(一)String是引用传值吗?
- Simple Java—Strings and Arrays(四)从length和length()开始谈Java
- Simple Java—Strings and Arrays(六)Java中的null值是什么?
- Simple Java—Strings and Arrays(二)substring()在jdk6和jdk7中的不同
- Simple Java—Strings and Arrays(五)如何在java中有效率的检查一个数组中是否有某值?
- Java中String为什么被设计成immutable(不可修改的)/final
- 为什么Java中的String设计成不可变的?
- Java为什么把String设计成不可变的?
- Java基础——为什么Java中的String设计成不可变的?
- JAVA基础之——为什么String要设计成不可变的?
- 为什么String被设计为不可变
- 为什么Java的String设计为不可变的?
- String的内存模型,为什么String被设计成不可变的
- 为什么Java中字符串被设计成不可变的?
- 为什么Java中字符串被设计成不可变的?
- java中String类为什么要设计成不可变的
- 【String】为什么 Java 要把字符串设计成不可变的
- 使用gitbook制作电子书
- Swift 框架搭建篇
- 基于spark的实时流数据需跟历史数据进行对比时所遇到的问题
- HTTP 错误 500.19- Internal Server Error 错误解决方法
- pixhawk学习笔记
- Simple Java—Strings and Arrays(三)为什么String被设计成了不可变型
- Error: must call SetScrollSizes() or SetScaleToFitSize()问题的解决
- iOS-如何在工程内添加pch预编译头文件
- 知识库
- hdoj 5052 Yaoge’s maximum profit 【树链剖分】
- Android 学习笔记(一)(客户端、服务器socket通信教程)
- Uva 1395
- MySQL Proxy
- pixhawk-----mavlink