標籤:eset iterator 比較 err tor color === 假設 體系
集合的體系:
---------| collection 單例集合的根介面
--------------| List 如果實現了list介面的集合類,具備的特點:有序,可重複 註:集合中的有序不是指自然順序,而是指添加進去的順序與出來的順序是一致的
------------------| ArrayList ArrayList底層維護了一個object數組的實現的。(線程不安全),特點:查詢速度快,增刪速度慢。(有序,可重複)
------------------| LinkedList LinkedList底層是使用鏈表結構實現的,特點:查詢速度慢,增刪速度快。(有序,可重複)
------------------| Vector(瞭解即可) 底層也是維護一個Object數組的實現的,實現與ArrayList是一樣的,但是Vector是安全執行緒的,操作效率低
--------------| Set 如果實現了set介面的集合類,具備的特點:無序,不可重複 註:集合中的無序不是指自然順序,而是指添加元素進去的順序與元素出來的順序是不一致的
------------------| HashSet Set介面的實現,特點:沒有特定的順序,不允許有重複的元素。
------------------| TreeSet Set介面的實現,特點:沒有特定的順序,不允許有重複的元素。
1、HashSet 集合
HashSet集合是Set介面(集合)的一個實現;集合中的元素:無序,且不可重複性
1.1、HashSet 集合常用方法
add(Object):將指定的元素添加到集合中
remove(object):從HashSet集合中移除指定的元素
size():返回當前集合中元素的個數
iterator():返回此集合中的元素的迭代器
toArray():返回一個包含此集合中所有元素的數組 相當於把集合轉換成數組的形式
contain(object):判斷某元素是否在HashSet集合中(內含項目關聯性)
其實這幾個集合的常用方法幾乎一樣,比如 collection集合的一些常用方法
1.2、HashSet 集合不能添加重複元素的原理
當調用add(Object)方法添加元素的時,首先會調用Object的hashCode方法判雜湊碼是否已經存在,如不存在則直接插入元素;如果已存在,則再去調用Object對象的equals()方法,判斷是否返回true,如果為true則說明元素已經存在,就不能再往HashSet集合中添加元素了;如為返回false,則說明元素不存在,可以繼續往HashSet集合中插入元素。
1.3、執行個體
1 package com.dhb.collection; 2 3 import java.util.HashSet; 4 5 /** 6 * @author DSHORE / 2018-5-21 7 * 8 */ 9 /* HashSet的實現原理:往HasSet添加元素的時候,會先調用hashCode方法得到元素的咍希值,然後通過元素的雜湊值經過移運算,就可以算出該元素儲存在咍希表的儲存位置。10 * 1、如果算出該元素雜湊碼值的儲存位置處還沒有任何的元素,那麼該元素可以直接儲存到該位置上11 * 2、如果算出該元素雜湊碼值的儲存位置處已經有元素了,那麼就會調用該元素的equals方法與該位置的元素做一次比較,如果equals傳回值是true,那麼該元素與這個位置已經存在的元素就被視為重複元素,不允許再添加了;如果equals返回的是false,那麼該元素還可以添加進集合裡。12 * */13 class Personer{14 int id;15 String name;16 17 public Personer(int id,String name) {18 this.id=id;19 this.name=name;20 }21 @Override22 public String toString() {//重寫toString()的作用:讓傳回值以字串的形式輸出;若不重寫,傳回值則是記憶體位址23 return "Person [id=" + id + ", name=" + name + "]";24 }25 @Override26 public int hashCode() {//重寫hashCode()的作用:只通過id來作判斷27 System.out.println("========HashCode========");//輸出了5遍 原因:只要add()多少次,hashCode()就運行多少遍。28 return id;29 }30 @Override31 public boolean equals(Object obj) {//重寫equals()的作用:用id來判斷是否是同一個元素32 System.out.println("======這是equals方法========");//輸出了一遍 原因:只需要進行判斷的元素,equals()才運行。 如:只有狗娃處,才需要判斷(因為只與id有關)33 Personer p=(Personer)obj;34 return this.id==p.id;35 }36 }37 public class Demo11 {38 39 public static void main(String[] args) {40 HashSet<Personer> set=new HashSet<Personer>();//<Personer>:表示泛型41 set.add(new Personer(110,"狗娃"));42 set.add(new Personer(120,"狗剩"));43 set.add(new Personer(119,"狗蛋"));44 set.add(new Personer(1000,"狗蛋"));45 46 //假設只要編號一致,就是同一個人47 System.out.println("添加元素成功了嗎? "+set.add(new Personer(110, "狗娃")));//傳回值:false 如果不重寫equals()方法,那麼傳回值為true。原因在代碼最上面48 System.out.println(set);//傳回值:[Person [id=119, name=狗蛋], Person [id=110, name=狗娃], Person [id=10000, name=狗蛋], Person [id=120, name=狗剩]]49 }50 }
例2
1 package com.dhb.collection; 2 3 /** 4 * @author DSHORE / 2018-5-21 5 * 6 */ 7 public class Demo13 { 8 public static void main(String[] args) { 9 String str1="hello";10 String str2=new String("hello");11 System.out.println("兩個是同一個對象?"+(str1==str2));//傳回值:false12 System.out.println("str1的hasCode:"+str1.hashCode());//傳回值:9916232213 System.out.println("str2的hasCode:"+str2.hashCode());//傳回值:9916232214 /*15 * HashCode預設情況下表示的記憶體位址,String類已經重寫了Object的hasCode方法16 * 注意:如果兩個字串的內容一致,那麼返回的hashCode碼也會一致17 * */18 }19 } 2、TreeSet 集合
TreeSet集合也是Set介面(集合)的一個實現;集合中的元素:無序,且不可重複性
2.1、
原創DSHORE 作者首頁:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/9068474.html 歡迎轉載,轉載務必說明出處。(如果本文對您有協助,可以點擊一下右下角的 推薦,或評論,謝謝!) |
java基礎33 Set集合下的HashSet集合和TreeSet集合