您好,欢迎访问一九零五行业门户网

string、stringbuffer和stringbuilder的区别是什么?

区别:string类是不可变类,当一个string对象被创建,则包含在对象中的字符序列是不可改变的,直至对象被销毁;stringbuffer对象代表可变字符串对象,且线程安全;stringbuilder类代表可变字符串对象,且非线程安全。
string、stringbuffer和stringbuilder的区别:
string
  string类是不可变类,即一旦一个string对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
  这个是string类的解释,之前小咸儿看到这个情况,不能理解上述的解释,如下
string a = 123;a = 456;// 打印出来的a为456system.out.println(a)
看到这里,小咸儿不明白了,这不是明明已经对他进行修改了吗?为什么还说他是一个不可变类呢?
  经过小咸儿和小伙伴们的学习,明白string类不可变在哪里体现出来的,接下来就看一张上述a对象的内存存储空间图
可以看出来,再次给a赋值时,并不是对原来堆中实例对象进行重新赋值,而是生成一个新的实例对象,并且指向“456”这个字符串,a则指向最新生成的实例对象,之前的实例对象仍然存在,如果没有被再次引用,则会被垃圾回收。
stringbuffer
  stringbuffer对象则代表一个字符序列可变的字符串,当一个stringbuffer被创建以后,通过stringbuffer提供的append()、insert()、reverse()、setcharat()、setlength()等方法可以改变这个字符串对象的字符序列。一旦通过stringbuffer生成了最终想要的字符串,就可以调用它的tostring()方法将其转换为一个string对象。
stringbuffer b = new stringbuffer(123);b.append(456);// b打印结果为:123456system.out.println(b);
在看一下b对象的内存空间图:
所以说stringbuffer对象是一个字符序列可变的字符串,它没有重新生成一个对象,而且在原来的对象中可以连接新的字符串。
stringbuilder
  stringbuilder类也代表可变字符串对象。实际上,stringbuilder和stringbuffer基本相似,两个类的构造器和方法也基本相同。不同的是:stringbuffer是线程安全的,而stringbuilder则没有实现线程安全功能,所以性能略高。
stringbuffer是如何实现线程安全的呢?
stringbuffer类中实现的方法:
stringbuilder类中实现的方法:
由此可见,stringbuffer类中的方法都添加了synchronized关键字,也就是给这个方法添加了一个锁,用来保证线程安全。
java9的改进
  java9改进了字符串(包括string、stringbuffer、stringbuilder)的实现。在java9以前字符串采用char[]数组来保存字符,因此字符串的每个字符占2字节;而java9的字符串采用byte[]数组再加一个encoding-flag字段来保存字符,因此字符串的每个字符只占1字节。所以java9的字符串更加节省空间,字符串的功能方法也没有受到影响。
更多编程相关知识,请访问:编程入门!!
以上就是string、stringbuffer和stringbuilder的区别是什么?的详细内容。
其它类似信息

推荐信息