解析String类和StringBuilder

来源:互联网 发布:卤素灯 led 对比 知乎 编辑:程序博客网 时间:2024/04/27 16:29

介绍一下String类

String类是一个final类,不允许被继承

String类是java中有字面值的两个类之一,至于另一个类是什么呢,我也不知道~~...

至于什么是字面值了?

Sting str = "abc";

int i = 12;

这样可以直接赋值就是有字面值的意思

java中在很多时候都会定义一个字符串,而这些字符串有很多重复的,例如,在学生类的班级啊学校啊什么的,都是一些相同的字符串

java中为了不在使用这些重复的字符串浪费空间,就将String定义为了一个final类型的.而且这个str的值是不能改变的,这又是为什么呢?

其实我们在java中经常也会改变一个字符串的值:

String str = "abd";

str = "bcd";

但是为什么说不能改变str的值呢?

在创建"abc"这个字符串的时候是现在串池里找是否有"abc"这个字符串,如果没有则创建一个,如果有就将这个字符串的地址赋给str引用

str = "bcd"这句话呢其实有几个过程,首先创建"bcd"字符串,再将地址赋给str,其实这时候改变的只是str所存的地址,"abc"这个字符串对象其实还存在于串池中.

经典面试题:

String str = new String("abc");

这及代码创建了几个对象?

答案是两个

首先,在串池中创建了一个"abc"的对象,然后new了一个String对象,这个对象是存储在Heap(对空间)中的,是调用了String类的以字符串类型为参数构造方法.


所以在执行这样个代码的时候:

String str = "A"+"B"+"C"+"D";

会创建许多的对象,而最终我们需要的其实只有最后的字符串对象

其它的中间对象都沦为了垃圾对象,造成了内存的浪费

这时候Sun公司为我们提供了一个StringBuilder类,这个类创建的对象是存在Heap(堆空间)中的,它的值时可以改变的,在我们进行大量的字符串连接的时候就不会产生垃圾对象了

String str;

Sting str1 = "A";

for(int i=0;i<10000;i++){

Str+=Str1;

}

StringBuilder str2 = new StringBuilder("");

for(int i=0;i<10000;i++){

str2=str2.append(str1);

}

上面这两种方式产生最后的结果都是一样的.但是下面StringBuilder方式比上面的方式快了几千倍


没什么写的了














0 0
原创粉丝点击