讀Core Java 第二章

讀Core Java 第二章

一、集合2.0

1、相關知識
(1)面向對象的編程(OOP)通常將數據封裝在各個類中
(2)數據結構

二、集合2.1

1、概述
(1)Enumeration接口提供了一種抽象機制,用於訪問任意一個容器中的各個元素
(2)例如:Vector、Stack、Hashtable、BitSet、Enumeration接口等

2、將集合接口與實現分離
(1)隊列接口,實現隊列的方法通常有兩種:一種是“循環數組”,另一種是“鏈表”
(2)從JDK 5.0開始,集合類是帶類型參數的泛型類
(3)循環數組總是比鏈表更加高效,循環數組是有界集合,容量有限

3、Java類庫中的集合接口和迭代器接口
(1)Java類庫中用於集合類的基本接口是Collection接口
(2)Collection包含的方法add,iterator等
(3)add方法用於向集合中添加元素,如果添加元素後,該集合發生改變,返回true;如果添加元素後,集合無任何變化,返回false
(4)iterator方法用於返回一個實現了Iterator接口的對象

4、迭代器
(1)

public interface Iterator<E>{
	E next();	//到達末尾,拋出一個NoSuchElementException異常
	boolean hasNext();
	void remove();
	}

(2)for each循環
for(String element:c){ } //編譯器直接將for each循環轉化成包含迭代器的一個循環
(3)在ArrayList進行迭代,迭代器從索引零開始,每迭代一步索引加一
(4)訪問HashSet中的元素,索引基本上是最忌排列的,迭代過程中遍歷集合中的所有元素,但是無法確定這些元素被訪問的順序
(5)next方法和remove方法調用是互相依賴的,如果調用remove方法之前沒調用next方法,不合法,拋出illegalStateException異常
(6)由於Collection和Iterator接口都屬於泛型接口,可以編寫在任何種類的集合上運行的實用方法

5、java.util.Collection<E>

1)Iterator<E> iterator():返回一個迭代器,用於訪問集合中的各種元素
(2int size():返回當前存放在集合中的元素的數量
(3boolean isEmpty(): 如果該集合中沒有任何元素,則返回true4boolean contains(Object obj):如果該集合中包含一個與obj相等的對象,返回true5boolean containsAll(Collection<?> other):如果該集合包含了other集合中的所有元素,則返回true6boolean add(Object element):將一個元素添加到該集合中,如果由於調用而使集合發生了變化,則返回true7boolean allAll(Collection<? extends E> other):將來自other集合中的所有元素添加到該集合中,如果由於該調用而使集合發生了變化,則返回true8boolean remove(Object obj):移除該集合中與obj相等的對象,如果有匹配的對象被成功移除,則返回true9void clear():移除該集合中所有元素
(10)Object[] toArray():返回該集合的對象數組

6、Java類庫中具體的集合

三、集合2.2

1、鏈表linked list
(1)將每個對象存放在獨立的結點中,每個結點還存放着序列中下一個結點的引用
(2)在Java編程語言中,所有鏈表實際上是雙重鏈接,每個結點中存放着對它的前面結點的引用
(3)鏈表是一個有序集合
(4)LinkedListadd方法用於將對象添加到列表的尾部
(5)如果一個迭代器發現它的集合已經被另一個迭代器修改了,或者被該集合自身的方法修改了,那麼就會拋出一個ConcurrentModificationException異常
(6)對於併發修改列表的探測,鏈表只負責跟蹤對列表的結構性修改,比如添加或移除結點,而set方法並不被視爲結構性修改,可以將多個迭代器附加給一個鏈表,所有的迭代器都調用set方法來修改現有結點的內容
(7)鏈表不支持快速隨機訪問,如果要查看鏈表中的第n個元素,必須從頭開始,然後跳過前面的n-1個元素
(8)在元素必須用整數索引來訪問的編程情形中,通常不適用鏈表
(9)不可靠的隨機訪問方法遍歷鏈表

for(int i=0; i<list.size() ;i++)   do something with list.get(i);

運行效率極低,每次查找一個元素,都必須從列表頭部重新開始搜索,LinkedList對象根本不作任何緩存位置信息的操作
(10)get方法稍微做了下優化,如果索引比size()/2大,那麼對元素的索引將從列表尾部開始進行

2、數組列表
(1)List用於描述一個有序的集合,集合中的各個元素位置很重要
(2)數組列表ArrayList類,實現了List接口,封裝了一個動態再分配的對象數組
(3)Vector類對象的方法是同步的,ArrayList方法不同步的

3、散列集
(1)快速查找所需要的對象,爲每個對象計算出一個整數,稱爲散列碼
(2)具有不同數據字段的對象會產生不同的散列碼,由String類的hashCode方法產生
(3)實現的hashCode方法必須與equals方法兼容,如果a.equals(b)爲true,則a與b必須具有相同的散列碼
(4)散列表是鏈表的數組,每個列表稱爲一個散列單元
(5)如果一個對象的散列碼是76268,共有128個散列單元,那麼該對象將放在散列表元108中,因爲76268除以128的餘數爲108
(6)散列集:hashset不存在重複元素的集合,add方法首先查找是否存在要添加的元素,如果不存在則添加
(7)Java集合類庫提供了一個HashSet類,是基於散列表的散列集
(8)常用方法
4、樹集
(1)TreeSet是一個有序集合,可以按照任何順序將元素插入該集合
(2)如果一個樹集有1000元素,添加一個新元素大約需要進行10次比較,因爲2的10次冪大於1000
(3)Comparator接口聲明瞭兩個方法:compare和equals
(4)每個類其實都有一個equals方法

5、優先級隊列
(1)Priority Queue是一種能夠再以任意順序插入元素後,再按排序順序讀取這些元素的數據結構
(2)remove方法,返回當前優先級隊列中的最小元素
(3)利用堆,堆是一個可以進行自我調整的二叉樹,調用add和remove方法將會使最小的元素移動到根
(4)任務調度,每個任務有一個優先級,任務以隨機順序添加到隊列中,每當啓動一個新任務,總是最高優先級的任務從隊列中被移除出來去執行,1是最高優先級,所以,先把最小的元素移除
(5)java.util.PriorityQueue

6、映射表
(1)映射表數據結構存放許多鍵/值對,如果提供了鍵,就能夠找到與它對應的值
(2)Java類庫爲映射表提供了兩個通用的實現:散列映射表HashMap和樹狀映射表TreeMap,都實現了Map接口
(3)常用方法
在這裏插入圖片描述
(4)只添加鍵,不添加值的add方法,會拋出一個UnsupportedOperationException異常
(5)java.util.Map<K,V>

V get(K key):獲取與該鍵向關聯的值,並且返回與該鍵相關聯的對象,如果沒有在該映射表中找打該鍵,則返回null
V put(K key,V value):將相互關聯的一個鍵和一個值插入到該映射表中,如果該鍵已經存在了,那麼新對象將取代與該鍵相關聯的舊對象,本方法返回鍵的舊值,如果鍵原先並不存在,則返回null,鍵可能會是null,但值不一定會是null
Set<Map.Entry<K,V>>entrySet():返回Map.Entry對象的視圖集,即映射表中的鍵/值對,可以移除,無法添加
Set<K> keySet():返回該映射表中的所有鍵的視圖集,可以移除,並且移除的鍵和相關聯的值都會被移除,但是不能向其中添加任何元素
Collection<V> values():返回該映射表中的所有值的視圖集合,可以移除,並且關聯的鍵也移除,不同添加任何元素

(6)java.util.Map.Entry<K,V>

K getKey():獲取鍵
V getValue()  :返回該元素項的值
V setValue(V newValue):將相關聯的映射表中的值更新爲新值,並且返回舊值

7、枚舉集和枚舉映射表
(1)EnumSet是一個包含枚舉類型元素的集
(2)使用位序列實現

四、集合2.3

1、集合框架
(1)框架,是一個類集合
(2)兩個用於集合的基本接口,即Collection和Map
(3)圖示
在這裏插入圖片描述
(4)集合框架中的各個類以及相互關係
在這裏插入圖片描述

五、算法

1、排序與混排
(1)sort方法默認元素實現了Comparable接口,直接將所有的元素轉入到一個數組,再使用歸併排序的一種變體對數組進行排序,然後將排序後的元素重新複製到列表中
(2)歸併排序算法比較穩定,不需要交換相同的元素
(3)混排:隨機混排列表中各個元素的順序,體哦國內要混排的列表和一個隨機數生成器
(4)java.utils.Collections
在這裏插入圖片描述
2、二分查找
(1)如果數組包含1024個元素,將在10次二分查找後找到匹配的元素
(2)如果使用線性查找算法,平均需要進行512次比較才能找到該元素
(3)Collections類的binarySearch方法可以實現這個算法,前提是集合有序,否則將會返回錯誤的結果
(4)如果binarySearch方法返回的值大於等於零,那表示的是匹配對象的索引,如果該值是負值,則沒有任何匹配元素
(5)對於鏈表查找,binarySearch算法便成了一個線性查找

3、簡單算法
在這裏插入圖片描述
在這裏插入圖片描述

六、集合2.5

1、Hashtable類
(1)方法是同步的

2、枚舉
(1)枚舉Enumeration接口有兩個方法:hasMoreElements和nextElement
(2)靜態方法Collections.enumeration產生一個枚舉對象,用於枚舉集合中的各個元素
(3)常用方法
在這裏插入圖片描述
3、屬性集
(1)Property Set是類型特殊的映射表結構
(2)鍵和值都是字符串,表可以保存到一個文件中,也可從一個文件中加載,使用一個默認的輔助表
(3)用於實現一個屬性集的Java平臺類稱爲Properties
(4)常用方法
在這裏插入圖片描述
4、棧
(1)棧Stack繼承Vector類
(2)常用方法

E push(E item):將item壓入棧中,然後返回item
E pop():彈出和返回棧頂項,如果棧是空的,不可使用
E peek():返回棧頂項而不彈出,棧空不可使用

5、位集
(1)BitSet存放一個位序列,存儲如標誌序列,將各個位包裝在字節中
(2)可以對各個位進行讀取、設置或者清除等操作
(3)常用方法在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章