java 集合(Set接口)
Set接口:無序集合,不允許有重復(fù)值,允許有null值
?????????????????? ?存入與取出的順序有可能不一致
?
HashSet:具有set集合的基本特性,不允許重復(fù)值,允許null值
?????? 底層實現(xiàn)是哈希表結(jié)構(gòu)
?????? 初始容量為16
?????? 保存自定義對象時,保證數(shù)據(jù)的唯一性,主要由哈希表的結(jié)構(gòu)決定
?????? 先判斷hashCode()是否相同,若相同,再判斷equals()是否相同
? ?????
哈希表結(jié)構(gòu):哈希表中存放的都是對象的哈希碼值,當(dāng)想要給哈希表中存放對象時,需要先進(jìn)行對象的哈希碼值比較,若表中已經(jīng)存在了相同的哈希碼,則繼續(xù)比較equals方法,比較對象的值是否相同,若返回false,則存入哈希表中,相當(dāng)于兩個對象共享同一塊內(nèi)存地址。若表中無相同的哈希碼值,則直接存入。
| package com.itycl.array; /* ?* 用HashSet去除重復(fù)值? 重寫toString()? hashCode()?? equals() ?*/ import java.util.HashSet; import java.util.Iterator; ? public class HashSetDemo { public static void main(String[] args) { ??? ??? HashSet<Integer> set=new HashSet<>(); ??? set.add(1); ??? set.add(2); ??? set.add(3); ??? set.add(3); ??? set.add(4); ??? set.add(4); ??? Iterator it=set.iterator(); ??? while(it.hasNext()) { ?????? Integer value = (Integer) it.next(); ?????? System.out.println(value); ??? } ??? System.out.println(set); } } ? |
?
HashSet存放自定義對象:
| package SetDemo1; ? import java.util.HashSet; import java.util.Iterator; /*課堂練習(xí): ?*???? ?* ?* ?* System.out.println():默認(rèn)添加:? 內(nèi)容.toString ?* 輸出該對象的字符串表示 ?* ?* ?* ?*/ ? public class HashSetDemo2 { ?? public static void main(String[] args) { ??? HashSet<Person> ps=new HashSet<>(); ??? ps.add(new Person("小花","18")); ??? ps.add(new Person("小綠","19")); ??? ps.add(new Person("小紅","19")); ??? ps.add(new Person("小粉","18")); ??? ??? ps.add(new Person("小草","19")); ??? ps.add(new Person("小草","19"));?? ??? Iterator<Person> it=ps.iterator(); ??? while(it.hasNext()) { ?????? System.out.println(it.next());???? ??? }?? ?? } } |
?
Person類:
| package collection; ? public class Person implements Comparable<Person> { private String name; private int age; public String getName() { ??? return name; } public void setName(String name) { ??? this.name = name; } public int getAge() { ??? return age; } public void setAge(int age) { ??? this.age = age; } public Person(String name, int age) { ??? super(); ??? this.name = name; ??? this.age = age; } @Override public int compareTo(Person o) { ??? if(this.age>o.age) { ?????? return 1; ??? }else if(this.age<o.age) { ?????? return -1; ??? }else { ?????? return this.getName().compareTo(o.getName()); ??? } ??? } @Override public String toString() { ??? ??? return "Person[name="+name+","+"age="+age+"]"+"\t"; } @Override public int hashCode() { ??? return this.name.hashCode()+this.age*7; } @Override public boolean equals(Object obj) { ??? ??? if(obj==null) { ?????? throw new RuntimeException("傳入的對象不能為空!"); ??? } ??? ??? if(!(obj instanceof Person)) { ?????? throw new RuntimeException("傳入的對象不是Person的實例!"); ??? } ??? ??? Person p = (Person) obj; ??? return p.getName().equals(this.name) && p.getAge()==(this.age); ? } } ? |
????
???TreeSet:具有set集合的基本特性,有序集合,不允許重復(fù)值,允許null。
????????? 底層實現(xiàn)是樹的數(shù)據(jù)結(jié)構(gòu)。
???????????????? ? 兩種排序方式:
a)實現(xiàn)自comparable接口:自然順序,實現(xiàn)該接口類自身就具備了一種可比較性
*重寫compareTo()方法
b)自定義一個比較器comparator:可以作為參數(shù)傳給set集合,讓集合具有明確的比較
1.實現(xiàn)自comparable接口:??????
| package SetDemo1; import java.util.Iterator; import java.util.TreeSet; /*使用TreeSet集合保存自定義對象 ?* 并且,認(rèn)為年齡和姓名相同對象為同一個學(xué)生對象 ?* ?*/ public class TreeSetDemo1 { ?? public static void main(String[] args) { ??? TreeSet<Student> ts=new TreeSet<>(); ??? ts.add(new Student("java01",20)); ??? ts.add(new Student("java02",10)); ??? ts.add(new Student("java03",20)); ??? ts.add(new Student("java04",30)); ??? ts.add(new Student("java05",20)); ??? ts.add(new Student("java05",20));//不允許重復(fù)值 ??? ts.add(null); ??? Iterator<Student> it=ts.iterator(); ??? while(it.hasNext()) {?????? ?????? System.out.println(it.next());? ??? }?? ?? } ??? |
?
Person類:
| package com.itycl.array; //實現(xiàn)comparable<T>接口 public class Person implements Comparable<Person> { private String name; private int age; public String getName() { ??? return name; } public void setName(String name) { ??? this.name = name; } public int getAge() { ??? return age; } public void setAge(int age) { ??? this.age = age; } public Person(String name, int age) { ??? super(); ??? this.name = name; ??? this.age = age; } //重寫compareTo() @Override public int compareTo(Person o) { ??? if(this.age>o.age) { ?????? return 1; ??? }else if(this.age<o.age) { ?????? return -1; ??? }else { ?????? return this.getName().compareTo(o.getName()); ??? } ??? } //重寫toString() @Override public String toString() { ??? ??? return "Person[name="+name+","+"age="+age+"]"+"\t"; } } |
?
2.自定義一個比較器:comparator,讓集合具有明確的比較
自定義比較器:實現(xiàn)implements Comparator接口
| package com.itycl.array; import java.util.Comparator; public class MyComparator implements Comparator<Student> { ??? @Override ??? public int compare(Student o1, Student o2) { ?????? System.out.println(o1+":"+o2); ?????? if(o1==null || o2==null) { ?????????? throw new RuntimeException("比較的參數(shù)不能為空"); ?????? } ?????? if(o1.getAge()>o2.getAge()) { ?????????? return 1; ?????? }else if(o1.getAge()<o2.getAge()) { ?????????? return -1; ?????? }else { ?????????? return o1.getName().compareTo(o2.getName()); ?????? } ?????????? ??? } } |
?
Student類:
| package com.itycl.array; public class Student { private String name; private int age; public Student(String name, int age) { ??? super(); ??? this.name = name; ??? this.age = age; } public String getName() { ??? return name; } public void setName(String name) { ??? this.name = name; } public int getAge() { ??? return age; } public void setAge(int age) { ??? this.age = age; } @Override public String toString() { ??? return "Person[name="+name+","+"age="+age+"]"+"\t"; } } |
?
TreeSetDemo1:
| package com.itycl.array; import java.util.Iterator; import java.util.TreeSet; public class TreeSetDemo1 { public static void main(String[] args) { ??? MyComparator my=new MyComparator();//創(chuàng)建比較器對象,并且傳到set集合中,使set集合本身具有明確的比較 ??? TreeSet<Student> set=new TreeSet<>(my); ??? set.add(new Student("張倩",12)); ??? set.add(new Student("李雷",10)); ??? set.add(new Student("蘭蘭",6)); ??? set.add(new Student("老劉",26)); ??? set.add(new Student("王樂",21)); ??? Iterator it=set.iterator(); ??? while(it.hasNext()) { ?????? Student s = (Student) it.next(); ?????? System.out.println(s.toString()); ??? } } } |
轉(zhuǎn)載于:https://www.cnblogs.com/MiLanDaEr/p/10055354.html
總結(jié)
以上是生活随笔為你收集整理的java 集合(Set接口)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农行悠然白金信用卡年费多少?免年费吗?
- 下一篇: 包装对象