Java基础之String类

为什么String类不可变

一直知道String类是不可变,之前对于不可变类的理解就是类的对象的状态不可变。

如String str = “abc”;这里的str仅仅是String类型对象的一个引用,这个引用完全是可以改变的。但是对象本身(就是在堆中的那块区域的字符串内容)是不能改变的。

今天突然想到为什么String是不可变的。
从一般意义上来看:我们日常使用的字符串而言,较多时直接使用,或者稍微拼接、裁剪。大量连续改动是较少的情况。
1. 对于后者,需要连续改动,这种明显是可变的。可变的就有线程安全(同步)问题。这种其实就是StringBuffer。我们反射加载类或者数据库连接池都是通过String来定位的,这时安全问题非常重要。
2. 对于前者,完全可以将其定为不可变的变量。这样就避免了线程同步带来的消耗。但是有时我们使用字符串没有达到使用stringBuffer的程度。但是可能也需要对字符串做些改动。由于是String是不可变的,自然在此过程中,会产生一些过渡变量。这是不可避免的,但是我们可以做些优化.

由于大部分时候字符串不需太多改动,我们可以在建立String的时候在常量池进行检查,保证某一字符串在常量池只有一份。这也就是String interning
同时由于String的不变性,我们可以直接将String的hashcode计算出来,然后再string搞一个相关的成员变量,这样可以方便其他的类使用。比如hashMap

String创建了几次的问题

这个问题一直在争论,其中涉及到jdk版本,问题的准确描述(创建了几个string对象,“xx”有几份。。),还有很多因素,创建形式 String str = new String(“”);或者 String str = new String(“”);
实在是乱,大概就是常量池一份,如果new 堆中一份(new时如果池中有直接复制,没有创建再复制),

String、StringBuffer、StringBuilder

String劣势:不可变 优势:安全
StringBuffer 优势:可变 还想要安全,这必然是要付出代价的,线程同步的代价
StringBuilder 最简单 索引不要安全,这样最高效,但是有风险
功能都提供了,就看应用者的选择

参考文章

http://www.importnew.com/7440.html
http://www.hollischuang.com/archives/1246
http://wiki.jikexueyuan.com/project/java-interview-bible/string-array.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值