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的数组(我们在帮助文档里面也可以找到 -->),当然,这只是默认的大小,我们可以直接指定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给的提示,应该都没有问题。
如有不对或者不妥之处,欢迎大家留言提醒,非常感谢您的帮助。