您的位置:首页 > 产品设计 > UI/UE

String、StringBuffer、StringBuilder的区别

2016-07-20 15:32 393 查看
1、String不属于8种基本数据类型, 是final的,不可被继承,String类声明的对象的值是不能改变的,任何对String对象的操作都会引起新的String对象的产生。String是线程是非安全的。

String str="abc" //此时str中存的是字符串abc在字符串池中的地址;例如0X0021
String str1=str;
System.out.print(str);//  结果为  abc
str=str+"d"  //str指向地址0x0022
System.out.print(str);//  结果为  abcd


在栈中开辟一块空间存放引用变量str;接着在String池(字符串常量池)中开辟一块空间,存放String常量”abc”(String对象“abc”); 引用变量str指向池中String常量”abc”;str所存的地址即常量”abc”所在地址;执行String str1=str时,直接将字符串常量池中“abc“的地址给str1,执行str=str+”d”后,会在池中查找是否存在abcd,若不存在,则在池中开辟一块空间,存放合并后的String常量”abcd”;

因此通过这种方式创建的字符串在字符串常量池中,是可共享的但同时不可变,因为上述执行完后,会有两个字符串对象“abc“和”abcd“

使用直接指定或者使用纯字符串串联来创建String对象,只会检查维护String池中的字符串,池中没有就在池中创建一个,有就不创建!但绝不会在堆栈区再去创建该String对象。

String str1 = new String("abc");//这个创建过程可分为两部分
1、String str="abc"
2、String str1=new String(str);


1、在栈中开辟一块空间存放引用变量str,在字符串常量池中查找有没有”abc”对象,如果有则将str直接指向它,如果没有就在字符串常量池中创建出来“abc”,然后在将str指向它;2、在堆内存中new出一个String对象,将str1指向该堆内存地址,新new出的String对象内容,是在字符串常量池中找到的或创建出“abc”对象,相当于此时存在两份“abc”对象拷贝,一份存在字符串常量池中,一份被堆内存的String对象私有化管理着。所以使用String str1 = new String(“abc”);这种方式创建对象,实际上创建了两个对象。

Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。

2、StringBuffer类创建的对象:是一个可变对象, 任何对它指向的字符串的操作都不会产生新的对象,它只能通过构造函数来建立。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。 StringBuffer类的方法是多线程、安全的

StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区

StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区

StringBuffer sb = new StringBuffer();

对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.

向StringBuffer中赋值的时候可以通过它的append()方法.

例如sb.append(“abc”);



String str="abc"
String str1 = new String(str);
str1 += "d";


实际上是通过建立一个StringBuffer,然后调用append(),最后

再对StringBuffer使用toSting();

所以str1 += “d”;可以等同于

StringBuffer sb = new StringBuffer(str);
sb.append("d");
str = sb.toString();


3、StringBuilder类主要是单个线程使用的类,StringBuilder 的实例用于多个线程是不安全的,用在字符串缓冲区被单个线程使用。

做字符串连接用StringBuffer,和StringBuilder,少用String的+号,

速度从慢到快:String < StringBuffer < StringBuilder 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息