Java基礎(十)★集合★映射

集合

Collection<E>

頂級接口-Collection---容器,大小不定。---泛型

List---列表

有序,重複

ArrayList

基於數組的。內存空間是連續的,默認初始容量是10,每次擴容一半,是一個線程不安全的集合。增刪元素比較慢,查詢元素較快

LinkedList

基於鏈表實現的。內存空間是不連續的。增刪元素相對較快,查詢元素較慢。是一個線程不安全的集合

 

Vector

向量---Java中最早的集合---基於數組實現的。默認初始容量是10,每次擴容一倍;是一個線程安全的集合

內存空間連續。增刪元素較慢,查詢元素相對較快。是一個線程安全的集合。

Stack

棧。---遵循先進後出的原則。最先放入的元素---棧底元素,最後放入的元素---棧頂元素。將元素放入棧中---入棧/壓棧;將元素從棧中取出---出棧/彈棧

練習:

1. Vector來實現Stack

2. 用數組實現Stack


Queue

隊列---先進先出。先放入隊列中的元素---隊頭元素,最後放入隊列中的元素---隊尾元素

線性集合:List,Queue

Set

散列集合---元素不可重複,不保證元素順序---Set中的元素無序不可重複

HashSet---默認初始容量是16,加載因子是0.75f,每次擴容一倍。是一個線程不安全的集合

Iterator

迭代器---用於迭代遍歷集合。通過指針的挪動來獲取對應的元素,通過標記這個元素是佛可用來確定是否刪除這個元素---不允許直接增刪原集合

foreach---本質上也是在做迭代遍歷。---如果一個對象能夠使用增強for循環,那麼這個對象對應的類必須實現Iterable---JDK1.5的特性之一

Collections

是一個操作集合的工具類

Array---Arrays

Comparator

比較器---重寫compare方法,將比較規則寫到compare方法中---根據返回值的正負來確定大小:如果返回值是正數,表示第一個參數排到第二個參數之後;反之表示第一個參數排到第二個參數之前

如果沒有指定排序規則,這個時候要求集合中的元素對應的類必須實現Comparable,比較規則是寫在compareTo方法中

泛型

參數化類型。---ParameterizedType---JDK1.5的特性之一

List list = new ArrayList();---元素類型存儲爲Object類型

List list = new ArrayList<String>();

用具體類型來替換泛型的操作---泛型的擦除---發生在編譯期

泛型的繼承

// ? 表示泛型的通配符

// 遍歷元素類型是數值類型的集合---泛型不向下兼容

// ? extends /接口 表示傳入這個類/接口本身或者其子類/子接口元素

// 泛型的上限

public static void it(List<? extends Number> list) {

 

// 能向這個集合添加元素麼?--不行,除了null

// list.add(new Integer(4));

list.add(null);

 

for (Number number : list) {

System.out.println(number);

}

}

 

// String及其父類

// ? super /接口 表示傳入這個類/接口及其父類/父接口元素

// 泛型的下限---同一個泛型不能既規定上限又規定下限

public static void it2(List<? super String> list) {

}

練習:瘋狂值

5 15 20 35 50 70

20 50 5 70 15 35  ->  215

35 15 70 5 50 20 -> 215

映射---Map<K,V>

MapJava中映射的頂級接口。K-Key---鍵,V-Value------存儲的時候是一個鍵對應了一個值---鍵值對---要求鍵必須唯一,值隨意。---一個map中存儲了很多的鍵值對。

Entry---每一個entry對象代表了一個鍵值對。

Map是集合嗎?---不是

如何遍歷一個map

1. 獲取所有的鍵,根據鍵來獲取對應的值

2. 獲取到所有的鍵值對

HashMap---允許鍵或者值爲null。默認的初始容量是16,加載因子是0.75f,每次擴容一倍。是一個異步式線程不安全的映射

Hashtable---不允許鍵或者值爲null。默認的初始容量是11,加載因子是0.75f。是一個同步式線程安全的映射

ConcurrentHashMap---異步式線程安全的映射

練習:

輸入一個數以及對應個數的鍵值對-> 鍵升序排序,如果出現了重複的鍵,對應的值求和

5

2 6

1 7

3 9

2 8

5 0

->

1 7

2 14

3 9

5 0

         list與Set、Map區別及適用場景

1、List,Set都是繼承自Collection接口,Map則不是
2、List特點:元素有放入順序,元素可重複 ,Set特點:元素無放入順序,元素不可重複,重複元素會覆蓋掉,(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的,加入Set 的Object必須定義equals()方法 ,另外list支持for循環,也就是通過下標來遍歷,也可以用迭代器,但是set只能用迭代,因爲他無序,無法用下標來取得想要的值。) 

3.Set和List對比: 
Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。 
List:和數組類似,List可以動態增長,查找元素效率高,插入刪除元素效率低,因爲會引起其他元素位置改變。 

4.Map適合儲存鍵值對的數據

5.線程安全集合類與非線程安全集合類 

LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;
HashMap是非線程安全的,HashTable是線程安全的;
StringBuilder是非線程安全的,StringBuffer是線程安全的。

下面是具體的使用介紹:

ArrayList與LinkedList的區別和適用場景

Arraylist:

優點:ArrayList是實現了基於動態數組的數據結構,因爲地址連續,一旦數據存儲好了,查詢操作效率會比較高(在內存裏是連着放的)。

缺點:因爲地址連續, ArrayList要移動數據,所以插入和刪除操作效率比較低。   

LinkedList:

優點:LinkedList基於鏈表的數據結構,地址是任意的,所以在開闢內存空間的時候不需要等一個連續的地址,對於新增和刪除操作addremoveLinedList比較佔優勢LinkedList 適用於要頭尾操作或插入指定位置的場景

缺點:因爲LinkedList要移動指針,所以查詢操作性能比較低。

適用場景分析:

 當需要對數據進行對此訪問的情況下選用ArrayList,當需要對數據進行多次增加刪除修改時採用LinkedList。

 

ArrayList與Vector的區別和適用場景

 ArrayList有三個構造方法:

Java代碼  

1. public ArrayList(int initialCapacity)//構造一個具有指定初始容量的空列表。    

2. public ArrayList()//構造一個初始容量爲10的空列表。    

3. public ArrayList(Collection<? extends E> c)//構造一個包含指定 collection 的元素的列表   

 Vector有四個構造方法:

Java代碼  

1. public Vector()//使用指定的初始容量和等於零的容量增量構造一個空向量。    

2. public Vector(int initialCapacity)//構造一個空向量,使其內部數據數組的大小,其標準容量增量爲零。    

3. public Vector(Collection<? extends E> c)//構造一個包含指定 collection 中的元素的向量    

4. public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量構造一個空的向量    

 

ArrayListVector都是用數組實現的,主要有這麼三個區別:
1.Vector是多線程安全的,線程安全就是說多線程訪問同一代碼,不會產生不確定的結果。而ArrayList不是,這個可以從源碼中看出,Vector類中的方法很多有synchronized進行修飾,這樣就導致了Vector在效率上無法與ArrayList相比;

2.兩個都是採用的線性連續空間存儲元素,但是當空間不足的時候,兩個類的增加方式是不同。

3.Vector可以設置增長因子,而ArrayList不可以。

4.Vector是一種老的動態數組,是線程同步的,效率很低,一般不贊成使用。

適用場景分析:

1.Vector是線程同步的,所以它也是線程安全的,而ArrayList是線程異步的,是不安全的。如果不考慮到線程的安全因素,一般用ArrayList效率比較高。
2.如果集合中的元素的數目大於目前集合數組的長度時,在集合中使用數據量比較大的數據,用Vector有一定的優勢。

HashSet與Treeset的適用場景

1.TreeSet 是二差樹(紅黑樹的樹據結構)實現的,Treeset中的數據是自動排好序的,不允許放入null 
2.HashSe是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重複,就如數據庫中唯一約束 

3.HashSet要求放入的對象必須實現HashCode()方法,放入的對象,是以hashcode碼作爲標識的,而具有相同內容的String對象,hashcode是一樣,所以放入的內容不能重複。但是同一個類的對象可以放入不同的實例

   適用場景分析:HashSet是基於Hash算法實現的,其性能通常都優於TreeSet。爲快速查找而設計的Set,我們通常都應該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet

                           HashMap與TreeMap、HashTable的區別及適用場景 

HashMap 非線程安全  

HashMap基於哈希表實現。使用HashMap要求添加的鍵類明確定義了hashCode()equals()[可以重寫hashCode()equals()],爲了優化HashMap空間的使用,您可以調優初始容量和負載因子。 

TreeMap:非線程安全基於紅黑樹實現。TreeMap沒有調優選項,因爲該樹總處於平衡狀態。 

適用場景分析:

HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允許空鍵值,而HashTable不允許。

HashMap適用於Map中插入、刪除和定位元素。 

Treemap適用於按自然順序或自定義順序遍歷鍵(key) 

 

 





File

代表文件或者目錄(文件夾)的類。

E:\\a.txt

File(String pathname)---代表了一個file對象;如果文件不存在,不會創建。在創建file對象的時候,並不會去計算機中檢查文件是否存在,只是把傳入的路徑標誌爲一個file對象

重要方法

創建

createNewFile()---當文件不存在的時候,會創建一個新文件。---要求文件存放的路徑要真實存在。---只能用於創建文件而不能創建目錄

mkdir()---創建目錄---只能用於創建目錄。---只能創建一層目錄

mkdirs()---創建多級目錄

刪除

delete()---用於刪除文件或者目錄。---從計算機中真正移除,無法撤銷。---如果刪除的是目錄且該目錄下存在子目錄或者子文件,此時無法刪除

判斷

isFile()---判斷是否是一個文件

isDirectory()---判斷是否是一個目錄

canWrite()---判斷文件是否可寫

isHidden()---判斷是否是一個隱藏文件

exists()---判斷是否真實存在

獲取

listFiles()---獲取子文件和子目錄組成的數組

getName()---獲取文件名

lastModified()---獲取文件最後一次修改時間的---獲取的是一個毫秒值---long

設置

setLastModified(long time)---設置最後一次修改時間

練習:刪除目錄

寫成了一個方法:獲取這個目錄下的子文件和子目錄---遍歷數組---如果是子文件的話,直接刪除;如果是子目錄的話,後續的功能和當前方法的功能一致的,直接調用當前方法--遞歸

練習:統計Java文件的個數和class文件的個數

寫一個方法:獲取工作空間下的所有的子文件和子目錄---如果是子目錄的話,遞歸;如果是子文件,需要判斷是否是一個Java文件或者class文件

路徑

絕對路徑:以盤符或者/開頭的路徑。絕對路徑的計算和當前文件的路徑沒有任何關係。

相對路徑:不以盤符或者/開頭的路徑。 .. 表示上一層路徑---在計算的時候需要以當前路徑爲基準進行計算

練習:提取所有的docx文件-> E:\\DOCX

 


 


發佈了1 篇原創文章 · 獲贊 12 · 訪問量 6813
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章