String对象是不可变的:

String的方法都是创建了一个全新的String对象,在实际传递的时是传递了引用的拷贝。每当把String对象作为参数时,都会复制一份引用,而该引用指向的对象其实一直带

咋子单一的物理对象上,从未动过。

可以给String对象加任意多的别名,因为它具有只读特性,所以指向它的任何引用都不可能改变他的值,因而也不会对其他的引用有什么影响。


StringBuffer 字符串变量(线程安全)

每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

StringBuilder 字符串变量(非线程安全)

此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。StringBuilder有许多方法,包括insert(0,substring(),replace(),reverse(),append(),toString(),delete()方法。

eg: 使用循环时,最好自己创建一个StringBuilder对象,用它来构建最终的结果

<span ></span><pre name="code" class="java" style="color: rgb(51, 51, 51); line-height: 26px;">public String toString() {
    StringBuilder result = new StringBuilder("[");
    for(int i = 0;i<25;i++) {
        result.append (rand.nextInt(100));   
        result.append(".");
        result.delete(result.length()-2,result.length());
        result.append("]");
        return result.toString();
    }
}



List的toStringi()方法在容器实现时已经被覆盖,所以直接打印List中的元素得到的就是元素实际的名字,若想打印对象的内存地址,应当调用Object.toString()方法。不能使用this,而是调用super.toStrinig()方法。



String的基本操作

length();
charAt();
getChar(0,getByte();
toCharArray();
equals(),equalsIgnoreCase();
compareTo();
boolean contains();
boolean contentEquals();
boolean equalsIgnoreCase();
boolean regionMatcher();
boolean startsWith(),endsWith();
indexOf(),lastIndexOf();(没有就返回-1)
substring(subSequence());
concat();
replace();
toLowerCase(),toUpperCase();
trim();
valueOf();
intern();