黑馬程式設計師 集合 (上)

2021-07-09 14:42:04 字數 3964 閱讀 5344

1集合類的資料結構

1.1集合的概念

集合是儲存物件最常用的一種方式,方便操作物件,面向對像的核心是物件,我們要操作多個隊形,就需要將這多個物件儲存起來,集合就是儲存多個物件的乙個容器。

(集合中儲存的都是物件的引用-位址值,不可能儲存物件實體 )

1.2集合的特點

(1) 集合只用於儲存物件。

(2) 集合長度是可變的。(與陣列不同)

(3) 集合可以儲存不同型別的物件(不加泛型的情況下)

1.3集合和陣列的區別

(1)   物件多使用集合儲存;資料多使用陣列儲存。

(2 )  陣列雖然也可以儲存物件,但長度是固定的;集合長度是可變長度的。

(3)   陣列中儲存的是同一類物件,還可以儲存基本資料型別;集合只能儲存物件。 

(4)   陣列儲存資料型別是固定的,而集合儲存的資料型別不固定 

2 collection 介面

有兩個常用的介面 list 和 set。在 list介面中有常用類 arraylist、linkedlist 和 vector;在 set 介面中有類 hashset、treeset。

2.1 set介面與list介面的區別

list : 元素是有序的,元素可以重複。因為該集合體系有索引。

set:  元素是無序的,元素不可重複 

3 list介面的子類  arraylist

3.1

arraylist a =new arraylist();// 建立 arraylist 的子類物件  底層的資料結構使用的是陣列結構。構造初始容量為10的空列表,當超過長度時,按50%延長集合長度

3.2方法

新增:

boolean add(e e);

//新增指定元素;接收的是乙個 object 型別物件,在接收的時候已經向上轉型,

也就是說存進去以後,存的就已經是 object。

boolean addall(collection<? extends e> c); //新增集合。一次新增一堆元素

刪除:void clear( );  //清空容器。移除 collection 中的所有元素(可操作)

boolean remove(object o); //移除乙個指定元素

boolean removeall(collection<? > c); 

//移除一堆

判斷:int size();  //獲取集合長度,若為 0,則為空,沒有元素。

boolean isempty();  //若不包含元素,返回 ture。

其他:boolean contains();  //包含指定元素,返回 ture。判斷是否含有某個元素。

boolean containsall(collection c);

//判斷是否含有指定集合中的所有元素,只有所有資料都包含才返回 true

int hashcode( ); //返回此 collection 的雜湊碼值

iterator iterator( ); //返回此元素上進行的迭代器,用於遍歷集合中的元素

boolean retainall( ); //取交集。只在呼叫者中保留共同的交集元素。

//如果有兩個集合 a 和 b。a 對 b 做交集,a 集合儲存的是交集元素。b 集合不

會發生改變。返回值表示的是 a 集合是否發生過改變

eg:        a.add("張三");//新增單個物件

a.add("李四");

arraylist a2=new arraylist();

a2.add("趙四");

a2.add("王五");

a.addall(a2);//新增另乙個集合

3.3 linkedlist

arraylist 是單鏈表,而linkedlist   是雙鏈表,

方法linklist的特有功能

·               public voidaddfirst(e e)及addlast(e e)

·               public egetfirst()及getlast()

·               public eremovefirst()及public e removelast()

public e get(int index);

3.4   arraylist 與linkedlist   的區別

arraylist 其實是包裝了乙個陣列,當例項化乙個

arraylist

時,乙個陣列也被例項化,當向

arraylist

中新增物件是,陣列的大小也相應的改變。這樣就帶來以下有缺點:快速隨即訪問

你可以隨即訪問每個元素而不用考慮效能問題,通過呼叫

get(i)

方法來訪問下標為

i的陣列元素。向其中新增物件速度慢

當你建立陣列是並不能確定其容量,所以當改變這個陣列時就必須在記憶體中做很多事情。操作其中物件的速度慢

當你要想陣列中任意兩個元素中間新增物件時,陣列需要移動所有後面的物件。

linkedlistlinkedlist

是通過節點直接彼此連線來實現的。每乙個節點都包含前乙個節點的引用,後乙個節點的引用和節點儲存的值。當乙個新節點

插入時,只需要修改其中保持先後關係的節點的引用即可,當刪除記錄時也一樣。這樣就帶來以下有缺點:操作其中物件的速度快

只需要改變連線,新的節點可以在記憶體中的任何地方不能隨即訪問

雖然存在

get()

方法,但是這個方法是通過遍歷接點來定位的所以速度慢。說白了,就是資料結構中的順序儲存和鏈式儲存。

4 set介面

set: 元素是無序,元素不可以重複  ,set繼承乙個不包括重複元素的collection set集合的功能和collection是一致的。

4.1   hashset    

是set介面的實現子類,其資料結構是雜湊表。

其唯一性的原理:

當hashset呼叫add()方法儲存物件的時候, 先呼叫物件的hashcode()方法得到乙個雜湊值, 然後在集合中查詢是否有雜湊值相同的物件

如果沒有雜湊值相同的物件就直接存入集合

如果有雜湊值相同的物件, 就和雜湊值相同的物件逐個進行equals()比較,比較結果為false就存入, true則不存

.將自定義類的物件存入hashset去重複

類中必須重寫hashcode()和equals()方法

hashcode(): 屬性相同的物件返回值必須相同, 屬性不同的返回值盡量不同(提高效率)

equals(): 屬性相同返回true, 屬性不同返回false,返回false的時候儲存

eg:/*寫乙個演算法 將鍵盤輸入的字元中重複的字元去掉 */

//1 獲取鍵盤輸入流     

scanner sc=new scanner (system.in);

//2  建立hashset 物件,將字元儲存,去掉重複

hashseths=new  hashset<>();      

string line=sc.nextline();

char arr=line.tochararray();

for(char c: arr){

hs.add(c);

//遍歷hashset,列印每乙個字元

for(character ch:hs){

system.out.println(ch);

黑馬程式設計師 集合

collection list 元素是有序的,元素可以重複。因為該集合體系有索引。arraylist 底層的資料結構使用的是陣列結構。特點 查詢速度很快。但是增刪稍慢。執行緒不同步。linkedlist 底層使用的鍊錶資料結構。特點 增刪速度很快,查詢稍慢。執行緒不同步。vector 底層是陣列資料...

黑馬程式設計師 集合

asp.net unity開發 net培訓 期待與您交流!1.集合類 為什麼會出現集合類?面對物件語言對事物的體現都是以物件的形式,所以為了方便對多個物件的操作,就對物件進行儲存,集合就是儲存物件最常用的一種方式。集合類的特點 集合只用於儲存物件,集合的長度是可變的,集合可以儲存不同型別的物件。集合...

黑馬程式設計師 集合

集合 string類 字串是乙個特殊的物件。字串一旦初始化就不可以被改變。string str abc string str1 new string abc 基本資料型別物件包裝類 將基本資料型別封裝成物件的好處在於可以在 物件中定義更多的功能方法操作該資料。常用的操作之一 用於基本資料型別與字串 ...