首页 > 编程知识 正文

stringbuffer使用,stringbuilder stringbuffer

时间:2023-05-06 19:38:22 阅读:47027 作者:4639

String和StringBuffer和StringBuilder的区别@author放心少年

@createTime 2019/12/09

1. Java String类——String字符串常量字符串在Java编程中广泛使用,在Java中字符串为对象,Java提供3358www.Sina.com/

需要注意的是,String的值是不变的,因此每次操作String时都会生成String 类来创建和操作字符串,这不仅效率低下,而且浪费了大量有限的内存空间。 看看这个String操作时内存的变化:

可以看到,初始字符串值为" hello ",在此字符串之后添加了新字符串" world "。 此过程需要新的堆栈内存空间,最终“hello world”字符串也需要相应地扩展内存空间。 这样短的两个字符串,需要开拓三次内存空间。 为了处理对内存空间的333,Google引入了两个新类——StringBuffer类和StringBuild类,以处理频繁的字符串相关操作。

2 .如果是2.Java StringBuffer和StringBuilder类——StringBuffer字符串变量,StringBuilder字符串变量新的String对象,则为StringBuffer和string

与String类不同,StringBuffer类和StringBuilder类中的对象是极大浪费

StringBuilder类在Java 5中提出,与StringBuffer的最大区别在于StringBuilder方法不安全线程(无法同步访问)。

对字符串进行修改但是,如果APP应用程序需要线程安全,则必须使用StringBuffer类,因为StringBuilder与StringBuffer相比具有速度优势。

3 .这三个类的区别主要在于运行速度和线程安全两个方面。 3.1、首先说运行速度,或者说执行速度,http://www.Sina.com/http://www.Sina.com /

String str='abc '; system.out.println(str; str=str 'de '; system.out.println(str;

运行此代码时,首先输出“abc”,然后输出“abcde”。 名为str的对象看起来好像发生了更改,但实际上,这只是一个幻想。 JVM对这些代码是这样处理的。 首先创建String对象str,将“abc”分配给str,然后在第三行中JVM又将原始str的值与“de”相加并代入新的str,原始str就是JVM的垃圾回收机制(GC ) 因此,str实际上没有更改。 也就是说,在创建了上述String对象之后无法更改。 因此,在Java中处理String对象实际上是一个不断创建新对象并重用旧对象的过程,因此运行速度较慢。

另一方面,StringBuilder和StringBuffer对象是变量,与String相比要快得多,因为使用变量意味着直接更改对象而不是创建和重用对象。

此外,还可能以这种方式为字符串赋值

String str='abc' 'de '; stringbuilder stringbuilder=new stringbuilder ().append ) ' ABC ' ).append ) ' de ); system.out.println(str; system.out.println (stringbuilder.tostring ();

这样,输出结果也是" abcde "和" abcde ",之所以String速度比StringBuilder的反应速度快很多,是因为第1行的操作和String str=“abcde "; 因为完全一样,所以很快就会变成,但是写成以下形式的话

字符串str1=' ABC '; 字符串str2=' de '; String str=str1 str2; 如上所述,JVM会不断创建和回收对象来执行此操作。 速度变慢。

公共启动

ic void main(String[] args) { long a = new Date().getTime(); String cc = ""; int n = 10000; for (int i = 0; i < n; i++) { cc += "." + i; } System.out.println("String使用的时间" + (System.currentTimeMillis() - a) / 1000.0 + "s"); long s1 = System.currentTimeMillis(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < n; i++) { sb.append("." + i); } System.out.println("StringBuilder使用的时间" + (System.currentTimeMillis() - s1) / 1000.0 + "s"); long s2 = System.currentTimeMillis(); StringBuffer sbf = new StringBuffer(); for (int i = 0; i < n; i++) { sbf.append("." + i); } System.out.println("StringBuffer使用的时间" + (System.currentTimeMillis() - s2) / 1000.0 + "s"); } 3.2. 再来说线程安全

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

(一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞)

3.3. 总结一下

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况**

4. 这三种对象的比较方法 public static void main(String[] args) { String str = "1"; String str1 = "1"; StringBuffer sbf = new StringBuffer("1"); StringBuffer sbf1 = new StringBuffer("1"); StringBuilder sbd = new StringBuilder("1"); StringBuilder sbd1 = new StringBuilder("1"); System.out.println("---- euqals 比较 ----"); boolean stringEqualString = str.equals(str1); boolean stringBuilderEqualStringBuilder = sbd.equals(sbd1); boolean stringBufferEqualStringBuffer = sbf.equals(sbf1); System.out.println("String和String比较结果:" + stringEqualString); System.out.println("StringBuilder和StringBuilder比较结果:" + stringBuilderEqualStringBuilder); System.out.println("StringBuffer和StringBuffer比较结果:" + stringBufferEqualStringBuffer); boolean stringEqualStringBuffer = str.equals(sbf); boolean stringEqualStringBuilder = str.equals(sbd); boolean stringBufferEqualStringBuilder = sbf.equals(sbd); System.out.println("String和StringBuffer比较结果:" + stringEqualStringBuffer); System.out.println("String和StringBuilder比较结果:" + stringEqualStringBuilder); System.out.println("StringBuffer和StringBuilder比较结果:" + stringBufferEqualStringBuilder); System.out.println("---- == 比较 ----"); boolean stringEqualString1 = str == str1; boolean stringBuilderEqualStringBuilder1 = sbd == sbd1; boolean stringBufferEqualStringBuffer1 = sbf == sbf1; System.out.println("String和String比较结果:" + stringEqualString1); System.out.println("StringBuilder和StringBuilder比较结果:" + stringBuilderEqualStringBuilder1); System.out.println("StringBuffer和StringBuffer比较结果:" + stringBufferEqualStringBuffer1); }}// 结果为 ---- euqals 比较 ----String和String比较结果:trueStringBuilder和StringBuilder比较结果:falseStringBuffer和StringBuffer比较结果:falseString和StringBuffer比较结果:falseString和StringBuilder比较结果:falseStringBuffer和StringBuilder比较结果:false---- == 比较 ----String和String比较结果:trueStringBuilder和StringBuilder比较结果:falseStringBuffer和StringBuffer比较结果:false

​ 结果可以看到只有String和String 的equal方法是相等的,说明相同值的情况下只有String是指向同一个对象的,StringBuffer和StringBuilder都是新创建的对象。 ==比较也是如此

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。