Java String为什么是不可变类,StringBuffer与StringBuilder区别
2016-03-10 15:15
621 查看
熟悉Java的都知道String类是不可变,但String类为什么设计成不可变类,如何做到不可变没有仔细想过。
2.安全性。
JDK提供的众多API当中,大多的参数都是String类型,如类加载函数,数据库的连接,Sql语句,Socket的参数等。如果String类可以被修改就会造成安全漏洞。而且多线程情况下,String类数据也可以保护数据不被其他线程修改。
(其实String类并不是不能修改,可以通过java的反射机制,获取到string对象的class对象修改)
StringBuffer和StringBuilder
StringBUffer和StringBuilder都是可变的字符串类,StringBuffer和StringBuilder类的区别也在于StringBuffer是线程安全的,很多方法都有synchronized关键字,如下代码。StringBuilder不是线程安全的,所以一般情况下StringBuilder的性能要好。
String为什么设计成不可变类?
1.Java字符串池的设计方式。String s1="abc"; String s2="abc";Java通过字符串池的设计方式节省内存空间,如上面一段代码只会生成一个对象放在常量池当中。s1和s2都指向这个对象,如果String类可变,通过s1这个引用就可以修改这个对象,那其他引用就会受影响。
2.安全性。
JDK提供的众多API当中,大多的参数都是String类型,如类加载函数,数据库的连接,Sql语句,Socket的参数等。如果String类可以被修改就会造成安全漏洞。而且多线程情况下,String类数据也可以保护数据不被其他线程修改。
String怎么实现不可变?
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[];从String类的源码中可以看到,String是通过char value[]保存字符的。而且声明为private final,不提供我们访问value的接口。所以String类不可以修改。
(其实String类并不是不能修改,可以通过java的反射机制,获取到string对象的class对象修改)
StringBuffer和StringBuilder
StringBUffer和StringBuilder都是可变的字符串类,StringBuffer和StringBuilder类的区别也在于StringBuffer是线程安全的,很多方法都有synchronized关键字,如下代码。StringBuilder不是线程安全的,所以一般情况下StringBuilder的性能要好。
//StringBuffer类的源码 public synchronized void ensureCapacity(int minimumCapacity) { if (minimumCapacity > value.length) { expandCapacity(minimumCapacity); } } /** * @since 1.5 */ public synchronized void trimToSize() { super.trimToSize(); } /** * @throws IndexOutOfBoundsException {@inheritDoc} * @see #length() */ public synchronized void setLength(int newLength) { super.setLength(newLength); } /** * @throws IndexOutOfBoundsException {@inheritDoc} * @see #length() */ public synchronized char charAt(int index) { if ((index < 0) || (index >= count)) throw new StringIndexOutOfBoundsException(index); return value[index]; }
相关文章推荐
- 《Administrator's Guide》之Managing Memory
- fastcgi_finish_request
- 序列sequence中的cache问题
- 交互设计的三大隐形机制:加载、刷新和缓存
- java中Queue的使用
- 基于modern ui for wpf的在线公开课平台 之二 创建我的modern ui程序
- 关于简单动画
- 开发错误记录3:问题 Error:failed to find Build Tools revision 23.0.2
- MathJax basic tutorial and quick reference
- (四) WebService-- SOAP UI 工具使用
- 太原UI设计师及web前端师郭文军讲网页中网格布局思路?
- JPA之@GeneratedValue注解
- Xcode 的蛋疼---描述文件出错
- arduino实验日记
- StringBuffer与StringBuilder的区别
- ios海哥开发笔记 (海哥原创,UILocalNotification本地通知的设置以及iOS9通知新特性 )
- TF/IDF(term frequency/inverse document frequency)
- <学习笔记> require模块(省市区下拉控件)
- NGUI具有流光效果的UISprite
- 《iOS Human Interface Guidelines》——Activity