Java的 String创建运行机制和StringBuffer StringBuilder的区别

Java String 类型数据一旦创建了就不能改变。Java在创建String类型数据时先查找常量池,如果常量池中存在该字符串就指向已经存在的字符串的位置,如果不存在该字符串就先创建字符串,然后再指向该字符串中在常量池的位置。
Java创建字符串主要有两种方法

String s1 = "123456";
String s2 = new String("123456");

s1字符串是直接赋值,编译期间在常量池中直接创建,字符串在常量池中只能有一份。

String s3 = "123"+"456";
System.out.println(s1==s3);
true

s2字符串是在运行中创建,字符串是创建在堆中,在堆中可以保存多个相同的字符串。new最少创建一个对象,如果在常量池中存在该字符就只在堆中创建,并引用常量池中的对象。如果常量池中不存在就在常量池中创建一个,并引用它。

String s4 = new String("123456");
System.out.println(s2==s4);
System.out.println(s1==s4);
false
false

因为Java String的创建机制,所以在编写代码时如果String只是中间变量的话一般不要直接创建,而是通过StringBuffer和StringBuilder来进行中间过渡,减少程序运行时间和空间。
StringBuilder与StringBuffer的区别在于,StringBuilder时线程不安全的,StringBuffer是线程安全的,因为不需要保证线程安全所以StringBuilder的运行速度快,根据程序特定情况来选定。

StringBuffer源码:

public synchronized int length() 
public synchronized int capacity()
public synchronized void ensureCapacity(int minimumCapacity) 
public synchronized StringBuffer append(Object obj)

通过对StringBuffer的方法源码的截取,我们可以发现每个方法前都加上了synchronized保证了线程安全,但同时也降低了程序的运行速度。

StringBuilder源码:

public StringBuilder append(Object obj)
public StringBuilder replace(int start, int end, String str)
public StringBuilder insert(int index, char[] str, int offset,int len)

StringBuilder的方法前都没有进行加锁所以运行效率更高,如果在程序中已经可以保证线程安全了那么使用StringBuilder效率更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值