1. String、StringBuffer、StringBuilder
1.1 可变性
-
String类:
中使用final 关键字
·字符数组
保存字符串。所以 String 对象是不可变的。- private final char value[]
-
StringBuilde
r 与StringBuffer
都继承自 AbstractStringBuilder 类,- 在AbstractStringBuilder 中也是使用
字符数组
保存字符串 - 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
- 在AbstractStringBuilder 中也是使用
1.2 线程安全性
- String 中的对象是不可变的,也就可以理解为常量,线程安全。
- StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
- StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
1.3 总结
- 操作少量的数据 = String
- 单线程操作字符串缓冲区下操作大量数据 = StringBuilder
- 多线程操作字符串缓冲区下操作大量数据 = StringBuffer
2. ‘==’ 与equal()的区别
首先,我们需要明确的是String属于引用类型
,不属于8大基本数据类型
2.1 代码演示
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "123";
String s1 = new String("123");
String s2 = "123";
System.out.println(s==s1);
System.out.println(s==s2);
System.out.println(s.equals(s2));
System.out.println("=================================");
StringBuffer sb = new StringBuffer("123");
StringBuffer sb1 = new StringBuffer("123");
System.out.println(sb==sb1);
System.out.println(sb.toString().equals(s));
System.out.println(sb.toString().equals(sb1.toString()));
System.out.println("=================================");
StringBuilder sbd = new StringBuilder("123");
StringBuilder sbd1 = new StringBuilder("123");
System.out.println(sbd==sbd1);
System.out.println(sbd.toString().equals(s));
System.out.println(sbd.toString().equals(sbd1.toString()));
}
输出:
false
true
true
=================================
false
true
true
=================================
false
true
true
2.2 总结︰
==
对于基本类型来说是值比较
,对于引用类型来说是比较的是引用
;equals
默认情况下是引用比较
,只是很多类重写了equals方法,- 比如 String、Integer等把它变成了值比较,所以一般情况下equals 比较的是值是否相等。
疑问
String str=""
与 String str=new String("i")
为什么不相等?
答:
因为内存的分配方式不一样。
- String str=" 的方式,Java虚拟机会将其分配到
常量池
中; - 而Stringstr=new String(“i”)则会被分到
堆内存
中。