可能我们在学习工作中,会经常使用到这三个,但是我们是否真实的认识她们呢?我觉得未必!今天我们就看看她们的特性!
-
String类是项目开发中一定会用到的类,有如下特性:
1.每个字符串常量都属于一个String类的匿名对象,并不能修改
2.String 有两个常量池:静态常量池、运行时常量池
3.String 类对象实例化建议直接赋值的形式完成,这样可以直接将对象保存在对象池中方便下次重复使用 -
String 类最大的弊端:内容不允许修改,说这里大家可能想了,我平时经常修改字符串啊,完全是可以修改的,作者在这里胡说“霸道”,什么情况呢,让我们来看看......
String _name="大";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
changeName(_name);
Toast.makeText(this,_name,Toast.LENGTH_LONG).show();
}
private void changeName(String temp){
temp+="川";
}
String类运行图
- 看到这里,我们觉得“吐司”会弹出什么信息?“大川” or “大”?是的,吐出来的是“大”,字符串_name的内容根本没有改变,那么现在我们真的希望可以改变_name的内容,怎么办?StringBuffer了解一下:
StringBuffer并不像String类那样拥有两种实例化方式,StringBuffer必须像普通类那样首先进行对象的实例化,而后才可以调用其方法进行处理,
StringBuffer _strBF=new StringBuffer("大");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
changeName(_strBF);
Toast.makeText(this,_strBF.toString(),Toast.LENGTH_LONG).show();
}
private void changeName(StringBuffer temp){
temp.append("川");
}
StringBuffer类运行图
- 通过以上内容我们看到了,String类确实无法改变,然后有可以代替的StringBuffer类,那么StringBuilder又有什么用呢?看看源码我们发现,StringBuilder和StringBuffer的使用方法几乎是一样的!那为什么会存在两个一样的类呢?存在必有价值!一起看一下......
StringBuilder _strBD=new StringBuilder("大");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
changeName(_strBD);
Toast.makeText(this,_strBD.toString(),Toast.LENGTH_LONG).show();
}
private void changeName(StringBuilder temp){
temp.append("川");
}
源码分析:
-
StringBuffer其函数部分都是用了同步代码块的synchronized关键字
StringBuffer源码分析 -
StringBuilder 中只是普通的函数
StringBuilder 源码分析
终上所诉,我们得出了结论:
- String类是字符串的首选,内容不可修改
- StringBuffer和StringBuilder的内容可以修改
- StringBuffer是JDK1.0 提供的,属于线程安全,而StringBuilder是JDK1.5之后提供的,属于非线程安全。
网友评论