1. ==和equals
==
:比較引用類型比較的是地址值是否相同
equals
:比較引用類型默認比較的是地址值是否相同,但是String類重寫了equals()方法,比較的是內容是否相同。
2. String、StringBuffer和StringBuilder
String
:字符串對象一旦被初始化就不會改變
StringBuffer
:
- 長度可變
- 可以存儲不同類型的數據
- 最終要轉換成字符串使用
- 可以對字符串進行修改
- 線程同步,用於多線程
StringBuilder
:
- 線程不同步,用於單線程,用於提高效率
3. 自動裝箱和自動拆箱
深入剖析Java中的裝箱和拆箱
詳解Java的自動裝箱與拆箱(Autoboxing and unboxing)
3.1 定義
自動裝箱 基本類型->包裝類型 Integer num2 = 99;
自動拆箱 包裝類型->基本類型 int num3 = num2;
3.2 ==和equals判斷
(1)創建對象
public static void main(String[] args) {
// Integer
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);// true 在[-128,127]範圍內,使用已有對象
System.out.println(i3==i4);// false,超出範圍,每次都new新對象
// Double
Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;
System.out.println(i1==i2);// false 無緩存
System.out.println(i3==i4);// false 無緩存
// Boolean
Boolean i1 = false;
Boolean i2 = false;
Boolean i3 = true;
Boolean i4 = true;
System.out.println(i1==i2);//true
System.out.println(i3==i4);//true
// public static final Boolean TRUE = new Boolean(true);
// public static final Boolean FALSE = new Boolean(false);
// public static Boolean valueOf(boolean b) {
// return (b ? TRUE : FALSE);
// }
(2)比較
equals
比較的是內容本身(包括內容和類型),並且我們也可以看到equal的參數是一個Object對象,我們傳入的是一個int類型,所以首先會進行裝箱,然後比較- 當一個基礎數據類型與封裝類進行
==、+、-、*、/
運算時,會將封裝類進行拆箱,對基礎數據類型進行運算。 - 當
“==”
運算符的兩個操作數都是 包裝器類型的引用,則是比較指向的是否是同一個對象,而如果其中有一個操作數是表達式(即包含算術運算)則比較的是數值(即會觸發自動拆箱的過程)。
總結:
equals比對象; "=="比數值,僅在兩邊都是包裝類型時才比較對象;四則運算算基礎
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c==d);//true 緩存範圍內相同對象
System.out.println(e==f);//false 緩存範圍外不同對象
System.out.println(c==(a+b));//true 比數值,觸發自動拆箱
System.out.println(c.equals(a+b));//true 比對象,先觸發自動拆箱過程,再觸發自動裝箱,對象相同
System.out.println(g==(a+b));//true 比數值,數值相等
System.out.println(g.equals(a+b));//false 比對象,不同的裝箱方法
System.out.println(g.equals(a+h));//true 比對象,相同