身为大神的你知道为什么java要把字符串设计成不可变的嘛!

Mr_Smile2014 Mr_Smile2014     2022-07-30     683

关键词:

String是Java中一个不可变的类,他一旦被实例化就无法被修改。不可变类的实例一旦创建,其成员变量的值就不能被修改,不可变类有很多优势。 这些大家都知道,那大家知道为什么JAVA的设计者要把它设计成一个不可变的类嘛, 下面讲给大家进行讲解。


字符串池

字符串池是方法区中的一部分特殊存储。当一个字符串被被创建的时候,首先会去这个字符串池中查找,如果找到,直接返回对该字符串的引用。

下面的代码只会在堆中创建一个字符串

String string1 = "abcd";
String string2 = "abcd";


下面是图示:



如果字符串可变的话,当两个引用指向指向同一个字符串时,对其中一个做修改就会影响另外一个。(请记住该影响,有助于理解后面的内容)


缓存Hashcode

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

在String类中,有以下代码:

private int hash;//this is used to cache hash code.


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


使其他类的使用更加便利

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

HashSet<String> set = new HashSet<String>();
set.add(new String("a"));
set.add(new String("b"));
set.add(new String("c"));
 
for(String a: set)
    a.value = "a";


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


安全性


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

代码示例:

boolean connect(string s){
    if (!isSecure(s)) { 
throw new SecurityException(); 
}
    //如果s在该操作之前被其他的引用所改变,那么就可能导致问题。   
    causeProblem(s);
}


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

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

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


转载于:http://www.importnew.com/18326.html

java的string为什么要设计成不可变类(代码片段)

...个不可变类,也即是在对象创建之后不可进行修改。为什么Java的String需要设计成不可变的呢?我们需要修改字符串时还得在新建一个String对象,这多耗费性能跟空间呀。本质原因字符串池的存在字符串池&# 查看详情

java示例代码_如果使用`数组,则将字符串转换回字符串[]。首先要把它转换成那样

java示例代码_如果使用`数组,则将字符串转换回字符串[]。首先要把它转换成那样 查看详情

身为项目经理的你,如何才能稳居宝座?

一、充实自己  1.知识。项目管理是一门广泛而科学的学科,需要大量的管理知识作为基础。最有名的PMBOK,全称正是《项目管理知识体系指南》,因此,PMBOK是全面介绍了项目管理所涉及的知识,分为10个方面,成为10大知识... 查看详情

java,特殊类型json字符串转换成对象

...接能获取到A和B的值补充下还得先判断test是否是特殊json字符串,是的情况下才去转成对象跪求大神帮忙写下JSON与java互转的开源库有很多GsonXStreamJSONObject等都是轻松实现实现对象与JSON字符串互转的你这个需求很简单以下就是代... 查看详情

你所不知道的日志异步落库

...志异步落库,俨然已经是高并发环节中不可缺少的一环。为什么说是高并发环节中不可缺少的呢?原因在于,如果直接用mq进行日志落库的时候,低并发下,生产端生产数据,然后由消费端异步落库,是没有什么问题的,而且性... 查看详情

java求大神帮忙写下如何将map或者list转换成javabean

...rrayList<map>();map.put("a",6);map.put("b","字符串");map.put("c",1.02);ls.add(map);如何将ls或者map转换成javabeanprivateinta;privateStringb;privatedoublec;publicintgetA()returna;publicvoidsetA(inta)this.a=a;...目的:不想方法与方法直... 查看详情

在java中string类为什么要设计成final?string真的不可变吗?其他基本类型的包装类也是不可变的吗?

最近突然被问到String为什么被设计为不可变,当时有点懵,这个问题一直像bug一样存在,竟然没有发现,没有思考到,在此总结一下。1.String的不可变String类被final修饰,是不可继承和修改的。当一个String变量被第二次赋值时,... 查看详情

整理!这10款pc端软件,设计师必备!

相信有很多人都很羡慕那些设计大神能够做出杰出的设计,但你知不知道那些大神是用什么软件做出来的呢?下面介绍的这10款软件都是设计大神钟爱的,仔细看一看,总有一款适合你。1.CorelDRAWCorelDRAW是一个矢量... 查看详情

javastring为什么是不可变类,stringbuffer与stringbuilder区别(代码片段)

熟悉Java的都知道String类是不可变,但String类为什么设计成不可变类,如何做到不可变没有仔细想过。String为什么设计成不可变类?1.符合Java字符串池的设计方式。   Strings1="abc";Strings2="abc";   Java... 查看详情

java字符串转16进制数组

可不可以把比如字符串"55010100AAFF69"转成十六进制0x55,0x01,0x01,0x00,0x00,0xAA,0xFF,0x69,后放入Byte数组...可以用toCharArray转换成char数组然后就简单了....需要注意的是byte的取值范围是带负数的所以大于128的数都会出错.......追问是... 查看详情

java中常用的集合—初学者的你不可错过的精编整理(代码片段)

集合一直都是项目中非常常见的,我是一个Android开发者,集合对于我来说,在项目中使用的次数非常之多,因为使用的多,熟能生巧,所以这里呢!就给那些初学者整理一下Java当中常用的集合吧!   因为此篇文章是... 查看详情

阿里面试这样问:redis为什么把简单的字符串设计成sds?(代码片段)

2021开工第一天,就有小伙伴私信我,还给我分享了一道他面阿里的redis题(这家伙绝比已经拿到年终奖了),我看了以后觉得挺有意思,题目很简单,是那种典型的似懂非懂,常常容易被大家忽略的问题。这里整理出来分享一下... 查看详情

平时的你vs面试的你

...速和同事打成一片!大概一个礼拜就可以了!" 问题:为什么离开上一家公司?平时的你:唉,薪水怎么这么低,我都呆了几年了,怎么还这么低!面试的你:我觉得在上一家公司遇到了瓶颈,技术无法得到提升。而我恰巧是一... 查看详情

如何学习c++(多问几个为什么)

...:https://coolshell.cn/articles/4119.html"一定要学会思考,思考为什么要这样,而不是那样。还要举一反三地思考。"今天读了陈皓老师的blog,如何学好C++语言,其中谈到不仅要看大量的书,也谈到学习中要多问几个问什么?摘取一小段... 查看详情

❤️身为在软件测试摸爬滚打多年工程师的感悟,写给正在迷茫的你❤️

互联网高速发展,随着科技的进步有一些岗位薪资出现了垫底的情况比如:生产制造、客服、行政等岗位。也有一些岗位薪资有了大幅度的增长:营销/运营、研发/开发,以及IT相关的岗位。那么对于一个应届毕业... 查看详情

java的string对象不能改变?

...publicStringBuilder()super(2);我是面试的时候给问到,String数据为什么不能修改,我该怎么回答好??publicfinalclassString说String不参改变是指它的定义,是final的,不能被继承,方法不能被重写。不是说这个对象的引用不可改变。追问那... 查看详情

java非法字符uff09

java非法字符uff09请教各位大神,为什么?参考技术A你的main函数的回括号是中文全角的。需要改成英文半角。追问string后面那个吗?追答学会读编译错误信息。出错字符位置会在下方用一个小尖箭头^标记。追问感谢大神那个c怎... 查看详情

请教java大神一行代码:“<?extendst>”的用法是啥?

...感谢大神的过目!!小弟,在线等!!参考技术A不明白为什么转成二维数组,这样字符串长度必须固定。如果固定长度实现比较容易。Strings="abcdefghj";char[]c=s.toCharArray();String[][]ss=newString[3][3];intt=0;for(inti=0;i<3;i++)for(intn=0... 查看详情