Java容器---Set: HashSet TreeSet LinkedHashSet
1.Set接口概述
?????? Set 不保存重復的元素(如何判斷元素相同呢?)。如果你試圖將相同對象的多個實例添加到Set中,那么它就會阻止這種重復現象。 Set中最常被使用的是測試歸屬性,你可以很容易地詢問某個對象是否在某個Set中。 正因如此,查找就成為了Set中最重要的操作,因此你通常都會選擇一個HashSet 的實現,它專門對快速查找進行了優化。
??????? Set具有與Collection完全一樣的接口,因此沒有任何額外的功能,不像前面的List。實際上Set就是Collection,只是行為不同。(這是繼承與多態思想的典型應用:表現不同的行為)。Set 是基于對象的值來確定歸屬性的。
java.util Interface Set<E> |
| 參數類型 E? : 由此集合維護的元素的類型所有超類接口:Collection <E>, Iterable <E>所有子類接口:NavigableSet <E>, SortedSet <E>所有已知實現類: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet ,??HashSet , JobStateReasons ,LinkedHashSet,TreeSet |
2.Set常用實現類
(1)HashSet
???? HashSet繼承AbstractSet類,實現Set、Cloneable、Serializable接口。由哈希表支持(實際上是一個HashMap實例,基于
HashMap來實現的,底層采用HashMap來保存元素。),天生就是為了提高查找效率的。
| ???????????????? |
?
構造方法 |
所有方法 |
(2)TreeSet
? ?? TreeSet 繼承AbstractSet類,實現NavigableSet、Cloneable、Serializable接口。與HashSet是基于HashMap實現一樣,TreeSet 同樣是基于TreeMap 實現的。由于得到Tree 的支持,TreeSet 最大特點在于排序,它的作用是提供有序的Set集合。
| 參數類型 |
構造方法 |
常用方法 |
(3)LinkedHashSet
????? LinkedHashSet 綜合了鏈表+哈希表,根據元素的hashCode值來決定元素的存儲位置,它同時使用鏈表維護元素的次序。
????? 當遍歷該集合時候,LinkedHashSet 將會以元素的添加順序訪問集合的元素。
????? 對于 LinkedHashSet 而言,它繼承與 HashSet、又基于 LinkedHashMap 來實現的。
| public class LinkedHashSet<E> extends HashSet<E> implements Set<E>,Cloneable,Serializable 參數類型E ---由此集合維護的元素的類型 All Implemented Interfaces(實現接口): |
構造方法 |
方法(基本都是繼承方法) |
3.set演示
(1)HashSet
1 public class HashSetDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 //1,創建一個Set容器對象。 9 Set set = new HashSet();//如果該成LinkedHashSet,可實現有序。 10 11 //2,添加元素。 12 set.add("abc"); 13 set.add("nba"); 14 set.add("heihei"); 15 set.add("haha"); 16 set.add("heihei"); 17 18 //3,只能用迭代器取出。 19 for (Iterator it = set.iterator(); it.hasNext();) { 20 System.out.println(it.next()); 21 } 22 23 } 24 25 } 26(2)TreeSet?
1 public class TreeSetDemo2 { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 //初始化TreeSet集合明確一個比較器。 9 Set set = new TreeSet(new ComparatorByName()); 10 11 set.add(new Student("xiaoqiang",20)); 12 set.add(new Student("daniu",24)); 13 set.add(new Student("xiaoming",22)); 14 set.add(new Student("tudou",18)); 15 set.add(new Student("daming",22)); 16 set.add(new Student("dahuang",19)); 17 18 for (Iterator it = set.iterator(); it.hasNext();) { 19 Student stu = (Student)it.next(); 20 System.out.println(stu.getName()+"::"+stu.getAge()); 21 } 22 } 23 24 } 25 /**/ 26 * 自定義一個比較器,用來對學生對象按照姓名進行排序。 27 * @author Administrator 28 * 29 */ 30 public class ComparatorByName extends Object implements Comparator { 31 32 @Override 33 public int compare(Object o1, Object o2) { 34 35 Student s1 = (Student)o1; 36 Student s2 = (Student)o2; 37 38 int temp = s1.getName().compareTo(s2.getName()); 39 40 return temp==0?s1.getAge()-s2.getAge():temp; 41 } 42 43 } 44 / 45 public class Student implements Comparable { 46 47 private String name; 48 private int age; 49 50 public Student() { 51 super(); 52 53 } 54 public Student(String name, int age) { 55 super(); 56 this.name = name; 57 this.age = age; 58 } 59 60 61 62 /** 63 * 覆蓋hashCode方法。根據對象自身的特點定義哈希值。 64 */ 65 public int hashCode(){ 66 final int NUMBER = 37; 67 return name.hashCode() + age*NUMBER; 68 } 69 70 /** 71 * 需要定義對象自身判斷內容相同的依據。覆蓋equals方法。 72 * 73 */ 74 public boolean equals(Object obj){ 75 76 if(this == obj){ 77 return true; 78 } 79 80 if(!(obj instanceof Student)){ 81 throw new ClassCastException("類型錯誤"); 82 } 83 84 Student stu = (Student)obj; 85 86 return this.name.equals(stu.name)&& this.age == stu.age; 87 } 88 89 public String getName() { 90 return name; 91 } 92 public void setName(String name) { 93 this.name = name; 94 } 95 public int getAge() { 96 return age; 97 } 98 public void setAge(int age) { 99 this.age = age; 100 } 101 @Override 102 public String toString() { 103 return "Student [name=" + name + ", age=" + age + "]"; 104 } 105 /** 106 * 學生就具備了比較功能。該功能是自然排序使用的方法。 107 * 自然排序就年齡的升序排序為主。 108 */ 109 @Override 110 public int compareTo(Object o) { 111 112 Student stu = (Student)o; 113 // System.out.println(this.name+":"+this.age+"........"+stu.name+":"+stu.age); 114 /* 115 if(this.age>stu.age) 116 return 1; 117 if(this.age<stu.age) 118 return -1; 119 return 0; 120 */ 121 122 /* 123 * 既然是同姓名同年齡是同一個人,視為重復元素,要判斷的要素有兩個。 124 * 既然是按照年齡進行排序。所以先判斷年齡。在判斷姓名。 125 */ 126 int temp = this.age - stu.age; 127 128 return temp==0?this.name.compareTo(stu.name):temp; 129 130 } 131 132 133 } 134?
2018-01-05
內容來自API1.8、Java編程思想、傳智播客課程
轉載于:https://www.cnblogs.com/zhuweiheng/p/8203763.html
總結
以上是生活随笔為你收集整理的Java容器---Set: HashSet TreeSet LinkedHashSet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vivado下创建基本时序周期约束
- 下一篇: 计蒜客第三场