参考链接:
http://www.cnblogs.com/su-feng/p/6659064.html
https://blog.csdn.net/weixin_41101173/article/details/79677982
- String是不可变的,看源码就可以知道
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L;
在Java8中其数据是用char数组存储,并且该数组数final的。所以在每次对String做改变的时候,都是相当于重新新建了一个String,将改变之后的值赋给他。然后GC回收之前不用的那个Srting。所以会造成内存以及效率上的浪费
-
StringBuilder与StringBuffer是可以改变的,这二者之间的最大不同在于StringBuilder的方法不是线程安全的,StringBuffer是线程安全的,但是StringBuilder在速度上比StringBuffer有优势,所以在没有多线程操作的情况下,使用StringBuilder,在涉及到多线程的情况下,使用StringBuffer。
其继承关系如下(盗图)