這篇博客主要是復習一下java中集合框架Set接口。
1.Set接口
public interface Set extends Collection
一個不包含重復元素的collection。更確切的說,set不包含滿足e1.equals(e2)的元素。對e1和e2,并且最多包含一個null元素。正如其名稱所暗示的,此接口模仿了數學上的set抽象
2.HashSet
public class HashSet extends AbstractSet implements Set,Clonable,Serializable
類實現Set接口,由哈希表(實際上是一個HashMap實例)支持。它不保證set的迭代順序:特別是它不保證該順序的恒久不變。此類允許使用null元素
HashSet注意事項
HashSet實現類: 1.不保證實現順序, 2.默認構造方法底層由HashMap實例的默認初始容量為16,加載因子為0.75 3.加載因子是hashset擴充的條件 4.判斷自定義對象是否相等的時候,要重寫hashCode()和equals()方法哦! HashCode值相同的時候再去調用equals方法,Hashcode值不同的時候則不用調用equals方法。public class Person { PRivate String name; private int age; public Person() { } public Person(String name,int age) { this.name=name; this.age=age; } public int getAge() { return age; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public void setName(String name) { this.name = name; } @Override public String toString() { return "name:"+name+"age:"+age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (age != person.age) return false; return name != null ? name.equals(person.name) : person.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; }}public static void hashset() { Set<String> set=new HashSet<String>(); set.add("空空"); set.add("蘭蘭"); set.add("泉彩"); set.add("島愛"); System.out.println("元素的個數是:"+set.size()); //不允許重復 // set.add("空空"); //存儲自定義對象 Set<Person> persons =new HashSet<Person>(); Person p1=new Person("空空",30); Person p2 =new Person("蘭蘭",29); Person p3=new Person("島愛",32); Person p4=new Person("泉彩",28); persons.add(p1); persons.add(p2); persons.add(p3); persons.add(p4); //這樣便可以把值插入進去,因為對象的內存地址不一樣 //為了避免這種情況,我們可以重寫hashcode()和equals()方法 //可以使用系統的自動生成 persons.add(new Person("空空",30)); System.out.println("一共有元素"+persons.size()); }3.TreeSet
TreeSet是有序的集合
public class TreeSet extends AbstractSet implements NavigableSet,Cloneable,Serializable
基于TreeMap的NavigableSet實現。使用元素的自然排序對元素進行排序,或者根據創建set時提供的Comparator進行排序,具體取決于使用的構造方法
TreeSet注意事項
1.使用元素的自然順序對元素進行排序 2.底層使用TreeMap實現(樹形結構) 3.在TreeSet集合中存儲自定義對象: 該對象必須實現Comparable接口,并且使用這個方法進行排除重復元素
public class Emp implements Comparable<Emp> { private String name; private int age; public Emp() { } public Emp(String name,int age) { this.name=name; this.age=age; } public String getName() { return name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Emp{" + "name='" + name + '/'' + ", age=" + age + '}'; } @Override public int compareTo(Emp o) { if(o==null) { throw new NullPointerException("對象不能為空"); } if(this.age<o.age) { return -1; }else if(this.age>o.age) return 1; return 0; }}public static void treeset() { Set<String> set=new TreeSet<String>(); set.add("空空"); set.add("蘭蘭"); set.add("泉彩"); set.add("島愛"); System.out.println("一共有元素:"+set.size()); //打印treeset中的元素 //toArray()的參數只是告訴程序要返回什么類型的Obj String names[]=set.toArray(new String[]{}); for (String s:names) { System.out.println(s); } System.out.println("=======添加自定義對象========="); Set<Emp> emps = new TreeSet<Emp>(); Emp e1= new Emp("空空",29); Emp e2 = new Emp("蘭蘭",30); Emp e3 = new Emp("島愛",28); Emp e4 =new Emp("泉彩",35); emps.add(e1); emps.add(e2); emps.add(e3); emps.add(e4); //不允許相同的對象 //emps.add(e1); //這個對象還是添加不進去,因為年齡與空空同歲,實際上使用Compare //方法 emps.add(new Emp("利亞",29)); System.out.println("元素的個數為"+emps.size()); }4.LinkedHashSet
有序
public class LinkedHashSet extends HashSet implement Set,Clonable,Serializable
具有可預知迭代順序的Set接口的哈希表和鏈接鏈表實現。此實現與HashSet的不同在于,LinkedHashSet維護著一個運行于所有條目的雙重鏈接鏈表。此鏈接列表定義了迭代順序,即按照將元素插入到set中的順序(插入順序)進行迭代。注意:插入順序不受在set中重新插入的元素的影響。
LinkedHashSet注意事項:
1.使用哈希表+雙向鏈表實現 2.會以插入的順序輸出 3.底層是使用LinkedHashMap實現 4.是Hashset的子類
新聞熱點
疑難解答