国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java集合

2019-11-06 08:26:41
字體:
來源:轉載
供稿:網友

java集合就像是一種容器,可以將多個對象(其實是對象的引用)丟入其中。Java集合分為Set、List、Queue和Map四大類,集合類又稱容器類。

Set代表無序不重復的集合List代表有序可重復的集合Queue代表隊列集合Map代表映射關系集合

這里寫圖片描述

有圖可知,如果訪問List集合,我們可以通過元素的索引來訪問,如果訪問Map集合中的元素,可以根據每項的key來訪問其value,但是如果訪問set集合中的元素,則只能根據元素本身來訪問(因而不能重復)。

Java5之前,Java集合會丟失放入其中的對象的數據類型,把所有對象都當成Object類型來處理。Java5 增加泛型之后,Java集合可以記住容易中對象的數據類型,從而可以編寫出更簡潔、更健壯的代碼。

1、集合概述

加入我們需要存放多個數據,可以考慮放在數組中,但是放在數組中的問題是,數組長度不可變,而且數組不能保存映射關系的數據。

為了保存不確定長度的數據和保存具有映射關系的數據(也被稱為關聯數組),Java提供了集合類。所有集合類都位于java.util包下,后來為了處理多線程環境下的并發安全問題,java 5在java.util.concurrent包下提供了一些多線程支持的集合類。

集合類和數組不一樣,數組既可以保存基本類型數據,又可以保存引用類型的數據(其實保存的就是引用)。但是集合類中只能保存引用類型的數據。

Java集合類主要由Collection和Map兩個接口派生出來的,這兩個是根接口,其下包含了很多子接口和實現類。

Collection接口

Map接口

其中顏色重的表示最常用的實現類。

2、Collection和Iterator接口

Collection接口是Set、List和Queue的父接口,因而Collection接口中定義的方法,是三個子接口的公共方法。

添加對象,add(o)、addAll(c)、查找對象,contains(o)、containsAll(c)刪除對象,remove(o)、removeAll(c)、retainAll(c)、clear容器大小,isEmpty()、size()其他,iterator()、toArray()

2.1 使用Lambda表達式來遍歷集合

Java8中提供了新的函數式接口包以及4個函數式接口。 java.util.function這個包,提供了4個核心接口,

功能型接口,Function

public Interface Function<T,R>{ public R apply(T t);}

此接口需要接收一個參數,并且返回一個處理結果。

消費型接口,Consumer

public Interface Consumer<T>{ public void accept(T t);}

此接口只負責接收數據,并不返回處理結果。

供給接口,Supplierpublic interface Supplier<T>{ public T get();}

此接口不接受參數,但可以返回結果 4. 斷言型接口,PRedicate public interface Predicate<T>{ public boolean test(T t); } 進行判斷操作使用

Jdk1.8 中有以上的四個功能型接口,所以一般很少會由用戶定義新的函數式接口。

觀察函數式接口,特征是接收參數,并且返回處理結果 String有個public boolean startsWith(String str)

Function<String, Boolean> fun = "##hello" :: startsWith;Syso(fun.apply("##")); //返回true

消費型接口

class MyDemo{ public void print(String s){ //此方法有參數無返回值 syso(s); }}//mainConsumer<String> cons = new MyDemo() :: print;cons.accept("Hello Java");

供給型接口, 例如String類的toUpperCase()方法,public String toUpperCase();

Supplier sup = "hello" :: toUpperCase();syso(sup.get());

斷言型接口 String

Predicate<String> pre = "hello" :: equalsIgnoreCase;syso(pre.test("Hello")); //true

這幾個接口包含了所有可能出現的方法引用,也是函數式接口的代表,有許多的接口與他們類似,例如Function中有個DoubleToIntFunction,其中的apply方法int applyAsInt(double value); 只能接收double轉換為int。

3、Set集合

Set集合和Collection基本相同,沒有添加額外的方法,實際上Set集合就是Collection,只是行為略有不同,不能添加重復的元素。

如果把兩個相同的元素add()到同一個集合,會返回false。

Set集合有三種常見的實現類,HashSet、TreeSet、EnumSet。

3.1 HashSet

HashSet是Set接口的典型實現類,我們使用的Set大多數都是這個Set。HashSet是按照Hash算法來存儲集合中的元素,因此具有很好的存取和查找性能。

HashSet具有以下特點:

不能保證元素的排列順序,順序可能與添加元素的順序不一致;HashSet不是同步的,加入有多個線程來操作同一個HashSet,必須通過代碼來同步;元素值可以為null。

當向HashSet中存入一個值時,HashSet會調用這個對象的hashCode()方法,獲得該對象的hash值,然后根據這個值決定其在HashSet中存儲的位置。如果兩個對象通過equals方法得到的值相同,但是他們的Hash值不同,他們仍將被存儲在不同的位置。

HashSet判斷兩個元素對象相等的標準是equals()方法比較相等,并且兩個對象的hashCode()值也相等。

要注意的一點是,當把一個對象放入到HashSet中時,如果重寫了這個對象對應類的equals方法,則應該也重寫該類的hashCode()方法。規則是,如果兩個對象,通過equals方法返回true,則兩個對象的hashCode值也應該相同。如果兩個hashCode不同,則會被Set都存儲,則Set中就會存在兩個值一樣的對象,這是不符合Set規范的。如果兩個對象的hashCode值相同,但是equals比較的值不同,這個也是不對的。如果兩個對象的hashCode相同,HashSet會試圖將他們保存在同一個位置,結果發現已經有數據,則會在這個位置使用鏈式結構


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 锡林浩特市| 临邑县| 九龙城区| 雷州市| 蛟河市| 湖口县| 嵩明县| 祥云县| 长子县| 兴隆县| 积石山| 正定县| 砚山县| 城固县| 昆山市| 常山县| 巴马| 乌拉特前旗| 庄河市| 定兴县| 乌苏市| 偃师市| 巴里| 梁河县| 临猗县| 弥勒县| 大荔县| 绥滨县| 桦川县| 三门峡市| 正安县| 新河县| 龙里县| 丹寨县| 嘉禾县| 柳江县| 河曲县| 平塘县| 北票市| 马尔康县| 奉节县|