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 基本資料型別物件包裝類 將基本資料型別封裝成物件的好處在於可以在 物件中定義更多的功能方法操作該資料。常用的操作之一 用於基本資料型別與字串 ...