Java基础——为什么Java中的String设计成不可变的?
来源:互联网 发布:会员充值管理系统php 编辑:程序博客网 时间:2024/06/11 16:58
【申明:以下内容翻译自http://www.programcreek.com/java-tutorials/ , 欢迎转载,请勿用于商业用途】
欢迎阅读原文:Why string is immutable in Java ?
为什么Java中的String设计成不可变的? 这是一个老生常谈的问题了。在java中将String设计成不可变的原因有很多,然而一个好的答案取决于很好的理解java中的存储、同步、数据结构等等。一下是一些我总结的答案:
1、字符串池的需求
字符串池是方法区(Method Area)中的一块特殊的存储区域。当一个字符串已经被创建并且该字符串在 池 中,该字符串的引用会立即返回给变量,而不是重新创建一个字符串再将引用返回给变量。例如,以下代码只在堆中创建一个字符串对象:
String string1 = "abcd";String string2 = "abcd";他们看上去如下图:
如果字符串不是不可变的,那么改变一个引用(如: string2)的字符串将会导致另一个引用(如: string1)出现脏数据。
2、允许字符串缓存哈希码
在java中常常会用到字符串的哈希码,例如: HashMap 。String的不变性保证哈希码始终一,因此,他可以不用担心变化的出现。 这种方法意味着不必每次使用时都重新计算一次哈希码——这样,效率会高很多。
在String类中,有如下代码:
private int hash;//this is used to cache hash code.
3、安全
String广泛的用于java 类中的参数,如:网络连接(Network connetion),打开文件(opening files )等等。如果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基础——为什么Java中的String设计成不可变的?
- 为什么Java中的String设计成不可变的?
- JAVA基础之——为什么String要设计成不可变的?
- Java为什么把String设计成不可变的?
- Java中的String为什么是不可变的?—— String源码分析
- Java中的String为什么是不可变的? — String源码分析
- Java中的String为什么是不可变的? — String源码分析
- Java中的String为什么是不可变的?—String源码分析
- Java中的String为什么是不可变的?—String源码分析
- Java中的String字符串为什么不可变
- 关于Java中的String为什么不可变
- java基础问题--Java 中的 String 为什么是不可变的?
- 为什么Java的String设计为不可变的?
- 黑马程序员——Java 中的 String 为什么是不可变的?
- 干货 | Java 中的 String 为什么是不可变的?
- 为什么Java中的String是不可变的?
- Java中的String为什么是不可变的?
- Java中的String为什么是不可变的?
- C++中cout和printf在vc6.0中的区别
- UDP和TCP
- 装系统:制作U盘启动盘
- 配置yum的为163源方法
- 详解VMWare虚拟机的网络连接方式
- Java基础——为什么Java中的String设计成不可变的?
- 2013.12.08-开始的第一天
- Ubuntu下STC89C52RC开发环境搭建
- linux下redis安装配置及redis常用命令
- ubuntu下 wineqq2012安装与遇上的一些问题
- 口水文章4——ubuntu修改环境变量
- 正则表达式
- jdk1.7下载安装,及环境变量的配置
- 嵌入式学习之路(四)——使用vi编写c程序