JavaSE-String疑難點

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 比對象,相同
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章