String和StringBuffer的区别及分析

  虽然有人说:String和StringBuffer的讨论已经是过去式了,StringBuilder和StringBuffer才是主流,不过对于我这样的菜鸟和一些好学者来说,知道一下也是一件好事。那我就不废话了。

  想要知道两者的区别,我们可以查看帮助文档,也可以直接到源代码里面去找。由于我使用的是eclipse,所以我就顺便把eclipse里面查看源代码的方法说一下:按下CTRL键,并将鼠标移到你想查看的那个类上面去(会发现那个单词下面出现了下划线),单击即可。如果并没有出现那个类的源文件,而是出现如下所示的界面出现的错误的界面,那就说明我们还没有关联文件,我们点击Attach Source按钮,选中下方的External location,文件夹(解压后)和文件(压缩文件)都可。现在,我们就可以直接进入源代码中查看了^_^

  String:正如我们所看见的-- String类型的存储,实际上是一个char数组,而且是一个长度不可变的数组(final修饰),大小固定,传进来多少就是多少。所以当我们使用String来拼接字符串的时候,代码性能会非常低,因为它在不断创建char数组(每次拼接的时候)的同时消耗了内存,以前所创建的成了垃圾。

  而StringBuffer呢?StringBuffer里面没有直接定义,不过我们可以到它的父类里面去查找,因为它继承了AbstractStringBuilder,而这个类中也定义了一个char数组,StringBuffer调用父类的方法,传进了一个长度为16的数组(我们在帮助文档里面也可以找到 -->java帮助文档中的内容),jdk中StringBuffer源文件当然,这只是默认的大小,我们可以直接指定StringBuffer的字符数组的长度(调用带初始容量的构造方法),如StringBuffer sb=new StringBuffer(100);在我们不指定其大小的时候,当我们所传入的字符串超过16的时候,它是如何扩展的呢?  请看下图动态扩展

 写到这儿,我突然想起来,String除了“+”,还有一个concat方法来连接字符串,我也把这个方法的代码贴上来

 

 

  剩下的就是StringBuffer的一些方法,这里我仅仅

 贴几张图片还有好多呢,具体的使用方法很简单,我就不具体介绍了。需要提一下的就是当使用第二个构造方法的时候,系统所构造的数组的长度为  传进来的字符串的长度加16

 

  下面是我在eclipse中做得一些小测试    

 1 public class StringBufferDemo {
 2 
 3     public static void main(String[] args) {
 4         String name="小啊不";
 5         String     mm = name.concat("gjei");  //concat方法的源代码见上面的图
 6 
 7         //默认创建一个大小为16的字符数组,也可以在括号里面指定大小
 8         StringBuffer sb=new StringBuffer();
 9         sb.append("此刻打盹,你将做梦;");
10         //append方法也可以这样使用
11         sb.append("此刻学习,你将圆梦。").append("hfsik");
12         sb.append("1234567890");
13         System.out.println(sb);
14         //注意:capacity()和length()这两个方法所返回的值未必相等哦,与其扩展方式有关
15         int a=sb.capacity();
16         int b=sb.length();
17         System.out.println(a);
18         System.out.println(b);
19         System.out.println(sb.charAt(5));
20         sb.delete(0, 10);//这里的方法是左闭右开的区间
21         System.out.println(sb);
22         sb.deleteCharAt(5);
23         System.out.println(sb);
24         boolean wm=sb.equals("4653.");
25         System.out.println(wm);
26         char[] ml= {'c','s','5','8'};
27         sb.getChars(0, 2, ml, 0);
28         System.out.println(sb);
29         //由此可知,getChars改变的时char数组,本身对StringBuffer不会产生影响
30         System.out.println(ml);
31         int c=sb.indexOf("62");//查询该字符串第一次出现的位置,对应的还有lastIndexOf()
32         System.out.println(c);
33         sb.insert(5,true);//插入,布尔型的也可以插入,就和插入true字符串差不多
34         System.out.println(sb);
35         sb.replace(0, 2, "神说");
36         System.out.println(sb);
37         sb.reverse();//字符串反转
38         System.out.println(sb);
39         sb.setCharAt(5, 'w');
40         System.out.println(sb);
41         String jie1=sb.substring(5);    
42         System.out.println(jie1);    
43         String jie2=sb.substring(5,8);
44         System.out.println(jie2);
45         
46         
47         //StringBuilder单线程访问时使用,效率更高,线程不安全
48         //StringBuffer:多线程访问时使用,效率更低,线程安全
49         StringBuilder sbd=new StringBuilder();
50     }
51 
52 }

 

  顺便插一句,因为append方法返回的是一个StringBuffer类型, 所以append方法这可以这么用:sb.append("fhndik").append("hbrsd").append("gs");

capacity()和length()这两个方法所返回的值未必相等哦,与其扩展方式有关。。。其实想要知道方法,只要按下 Alt+/ 然后再根据eclipse给的提示,应该都没有问题。

 

   如有不对或者不妥之处,欢迎大家留言提醒,非常感谢您的帮助。

posted @ 2014-04-12 18:33  老夫聊发少年狂  阅读(503)  评论(0编辑  收藏  举报