您的位置:首页 > Web前端

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

2020-07-19 04:57 597 查看

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效率更高。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: