![](https://csdnimg.cn/release/download_crawler_static/87935054/bg1.jpg)
一、Class 和 Object
二、String 和 StringBuffer
1、二者区别
String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一
个新的 String 对象,然后将指针指向新的 String 对象。所以经常改变内容的字符串最好不
要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了
以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
所以,使用 String 类的场景为:在字符串不经常变化的场景中可以使用 String 类,例如常
量的声明、少量的变量运算。
StringBuffer 每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改
变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变
的情况下。
所以,使用 StringBuffer 类的场景:在频繁进行字符串运算(如拼接、替换、删除等),
并且运行在多线程环境中,则可以考虑使用 StringBuffer,例如 XML 解析、HTTP 参数解
析和封装。
例子:
public static void main(String[] args) {
StringBuffer s = new StringBuffer("abc");
s.append("dd");
s.insert(2, 3);
System.out.println(s.hashCode());
String s1 = "abc";
s1 = "dde";
s1 = s1.substring(0,2);
System.out.println(s1.hashCode());
}
对 s 的修改始终在原来内存单元进行,所有哈希码不变。S1 的任何变化都会生成新的对象,
所以哈希码会改变。
public static void main(String[] args) {
StringBuffer s = new StringBuffer("abc");
s.append("dd"); // 追加字符
s.insert(2, 3); // 插入
s.replace(0, 3, "A");// 替换
System.out.println(s);
String s1 = "abc";
s1.concat("def"); //链接字符串
s1.replace('a', 'z'); // 替换