Java基礎整理--equals、垃圾回收、內部類、泛型等

1.“==”與equals方法的區別

“==”代表比較雙方是否相同。如果是基本類型則表示值相等,如果是引用類型則表示地址相等即是同一個對象。equals方法是Object類中定義的方法,提供定義“對象內容相等”的邏輯,默認判斷地址是否相等,即判斷是否爲同一個對象。
在這裏插入圖片描述
String類中的equals方法重寫了Object類中的方法
在這裏插入圖片描述

2.靜態初始化塊

靜態初始化塊執行順序:上溯到Object類,即ChildClass->FatherClass->Object,先執行Object的靜態初始化塊,再向下執行子類的靜態初始化塊,直到我們的類的靜態初始化塊爲止。構造方法的執行順序和上面的順序一致,也是一個上溯的過程。

3.抽象方法,抽象類和接口

(1)包含抽象方法的類(除了main方法)必須聲明爲abstract抽象類,其中可以有非抽象的方法;
(2)抽象類只能用來繼承,不能實例化,抽象方法必須被子類實現;
(3)接口是抽象類的抽象,所有的方法都是抽象方法;
(4)接口的訪問修飾符只能是public或默認;
(5)接口能夠多繼承,類只能單繼承;
(6)接口中的屬性只能是常量,總是public static final修飾的,不寫也是;
(7)接口中的方法只能是public abstract,省略的話也是public abstract。

4.垃圾回收算法

  1. 引用計數法。堆中每個對象都有一個引用計數。被引用一次計數加1,被弓|用變量值變爲null,則計數減1 ,直到計數爲0 ,則表示變成無用對象。優點是算法簡單,缺點是“循環引用的無用對象”無法被識別。
    在這裏插入圖片描述
    上圖s1和s2互相引用對方,導致他們引用計數不爲0,但是實際已經無用,但無法被識別。
  2. 可達性算法(根搜索算法)
    程序把所有的引用關係看做一張圖,從一個節點GC ROOT開始,尋找對應的引用節點,找到這個節點以後,繼續尋找這個節點的引用節點,當所有的引用節點尋找完畢之後,剩餘的節點則被認爲是沒有被引用到的節點,即無用的節點。
    在這裏插入圖片描述
  3. 分代垃圾回收機制
    在 JDK 7 版本及JDK 7 版本之前,堆內存被通常被分爲下面三部分:新生代,老年代和永生代,JDK1.8之後,永生代被徹底移除了,取而代之的是元空間。大部分情況,對象都會首先在 Eden 區域分配,在一次新生代垃圾回收後,如果對象還存活,則會進入 s0 或者 s1,並且對象的年齡還會加 1(Eden 區->Survivor 區後對象的初始年齡變爲 1),當它的年齡增加到一定程度(默認爲 15 歲),就會被晉升到老年代中。對象晉升到老年代的年齡閾值,可以通過參數 -XX:MaxTenuringThreshold 來設置。
  4. 垃圾回收過程
    在這裏插入圖片描述
    大部分情況,對象都會首先在 Eden 區域分配,在一次新生代垃圾回收後,如果對象還存活,則會進入 s0 或者 s1,並且對象的年齡還會加 1(Eden 區->Survivor 區後對象的初始年齡變爲 1),當它的年齡增加到一定程度(默認爲 15 歲),就會被晉升到老年代中。對象晉升到老年代的年齡閾值,可以通過參數 -XX:MaxTenuringThreshold 來設置。
    經過這次GC後,Eden區和"From"區已經被清空。這個時候,“From"和"To"會交換他們的角色,也就是新的"To"就是上次GC前的“From”,新的"From"就是上次GC前的"To”。不管怎樣,都會保證名爲To的Survivor區域是空的。Minor GC會一直重複這樣的過程,直到“To”區被填滿,"To"區被填滿之後,會將所有對象移動到老年代中。

5.內部類

在Java中內部類主要分爲成員內部類(靜態內部類、非靜態內部類)、匿名內部類、局部內部類。成員內部類(可以使用private,default, protected,public任意進行修飾。
(1)非靜態內部類,通過外部類對象創建內部類對象
在這裏插入圖片描述
i.非靜態內部類必須寄存在一個外部類對象裏。因此,如果有一個非靜態內部類對象那麼一定存在
對應的外部類對象。非靜態內部類對象單獨屬於外部類的某個對象。
ii.非靜態內部類可以直接訪問外部類的成員。但是外部類不能直接訪問非靜態內部類成員。
iii. 非靜態內部類不能有靜態方法、靜態屬性和靜態初始化塊。
iv.外部類的靜態方法、靜態代碼塊不能訪問非靜態內部類,包括不能使用非靜態內部類定義變
量、創建實例。

(2)靜態內部類
1.當一個靜態內部類對象存在,並不一定存在對應的外部類對象。因此,靜態內部類的實例方法
不能直接訪問外部類的實例方法。
2.靜態內部類看做外部類的一個靜態成員。因此,外部類的方法中可以通過:“靜態內部類名
字”的方式訪問靜態內部類的靜態成員,通過new靜態內部類0訪問靜態內部類的實例。

靜態內部類的訪問

class Outer{
	//相當於外部類的一個靜態成員
	static class Inner{
	}
}
public class TestStaticInnerClass{
	public static void main(String[] args){
		//通過new外部類名,內部類名()來創建內部類對象
		Outer.Inner inner = new Outer.Inner();
	}
}

(3)匿名內部類
將匿名內部類寫成參數的形式傳遞給函數使用在這裏插入圖片描述
(4)局部內部類
局部內部類是定義在方法內部的,作用域只限於本方法。局部內部類和成員內部類一樣被編譯,只是它的作用域發生了改變,它只能在該方法中被使用,出了該方法就會失效。

public class Test2{
	public void show(){
		class Inner{
			public void fun(){
				System.out.println("helloworld");
			}
		}
		new Inner().fun();
		}
		public static void main(String[] args){
			new Test2().show();
		}

6.枚舉類型

enum Season {
	SPRING, SUMMER, AUTUMN, WINTER
}

所有的枚舉類型隱性地繼承自java.lang.Enum。枚舉實質上還是類!而每個被枚舉的成員實質就是一個枚舉類型的實例,他們默認都是public static final修飾的。可以直接通過枚舉類型名使用它們。

7.泛型

泛型是JDK1.5之後增加的,它可以幫助我們建立類型安全的集合。泛型的本質是“數據類型的參數化”。我們可以把“泛型”理解爲數據類型的一個佔位符(形式參數),即告訴編譯器,在調用泛型時必須傳入實際類型。

泛型示例:
在這裏插入圖片描述

8.迭代器

(1)List使用迭代器
在這裏插入圖片描述
(2)Map使用迭代器
在這裏插入圖片描述
(3)遍歷List、Set、Map方法彙總

在這裏插入圖片描述
在這裏插入圖片描述

9.Collections工具類

類java.util.Collections提供了對Set、List、 Map進行排序、 填充、查找元素的輔助方法。

  1. void sort(List) //對List容器內的元素排序,排序的規則是按照升序進行排序。
  2. void shuffle(List) //對List容器內的元素進行隨機排列。
  3. void reverse(List) //對List容器內的元素進行逆續排列。
  4. void fll(List, Object) //用一個特定的對象重寫整個List容器。
  5. int binarySearch(List, Object)/對於順序的List容器,採用折半查找的方法查找特定對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章