专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java基础学习:java字符型定义不可变

Java基础学习:java字符型定义不可变

更新时间:2020-04-02 16:16:02 来源:动力节点 浏览1759次


  字符串,想必大家最熟悉不过了,通常我们在代码中有几种方式可以创建字符串,比如:String s = "Hollis";这时,其实会在堆内存中创建一个字符串对象,其中保存了一个字符数组,该数组中保存了字符串的内容。


Java基础学习:java字符型定义不可变


  上面的箭头可以理解为“存储他的引用”。


  当我们在代码中连续创建两个相同的字符串的时候,其实会指向同一个对象。因为当一个字符串被被创建的时候,首先会去这个字符串池中查找,如果找到,直接返回对该字符串的引用。


Java基础学习:java字符型定义不可变


Java基础学习:java字符型定义不可变


  但是,如果在程序中明确声明要新创建一个字符串的话是可以在堆上重新创建一个对象的。如String s = new String("Hollis")


Java基础学习:java字符型定义不可变

Java基础学习:java字符型定义不可变


  接着,我们来看两个字符串中常用的操作:截取和连接会发生什么,是在原来的字符串对象上修改还是重新创建字符串呢?


  字符串的连接。如String s1 = s.concat("Chuang");


Java基础学习:java字符型定义不可变

  字符串的截取。如String s1 = s.substring(0,2);


Java基础学习:java字符型定义不可变

  从上图中我们可以得到一个结论,那就是——字符串是不可变的,无论发生什么操作,一个已经创建好的字符串的内容不会被改变,对它的任何类似修改的操作其实都是新生成了一个字符串对象。


  那么,为什么要定义出不可变对象呢?


  缓存Hashcode


  Java中经常会用到字符串的哈希码(hashcode)。例如,在HashMap中,字符串的不可变能保证其hashcode永远保持一致,这样就可以避免一些不必要的麻烦。这也就意味着每次在使用一个字符串的hashcode的时候不用重新计算一次,这样更加高效。


  在String类中,有以下代码:private int hash;


  以上代码中hash变量中就保存了一个String对象的hashcode,因为String类不可变,所以一旦对象被创建,该hash值也无法改变。所以,每次想要使用该对象的hashcode的时候,直接返回即可。


  使其他类的使用更加便利


  在介绍这个内容之前,先看以下代码:


Java基础学习:java字符型定义不可变

  在上面的例子中,如果字符串可以被改变,那么以上用法将有可能违反Set的设计原则,因为Set要求其中的元素不可以重复。上面的代码只是为了简单说明该问题,其实String类中并没有value这个字段值。


  安全性


  String被广泛的使用在其他Java类中充当参数。比如网络连接、打开文件等操作。如果字符串可变,那么类似操作可能导致安全问题。因为某个方法在调用连接操作的时候,他认为会连接到某台机器,但是实际上并没有(其他引用同一String对象的值修改会导致该连接中的字符串内容被修改)。可变的字符串也可能导致反射的安全问题,因为他的参数也是字符串。


Java基础学习:java字符型定义不可变


  不可变对象天生就是线程安全的


  因为不可变对象不能被改变,所以他们可以自由地在多个线程之间共享。不需要任何同步处理。


  总之,String被设计成不可变的主要目的是为了安全和高效。所以,使String是一个不可变类是一个很好的设计。


  以上就是动力节点java培训机构的小编针对“Java基础学习:java字符型定义不可变”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>