JAVA 中为什么String 是immutable的
本文翻译自:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/
这是一个很老但很流行的问题,这里有几个原因String在java中被设计成immutable的。对内存、同步、数据结构等有好的理解,能更好的回答这个问题。下面我将简单的介绍这些原因:
1, String Pool的需要。
String pool(String intern pool) 是一个方法区里的特殊的存储区域。当创建一个String, 如果它已经在pool中存在,则会返回一存在String的引用,相反,怎会创建一个新的String,并返回该引用。
下面的代码将仅仅在堆中创建一个String对象。
String string1 = "abcd";
String string2 = "abcd";
如图:
如果String不是immutable的,改变String的一个引用将导致另一个引用的到错误的值
2. 允许String缓存它的hashcode
String的hashcode在JAVA中是使用非常频繁的。例如在HashMapzhong, String设计成immutable保证了hashcode总是一样的,所以hashcode可以被缓存而不用担心改变。也就是说,不需要每次在使用hashcode时都去计算一遍,这样更高效。
在String类里,代码:
private int hash;//this is used to cache hash code.
3. 安全
String广泛的作为参数被JAVA中的类使用,比如 网络连接,打开的文件等等,如果String不是immutable,一个连接或文件的改变将导致严重的安全威胁,一个方法还以为正连接到一个机器上,并其实没有。可变的String同样将导致反射的安全性问题,因为反射中的参数都是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);
}
总之:原因包括设计、效率和安全。实际上,这三点也是JAVA面试中一些“为什么”的答案。
欢迎关注微信公众号:shoshana
最新文章
- 【原】javascript事件流
- C语言Hello world
- :eq(index)
- TCP建立连接和释放的过程,及TCP状态变迁图
- NAT的全然分析及其UDP穿透的全然解决方式
- Java自定义日志输出文件
- Ⅵ.spring的点点滴滴--自定义类型转换器
- Initializing Spring root WebApplicationContext
- Python之路,Day22 - 网站用户访问质量分析监测分析项目开发
- IntelliJ IDEA创建web项目及异常问题解决
- Repeater实现数据绑定
- VxWorks6.6 pcPentium BSP 使用说明(二):创建启动盘
- [整理]vimtutor章节小结
- iOS开发之*.a静态库注意事项
- ActiveMQ 入门
- LeetCode编程训练 - 滑动窗口(Sliding Window)
- 5.动态代理AOP实现-DynamicProxy模式
- github 搜索
- [Codeforces771E]Bear and Rectangle Strips
- OpenCV不同类型Mat的at方法访问元素时该如何确定模板函数的typename(转)
热门文章
- 数据结构实验之链表九:双向链表(SDUT 2054)
- OSI七层参考模型
- k8s应用01-----入门实例
- ActiveMQ的作用总结(应用场景及优势)以及springboot+activeMq 实战
- 怎么让mysql的id从0开始
- 004-Spring boot 快速入门-项目搭建与启动、SpringBootApplication、启动图标
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-07 断路器dashboard监控仪表
- docker数据管理(2)
- kettle转换和任务的基本使用
- Canal——原理架构及应用场景