近几天再看面试题,发现之间的基础知识有很多都叫不准,模棱两可,所以想将一些基础知识总结起来,也是再巩固一遍。希望在秋招的时候能够有一个理想的工作。
关于三者的区别,大致分为两个方面
1.执行速度方面
String<StringBuffer<StringBuilder
原因如下:我们都知道String为字符串常量,是不可变的量,但是我们会常常看到如下的情况
String a="abc";
a=a+"def";
System.out.println(a);//结果为abcdef
在这里我们看到String类型的a发生了改变,那为什么说字符串常量是不可变的量呢,其实这是一种假象,String类型的a其实并没有发生改变,jvm在执行这段代码的时候,首先创建对象a,赋值为abc,然后再创建一个新的对象a用来执行第二行代码,所以原来的对象a并没有发生改变,因此可以说String类型是不可改变的对象,由于jm的这种机制,String修改字符串时,实际时不断地创建新的对象,原来的对象就会变成垃圾,被垃圾回收机制(GC)回收。所以String的执行速度很慢,效率很低。
内存分析图
而StringBuffer与StringBuilder则不同,他们是字符串变量,可以改变,当我们应他们对字符串进行操作的时候,实际上是对一个对象进行改变,不用像String那样重新创建对象,然后再进行操作,这样就节省了时间,大大提高了效率。
另外,有时会出现这种情况
String str="abc"+"def";
StringBuilder stringBuilder=new StringBuilder().append("abc").append("def");
System.out.println(str);
System.out.println(stringBuilder.toString());
这样输出结果也是“abcdef”和“abcdef”,但是String的速度却比StringBuilder(StringBuffer同理)的反应速度要快很多,其实,这是jvm的一个把戏
String str = “abc” + “ def”;
其实就是:
String str = “abcdeft”;
所以不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,譬如:
String str2 = “abc”;
String str3 = “ def”;
String str1 = str2 +str3 + str4;
这时候JVM会规规矩矩的按照原来的方式去做,不断的创建、回收对象。速度就会很慢
2.线程安全方面
StringBuffer和StringBuilder在用法上基本上是相同的,不同的地方在于,StringBuffer是线程安全的,可用在多线程中,而
StringBuilder是非线程安全的,只能用在单线程中,这是因为StringBuilder中的所有方法都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
总结: 1.如果要操作少量的数据用 String
2.单线程操作字符串缓冲区 下操作大量数据用 StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据用 StringBuffer
本文总结了网上各位朋友的经验,有很多借鉴的东西,只希望能让自己能够巩固学到的内容,也给需要的人一些帮助吧