Java:对于不可变字符串的思考

不可变字符串


最近一直在学习Java的相关知识,看到不可变字符串这一知识点,乍一看有些难以理解。通过一些思考以及资料的整理,在此博客对这一知识点加以概括。
  1. 字符串
  2. 不可变字符串
  3. 不可变的优势

1.字符串

在Java中String是一个类,其对象被存储在StringPool中,StringPool是堆内存中一块特殊的存储区域。当我们为一个引用变量赋字符串对象x时,会查找StringPool中是否存在x,若已经存在,则不必再开辟新的内存空间,直接指向x,即共享对象。若不存在,则开辟一块新的内存并且初始化x,再将引用变量指向x。例如:

String a="White";
String b="White";
String c="Black";

这里的引用变量a和b指向的是堆内存中的同一个对象,值为“White”,二者共享此对象。而引用变量c则重新创建了一个字符串对象,值为“Black”。

2.不可变字符串

一个String 对象的内容是不可变(immutable)的,当你对String 进行修改, 其实他是创建了新的字符串对象,然后将它的引用赋值给了原来的引用变量,这样原来的对象就再也不能访问了,因为他之前的引用已经弃他而去指向了新的字符串对象。他只能等着JVM(Java虚拟机)的自动回收。例如:

String a="White";
a="Black";

这里执行第二条语句的时候,并不是把a的值从“White”改成了“Black”,而是重新创建了一个String对象,值为“Black”,再把它的引用赋给引用变量a,原来值为“White”的对象没有被其他引用变量引用,最后会被JVM回收。
  还有一种情况,如下:

String a="White";  
String b=new String("White");  
String c="White";  

这里a和c指向同一个String对象,而b和a、c的创建方式不同,所以b和a、c指向的是不同对象,尽管他们的content相同。
  可以看出String对象只能被创建或被回收,其值是不能被改变的,因此称为不可变字符串。

3.不可变字符串的优势

Java面试题中有个非常常见的问题就是“什么是不可变对象”,它有什么好处,在什么情况下使用,或者更具体些,Java的String类为什么要设成immutable类型?
  事实上,相对于可变对象,不可变对象的优势主要在于:
(1)不可变对象可以提高String Pool的效率。由于String对象是不可变的,当我们操作这个对象时,就不必再引用这个对象本身,而只需引用它的地址即可。通常一个地址所占内存较小,因此操作起来效率就高。
(2)不可变对象对于多线程是安全的。在多线程同时进行的情况下,一个可变对象的值如果发生了改变,同时此对象又是被其他进程共享的,就会发生不可预知的错误,而不可变对象则可以很好的避免这个问题。
(3)StringPool的需要。StringPool中存放了许多String对象,其中就会存在多个引用变量引用同一个对象的情况。如果该对象是可变的,将会导致其他共享此对象的引用变量的对象值也会发生改变,也会引起一些不可预期的问题。
(4)允许String对象缓存HashCode。Java中String对象的哈希码被频繁地使用, 字符串不变性保证了hash码的唯一性,因此可以放心地进行缓存.这也是一种性能优化手段,意味着不必每次都去计算新的哈希码。
(5)不可变对象可以保证安全性。如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,所以安全,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。

不骄才能师人之长,而自成其学。 --------------谭嗣同


本文所涉及的链接并非自己所写,仅供大家学习和参考。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容