为什么字符串在Java中是不可变的?
来源:互联网 发布:好用的windows平板 编辑:程序博客网 时间:2024/06/04 18:52
这是一个古老但仍然流行的问题。Java中字符串被设计成不可变的,有多种原因。很好的答案取决于你对内存,同步,数据结构等更好的理解,下面,我总结一些答案。
1.String Pool中的要求
字符串池在方法区(Method Area)中是一种特殊的存储区域。当创建一个字符串时,如果字符串已经存在于池中,现有字符串的引用将被退回,而不是创建一个新的对象并返回其引用。
下面的代码将在堆中只会创建一个字符串对象。
String string1 = "abcd";String string2 = "abcd";
在堆中就是这样的:
如果字符串不是一成不变的,在只有一个引用下不断变化的字符串将导致对其他引用取得错误的值。
2.允许字符串来缓存其哈希码
在Java中字符串的哈希码常被用到。例如,在HashMap中不可变保证了哈希码将永远是相同的,因此,完全不用担心字符串的变化实现这个不可变的特性,这意味着,每次被用时没必要去计算其哈希码,所以,这更有效。
在String类,类中有如下代码:
private int hash;//this is used to cache hash code.
3.安全性
字符串为许多Java类被广泛用作参数,如网络连接,打开文件等,如果字符串是可变的,则连接,打开文件将会被改变并会导致严重的安全威胁。该方法还以为是连接到一台机器上,但事实并非如此。可变字符串在反射机制中同样能引起安全性问题,因为这些参数都是字符串。
下面是一段代码示例:
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面试中许多其他“为什么”问题。
原文:
Why string is immutable in Java ?
0 0
- 为什么字符串在Java中是不可变的?
- 为什么字符串在Java中是不可变的?
- 为什么String在Java中是不可变的
- 在java中,String为什么是不可变的类?
- 为什么在java中String是不可变的?
- 为什么Java字符串是不可变对象?
- 为什么Java字符串是不可变对象
- 为什么Java字符串是不可变对象?
- 为什么Java字符串是不可变对象?
- 为什么Java字符串是不可变对象?
- 为什么Java字符串是不可变对象?
- 为什么Java字符串是不可变对象?
- [细说Java](2)Java中字符串为什么是不可变的
- java中String为什么是不可变的?
- java中String为什么是不可变的
- 黑马程序员_为什么在java中String是不可变的?
- 为什么Java中字符串被设计成不可变的?
- 为什么Java中字符串被设计成不可变的?
- Android DownloadManager 的使用
- console.log是异步的吗?
- opencv 颜色识别
- NSNumberFormatter--数字的格式化
- 用内置工具Word列算式
- 为什么字符串在Java中是不可变的?
- 遍历二叉树
- 深入浅出游戏算法(3)-lua脚本(4)
- 带宽分配情况
- 【嵌入式】探究bootloader,分析u-boot源码
- centos安装UCSniff
- Chrome 二维码插件推荐——全能二维码
- linux TL-WN725N2.0 AP Raspberry Pi 无线网卡驱动 路由设置
- 好朋友,格力造