String与StringBuilder详解

字符串是一个常量,他们的值在创建之后不能改变。字符串缓冲区支持可变的字符串。因为String对象是不可变的,所以可以共享。

String

字符串地城是一个被final修饰的数组,不能改变,是一个常量。

private final byte[] value;

进行字符串的相加,内存中就会有多个字符串,占用空间多,效率低下

string s="a"+"b"+"c"="abc";

创建一个"abc"的字符串,是由a、b、c三个字符组成,他们先a、b相加生成"ab",再相加生成"abc"。所以内存中产生五个字符串,效率低下。

我们说的不可变并不是s不能变,s是变量可以变。一般的主函数中声明s变量,s变量在栈中存在,而字符串是引用类型所以在堆中存在,s存有的是字符串"abc"在堆中的地址。"abc"字符串一旦创建,在堆中的地址不能变。

假如s="abc"+"d"。那么s="abcd",之前的"abc"被回收掉,abcd在堆中是一个新的地址存储

 

StringBuilder

字符串缓冲区,可以提高字符串的操作效率(看成一个长度可以变化的字符串)

底层也是一个数组,但是没有被final修饰,可以改变长度

byte[] value=new byte[16];

初始长度为16,如果超出了StringBuilder容量,会自动地扩容16长度。如果StringBuilder中的字符串增加字符,字符串在内存中的起始地址也不会改变。

 

发布了62 篇原创文章 · 获赞 39 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/liangjiabao5555/article/details/103453542
今日推荐