Live2D

理解String与StringBuffer、StringBuilder的区别与用法

  在谈String之前,先来分享一段从已找不到的某位不知名博主分享的 关于字符串在最近版本的改动:
  在Java9之前,字符串是使用char[]数组来存储字符的,因此每个字符占用两个字节。在Java9之后,字符串使用byte[]数组再加一个encoding -falg字段来保存字符,因此字符串每个字符只占用一个字节。所以Java9之后的的字符串更节省空间,且字符串的方法也没有受到影响。

一、String

  回到正题,细心地朋友看过String类的源码就会发现,他是被final修饰的:

 


  也就是说,String类是不可变类(当然也不可以被继承),一旦一个String对象被创建之后,其内容就是不可改变的,直至整个对象被销毁为止。

public static void main(String[] args) {
      String a = "Hello";
      a = "World";
      System.out.println(a);   //World
}


  上面看似好像是先创建了个对象a,内容为"Hello",再对此对象进行赋值为“World”。但实际却不是这样的,真正的是Java先在内存中创建了个内容为“Hello”的对象,并用字母a指向了这个对象,之后再在内存中创建了个“World”字符串对象,并将a改指向此对象。
  这两者的差异就是并不是对原来对象进行重新赋值,而是生成了一个新的String对象,会造成额外的内存消耗。之前的实例对象仍然存在,直到程序结束被垃圾回收。

二、StringBuffer

  StringBuffer对象则代表一个字符序列可变的字符序列。当一个StringBuffer被创建后,通过StringBuffer提供的append()、insert()、reverse()、setLength等方法可以改变这个字符串对象的字符序列,生成最终想要的字符串之后,就可以调用它的toString()方法将其转换为一个String对象。
  所以说StringBuffer对象时个字符序列可变的字符串,它没有重新生成一个对象,而是在原来的对象中可以连接新的字符串。

三、StringBuilder

  StringBuilder和StringBuffer基本相似,连个类的构造器和方法也基本相同,不同的是:StringBuffer是线程安全的,而StringBuilder没有实现线程安全功能,所以性能略高。

总结:

  在无需对字符串进行操作时直接使用String类即可;需要对字符串进行一系列如拼接,反转等操作时,字符串对象没有使用在多线程内就用StringBuilder,若需要使用多线程就使用StringBuffer。

posted @ 2020-12-12 21:24  CatCode  阅读(42)  评论(0)    收藏  举报