浅谈String StringBuilder StringBuffer

  • String

  1. 不可变的对象(jdk底层源码String类是final修饰的,final修饰的类是不能被继承的)
  2. 创建一个字符串对象是存储在字符串常量池(jdk1.8及jdk1.8之后常量池在堆中,jdk1.8之前存在方法区)
  3. 创建一个字符串对象时,首先就会检查字符串常量池池中是否存在面值相等的字符串,如果有,则不再创建,直接放回字符串池中对该对象的引用,若没有则创建然后放入到字符串池中并且返回新建对象的引用。
  4. 每一个修改String对象的操作,实际上都是创建了一个全新的String对象。
  5. 创建方式:=赋值或new String()对象创建
  • StringBuffer

  1. 可变字符串对象
  2. StringBuffer都是修改自身,不会产生新的对象
  3. StringBuffer是不能使用=进行初始化的,它必须要产生StringBuffer实例,也就是说你必须通过它的构造方法进行初始化
  4. 线程安全
  • StringBuilder

  1. 可变字符串对象
  2. 线程不安全
  • String StringBuilder StringBuffer区别

String 和StringBuilder,StringBuffer的区别

String是不可变字符序列
StringBuilder和StringBuffer是可变字符序列

String 每次修改都会创建新的对象
StringBuffer和StringBuilder 修改时不会产生新的对象

String创建可以使用=赋值初始化和new String()创建对象
StringBuffer和StringBuilder不能使用=赋值初始化创建只能new调用构造方法常见和初始化

操作少量数据使用String
多线程操作字符串缓冲区下操作大量数据 StringBuffer;单线程操作字符串缓冲区下操作大量数据 StringBuilder

StringBuilder和StringBuffer区别

StringBuffer线程安全
StringBuilder线程不安全

解释:

  1. 线程安全性方面,StringBuffer允许多线程进行字符操作。这是因为在源代码中StringBuffer的很多方法都被关键字synchronized 修饰了,而StringBuilder没有。
    synchronized的含义:
  2. 每一个类对象都对应一把锁,当某个线程A调用类对象O中的synchronized方法M时,必须获得对象O的锁才能够执行M方法,否则线程A阻塞。一旦线程A开始执行M方法,将独占对象O的锁。使得其它需要调用O对象的M方法的线程阻塞。只有线程A执行完毕,释放锁后。那些阻塞线程才有机会重新调用M方法。这就是解决线程同步问题的锁机制。 \
  3. 了解了synchronized的含义以后,大家可能都会有这个感觉。多线程编程中StringBuffer比StringBuilder要安全多了 ,事实确实如此。如果有多个线程需要对同一个字符串缓冲区进行操作的时候,StringBuffer应该是不二选择。

StringBuilder是1.5新引入的,其前身就是StringBuffer。StringBuilder的效率比StringBuffer稍高,如果不考虑线程安全,StringBuilder应该是首选。另外,JVM运行程序主要的时间耗费是在创建对象和回收对象上。

字符串“+”操作的本质
//代码1  
String sa = "ab";                                          
String sb = "cd";                                       
String sab=sa+sb;                                      
String s="abcd";  
System.out.println(sab==s); // false  
//代码2  
String sc="ab"+"cd";  
String sd="abcd";  
System.out.println(sc==sd); //true 

代码1中局部变量sa,sb存储的是堆中两个拘留字符串对象的地址。而当执行sa+sb时,JVM首先会在堆中创建一个StringBuilder类,同时用sa指向的拘留字符串对象完成初始化,然后调用append方法完成对sb所指向的拘留字符串的合并操作,接着调用StringBuilder的toString()方法在堆中创建一个String对象,最后将刚生成的String对象的堆地址存放在局部变量sab中。而局部变量s存储的是常量池中"abcd"所对应的拘留字符串对象的地址。 sab与s地址当然不一样了。这里要注意了,代码1的堆中实际上有五个字符串对象:三个拘留字符串对象、一个String对象和一个StringBuilder对象。

代码2中"ab"+“cd"会直接在编译期就合并成常量"abcd”, 因此相同字面值常量"abcd"所对应的是同一个拘留字符串对象,自然地址也就相同。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值