99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

第10篇-JAVA 集合框架-JAVA 泛型

2022-03-11 11:31 更新
  • 每篇一句 :所有的不甘,都是因?yàn)檫€心存夢(mèng)想
  • 初學(xué)心得: 不是每件事都注定會(huì)成功,但是每件事都值得一試
  • (筆者:JEEP/711)[JAVA筆記 | 時(shí)間:2017-04-15| JAVA 集合框架/JAVA 泛型 ]

1.JAVA 集合框架概念

通俗的說(shuō),集合就是一個(gè)存放數(shù)據(jù)的容器,準(zhǔn)確的說(shuō),就是放數(shù)據(jù)對(duì)象引用的容器
數(shù)組和集合都是容器,有何不同?
數(shù)組長(zhǎng)度固定,集合長(zhǎng)度可變
數(shù)組只能存放相同類型的數(shù)據(jù),集合可以存放不同類型的數(shù)據(jù)
數(shù)組可存放簡(jiǎn)單數(shù)據(jù)類型和類類型的數(shù)據(jù),集合只能存放類類型數(shù)據(jù)
JAVA集合框架:java中用來(lái)表示集合,和操作集合的所有類庫(kù)的統(tǒng)稱
JAVA中的集合從大方向分有兩種:Collection 集合,Map 集合,它們都繼承自O(shè)bject
Alt text
Collection又有兩個(gè)分支
1.List(列表),2.Set(集合),List和Set也都是接口
List接口的特點(diǎn): 集合中的元素有順序,能重復(fù)

集合中分為三大接口:
Collcction、Map(映射)、Itcrator(迭代的父類接口)
集合框架的接口和類在java.util包中
Collcction分支為兩個(gè)子接口list(列表接口),set(集合接口)

集合框架List接口
有序的接口,此接口的用戶可以對(duì)列表中的每個(gè)元素的插入位置進(jìn)行
精確的控制,用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問(wèn)元素,并索列表中的元素
List實(shí)現(xiàn)類ArrayList,Vector,LinkedList
1.ArrayList是底層用數(shù)組實(shí)現(xiàn)的List
特點(diǎn):查詢效率高,增刪效率低, 線程不安全
2.LinkedList是底層用雙向循環(huán)鏈表實(shí)現(xiàn)的List
特點(diǎn):查詢效率低,增刪效率高
3.Vector: 底層用數(shù)組實(shí)現(xiàn)List接口的另一個(gè)類
特點(diǎn):重量級(jí),占據(jù)更多的系統(tǒng)開(kāi)銷,線程安全

集合框架Set接口
Set接口特點(diǎn)是集合中的元素?zé)o順序(存入和取出的順序不一定一致),不能重復(fù)
Set接口一個(gè)不包含重復(fù)元素的collection,更確切的講,set不包含滿足e1.equal(e2)的元素
對(duì)e1和e2,并且最多包含一個(gè)null元素,正如其名稱所暗示的,此接口模仿了數(shù)學(xué)上的set抽象
HashSet類實(shí)現(xiàn)Set接口,由哈希表(實(shí)際上是一個(gè)HashMap實(shí)例)支持,它不保證set的迭代順序,特別是它不保證該順序恒久不變,此類允許使用null元素
TreeSetLinkedHashSet

Set和List的區(qū)別
● 1. Set 接口實(shí)例存儲(chǔ)的是無(wú)序的,不重復(fù)的數(shù)據(jù)。List 接口實(shí)例存儲(chǔ)的是有序的,可以重復(fù)的元素
● 2. Set檢索效率低下,刪除和插入效率高,插入和刪除不會(huì)引起元素位置改變 <實(shí)現(xiàn)類有HashSet,TreeSet&
● 3. List和數(shù)組類似,可以動(dòng)態(tài)增長(zhǎng),根據(jù)實(shí)際存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度自動(dòng)增長(zhǎng)List的長(zhǎng)度。查找元素效率高,插入刪除效率低,因?yàn)闀?huì)引起其他元素位置改變 <實(shí)現(xiàn)類有ArrayList,LinkedList,Vector&
Set分支的常用類有:HashSet,TreeSet
1.HashSet:底層數(shù)據(jù)結(jié)構(gòu)是哈希表
特點(diǎn):增、刪集合中的元素速度快
2.TreeSet集合中的元素除了沒(méi)有順序和不能重復(fù)外,還會(huì)自然排序,這便是該集合的特點(diǎn)

集合框架Map接口
Map接口
特點(diǎn):K與V,鍵值對(duì),映射所維護(hù)的鍵的類型,映射值得類型
將鍵映射到值得對(duì)象,一個(gè)映射不能包含重復(fù)的鍵,每個(gè)鍵最多只能映射一個(gè)值
HashMapHashtable,TreeMapLinkedHashMap
1.HashMap:特點(diǎn):線程不安全 允許key或者value是null值
2.TreeMap特點(diǎn):按照鍵值排序,線程不安全

2.JAVA 集合實(shí)現(xiàn)類(集合類)

Java提供了一套實(shí)現(xiàn)了Collection接口的標(biāo)準(zhǔn)集合類。其中一些是具體類,這些類可以直接拿來(lái)使用,而另外一些是抽象類,提供了接口的部分實(shí)現(xiàn)

| 序號(hào) | 類描述 |
| :-------- | --------:|
| 1 | AbstractCollection 實(shí)現(xiàn)了大部分的集合接口 |
| 2 | AbstractList 繼承于AbstractCollection 并且實(shí)現(xiàn)了大部分List接口 |
| 3 | AbstractSequentialList 繼承于 AbstractList ,提供了對(duì)數(shù)據(jù)元素的鏈?zhǔn)皆L問(wèn)而不是隨機(jī)訪問(wèn) |
| 4 | LinkedList該類實(shí)現(xiàn)了List接口,允許有null(空)元素。主要用于創(chuàng)建鏈表數(shù)據(jù)結(jié)構(gòu),該類沒(méi)有同步方法,如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)List,則必須自己實(shí)現(xiàn)訪問(wèn)同步,解決方法就是在創(chuàng)建List時(shí)候構(gòu)造一個(gè)同步的List。例如:Listlist=Collections.synchronizedList(newLinkedList(...));LinkedList 查找效率低 |
| 5 | ArrayList該類也是實(shí)現(xiàn)了List的接口,實(shí)現(xiàn)了可變大小的數(shù)組,隨機(jī)訪問(wèn)和遍歷元素時(shí),提供更好的性能。該類也是非同步的,在多線程的情況下不要使用。ArrayList 增長(zhǎng)當(dāng)前長(zhǎng)度的50%,插入刪除效率低 |
| 6 | AbstractSet 繼承于AbstractCollection 并且實(shí)現(xiàn)了大部分Set接口 |
| 7 | HashSet該類實(shí)現(xiàn)了Set接口,不允許出現(xiàn)重復(fù)元素,不保證集合中元素的順序,允許包含值為null的元素,但最多只能一個(gè) |
| 8 | LinkedHashSet具有可預(yù)知迭代順序的 Set 接口的哈希表和鏈接列表實(shí)現(xiàn) |
| 9 | TreeSet該類實(shí)現(xiàn)了Set接口,可以實(shí)現(xiàn)排序等功能 |
| 10 | AbstractMap 實(shí)現(xiàn)了大部分的Map接口 |
| 11 | HashMap HashMap 是一個(gè)散列表,它存儲(chǔ)的內(nèi)容是鍵值對(duì)(key-value)映射,該類實(shí)現(xiàn)了Map接口,根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù),具有很快的訪問(wèn)速度,最多允許一條記錄的鍵為null,不支持線程同步 |
| 12 | TreeMap 繼承了AbstractMap,并且使用一顆樹(shù) |
| 13 | WeakHashMap 繼承AbstractMap類,使用弱密鑰的哈希表 |
| 14 | LinkedHashMap 繼承于HashMap,使用元素的自然順序?qū)υ剡M(jìn)行排序 |
| 15 | IdentityHashMap 繼承AbstractMap類,比較文檔時(shí)使用引用相等 |

3.迭代器

什么是迭代器?迭代器就是取出集合元素的方式
遍歷一個(gè)集合中的元素,例如,顯示集合中的每個(gè)元素
一般遍歷數(shù)組都是采用for循環(huán)或者增強(qiáng)for,這兩個(gè)方法也可以用在集合框架,但是還有一種方法是采用迭代器遍歷集合框架,它是一個(gè)對(duì)象,實(shí)現(xiàn)了Iterator 接口或ListIterator接口
迭代器,使你能夠通過(guò)循環(huán)來(lái)得到或刪除集合的元素
ListIterator 繼承了Iterator,以允許雙向遍歷列表和修改元素

迭代器方法:
使用 Java Iterator,通過(guò)實(shí)例列出Iterator和listIterator接口提供的所有方法

遍歷 ArrayList:



public class Demo{
public static void main(String[] args) {
List<String& list=new ArrayList<String&(); //實(shí)例化List集合
list.add("Hello"); //添加元素
list.add("World");
list.add("HAHAHAHA");
//第一種遍歷方法使用foreach遍歷List
for (String str : list) {
//也可以改寫(xiě)for(int i=0;i<list.size();i++)這種形式
System.out.println(str);
}
//第二種遍歷,把鏈表變?yōu)閿?shù)組相關(guān)的內(nèi)容進(jìn)行遍歷
String[] strArray=new String[list.size()];
list.toArray(strArray);
for(int i=0;i<strArray.length;i++) //這里也可以改寫(xiě)為 foreach(String str:strArray)這種形式{
System.out.println(strArray[i]);
}
//第三種遍歷 使用迭代器進(jìn)行相關(guān)遍歷
Iterator<String& ite=list.iterator();
while(ite.hasNext()){ //判斷下一個(gè)元素之后有值
System.out.println(ite.next());
}
}
}

三種方法都是用來(lái)遍歷ArrayList集合
第三種方法是采用迭代器的方法,該方法可以不用擔(dān)心在遍歷的過(guò)程中會(huì)超出集合的長(zhǎng)度

遍歷 Map:


public class Demo2{
public static void main(String[] args) {
Map<String, String& map = new HashMap<String, String&(); //實(shí)例化Map集合
map.put("1", "value1"); //添加元素
map.put("2", "value2");
map.put("3", "value3");
//NO1.:普遍使用,二次取值
System.out.println("通過(guò)Map.keySet遍歷key和value:");
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
//NO2.
System.out.println("通過(guò)Map.entrySet使用iterator遍歷key和value:");
Iterator<Map.Entry<String, String&& it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String& entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//NO3.:容量大時(shí)推薦使用此方法
System.out.println("通過(guò)Map.entrySet遍歷key和value");
for (Map.Entry<String, String& entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//NO4.
System.out.println("通過(guò)Map.values()遍歷所有的value,但不能遍歷key");
for (String v : map.values()) {
System.out.println("value= " + v);
}
}
}

集合是一個(gè)對(duì)象,可容納其他對(duì)象的引用。集合接口聲明對(duì)每一種類型的集合可以執(zhí)行的操作,集合框架的類和接口均在java.util包中
任何對(duì)象加入集合類后,自動(dòng)轉(zhuǎn)變?yōu)镺bject類型,所以在取出的時(shí)候,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換

4.JAVA 泛型

泛型的本質(zhì)是參數(shù)化類型,所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)
泛型方法:方法在調(diào)用時(shí)可以接收不同類型的參數(shù)。根據(jù)傳遞給泛型方法的參數(shù)類型,編譯器適當(dāng)?shù)靥幚砻恳粋€(gè)方法調(diào)用
定義泛型方法的規(guī)則
● 所有泛型方法聲明都有一個(gè)類型參數(shù)聲明部分(由尖括號(hào)分隔),該類型參數(shù)聲明部分在方法返回類型之前
● 每一個(gè)類型參數(shù)聲明部分包含一個(gè)或多個(gè)類型參數(shù),參數(shù)間用逗號(hào)隔開(kāi)。一個(gè)泛型參數(shù),也被稱為一個(gè)類型變量,是用指定一個(gè)泛型類型名稱的標(biāo)識(shí)符
● 類型參數(shù)能被用來(lái)聲明返回值類型,并且能作為泛型方法得到的實(shí)際參數(shù)類型的占位符
● 泛型方法體的聲明和其他方法一樣。注意類型參數(shù)只能代表引用型類型

public class Demo3{
// 泛型方法 printArray
public static < E & void printArray( E[] inputArray ){
// 輸出數(shù)組元素
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}

public static void main( String args[] ){
// 創(chuàng)建不同類型數(shù)組: Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
System.out.println( "整型數(shù)組元素為:" );
printArray( intArray ); // 傳遞一個(gè)整型數(shù)組
System.out.println( "\n雙精度型數(shù)組元素為:" );
printArray( doubleArray ); // 傳遞一個(gè)雙精度型數(shù)組
System.out.println( "\n字符型數(shù)組元素為:" );
printArray( charArray ); // 傳遞一個(gè)字符型數(shù)組
}
}



泛型類
泛型類的聲明和非泛型類的聲明類似,除了在類名后面添加了類型參數(shù)聲明部分
和泛型方法一樣,泛型類的類型參數(shù)聲明部分也包含一個(gè)或多個(gè)類型參數(shù),參數(shù)間用逗號(hào)隔開(kāi)。一個(gè)泛型參數(shù),也被稱為一個(gè)類型變量,是用于指定一個(gè)泛型類型名稱的標(biāo)識(shí)符,接受一個(gè)或多個(gè)參數(shù),這些類被稱為參數(shù)化的類或參數(shù)化的類型

public class Demo4<T& {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
Demo4<Integer& integerDemo = new Demo4<Integer&();
Demo4<String& stringDemo = new Demo4<String&();
integerDemo.add(new Integer(10));
stringDemo.add(new String("泛型類"));
System.out.printf("整型值為 :%d\n\n", integerDemo.get());
System.out.printf("字符串為 :%s\n", stringDemo.get());
}
}

初學(xué)(JAVA 集合框架/JAVA 泛型 高級(jí)階段) 難點(diǎn): ★★★★★

希望每一篇文章都能夠?qū)ψx者們提供幫助與提升,這乃是每一位筆者的初衷

感謝您的閱讀 歡迎您的留言與建議

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)