--支持你成为受人尊重的专业人才
武汉北大青鸟 > 学员专区 > 学习园地 > 在Java中String被设计成不可变的原因

在Java中String被设计成不可变的原因

2017-11-29 14:12:35   来源:武汉北大青鸟光谷校区
导语:在学习java的过程中,我们都知道String是不可变的,那么大家想过没有为什么要这样设计?String设计成不可变得原因是什么?小编这就给大家解密。
  在 Java 中将 String 设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑。在下文中,将为各种原因做一个小结。
 
  1字符串常量池的需要
 
  字符串常量池( String pool, String intern pool, String 保留池)
 
  是 Java 堆内存中一个特殊的存储区域,当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。
 
  如下面的代码所示,将会在堆内存中只创建一个实际 String 对象。
 
  String string1 = “abcd”;
 
  String string2 = “abcd”;
 
  示意图如下所示:
 
 
 
  假若字符串对象允许改变,那么将会导致各种逻辑错误,比如改变一个对象会影响到另一个独立对象。
 
  严格来说,这种常量池的思想,是一种优化手段。
 
  请思考:假若代码如下所示,s1 和 s2 还会指向同一个实际的 String 对象吗?
 
 
 
  也许这个问题违反新手的直觉,但是考虑到现代编译器会进行常规的优化,所以他们都会指向常量池中的同一个对象。
 
  或者,你可以用 jd-gui 之类的工具查看一下编译后的 class 文件。
 
  2允许 String 对象缓存 HashCode
 
  Java 中 String 对象的哈希码被频繁地使用,比如在 hashMap 等容器中。
 
  字符串不变性保证了 hash 码的唯一性,因此可以放心地进行缓存。
 
  这也是一种性能优化手段,意味着不必每次都去计算新的哈希码……
 
  在 String 类的定义中有如下代码:
 
 
 
  3安全性
 
  String 被许多的 Java 类(库)用来当做参数。
 
  例如:网络连接地址URL,文件路径path,还有反射机制所需要的 String 参数等,。
 
  假如 String 不是固定不变的,将会引起各种安全隐患。
 
  假如有如下的代码:
 
 
  写到这里大家基本都清楚了为什么java中String被设计成不可变的原因了吧。我们在学习java的过程中,不仅仅要知道其实际的应用,同时还要明白其设计原理和各种基础知识,这样才能走的更远,更能在职场中变得更优秀。

  小编推荐

  Web前端就业的学习路线一览
  
Web前端面试经常遇到的几个问题
  Java企业面试题之Java高并发综合
点击在线咨询
相关文章
.怎么样学习c语言 这4步曲不要错过

c语言是非常老非常经典的一门语言,很多机程序都是用c语言编写的,应该要怎么样的学习c语言呢?有这四个步骤。只要沉浸下心来学习,就一定可以成为大神的,祝愿大家在成为大神的路上狂奔。

2018-03-20 10:15:54

.自学web前端看什么书

对web前端非常感兴趣的小伙伴,很多都会选择自学,但是自学需要非常大的毅力。小编来给大家介绍自学web前端需要看什么书,希望能够帮助大家在web前端的发展道路上更上一层楼。

2018-02-27 10:34:05

.自学java怎么入门 需要多久

有很多对计算机感兴趣的学员都选择了自学java编程,当然自学是需要很强的毅力的,小编来给大家解答自学java需要多久,应该要怎么入门,一起来看看吧!

2018-02-27 09:57:59

.Java代码编写规范一览

java代码的规范性怎么写呢小编来给大家介绍,要养成好的习惯,写规范的代码,写出来的代码不仅要自己看的懂,还要别人能懂,Java代码编写规范一览快来看看吧!

2018-02-24 12:21:55

.2018年学Java是否有前途

目前最流行的编程语言要数java了,java编程语言的应用范围之广,兼容性之强没有任何语言可以比拟。可以肯定得说,在非常长的一段时间以内,java编程依然强势,依然非常有前景。

2018-02-24 11:51:20