🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Set集合: 元素存储无序(不按照存入的顺序存储)。且不能重复 |--**HashSet**: 底层数据结构是hash表。 |--**TreeSet**:  存入数据按照自然顺序排序 Set方法和Collection提供的方法一致。 ### HashSet提供的方法: HashSet是如何保证存储数据的唯一性呢? 通过元素的两个方法来完成的,分别是hashCode和equals方法。 1、HashSet在存储数据时,内部首先调用hashCode方法,如果hashCode一致,在调用equals方法 2、如果hashCode不一致,那么就将数据存储到hashSet集合中。 ~~~ import java.util.*; public class SetDemo{ public static void main(String args[]){ HashSet hs = new HashSet(); hs.add(new Person("lzl",18)); hs.add(new Person("lzl",18)); hs.add(new Person("hhh",18)); hs.add(new Person("lzl",18)); Iterator it = hs.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); sop(p.getName()+"-------"+p.getAge()); } } public static void sop(Object obj){ System.out.println(obj); } } 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 this.age; } public String getName(){ return this.name; } //覆写hashCode()方法,保证hashCode具有唯一性 public int hashCode(){ System.out.println("hashCode---"+this.name.hashCode()*age); return this.name.hashCode()*age; } //因为要比较的是Person类中的name和age值,所以重写Object类的equals方法, public boolean equals(Object obj){ //如果传入的对象不是Person类,直接返回false if(!(obj instanceof Person)) return false; //否则强转成Person类 Person p = (Person)obj; //返回name和age的比较值。 return this.name.equals(p.getName()) && this.age == p.getAge(); } } ~~~ ### TreeSet提供的方法 TreeSet集合 1、存储的数据自身具有比较性。 2、保证数据唯一性的依据是CompareTo()方法return 0。 使用该集合的对象要实现Comparable接口,覆写CompareTo()方法。 如果CompareTo()return 0表示对象相同。(如例1) 3、如果对象不具有比较器,或者该对象的比较器不是你所想要的。 那么可以通过定义实现比较接口,来实现自定义的比较器(看例2)。 例1:定义一个学生类,存入姓名的年龄,要求按照年龄进行排序。 ~~~ import java.util.*; public class SetDemo{ public static void main(String args[]){ TreeSet ts = new TreeSet(); ts.add(new Student("lzl",18)); ts.add(new Student("lzl",19)); ts.add(new Student("lzl",10)); ts.add(new Student("lzl",20)); ts.add(new Student("lml",20)); ts.add(new Student("lzl",20)); Iterator it = ts.iterator(); while(it.hasNext()){ Student s = (Student)it.next(); sop(s.getName()+"------"+s.getAge()); } } public static void sop(Object obj){ System.out.println(obj); } } /** 因为要将学生类按照年龄来排序,所以要实现Comparable接口,并 覆写compareTo(Object obj)方法 */ class Student implements Comparable { private String name ; private int age; public Student(){ } public Student(String name,int age){ this.name = name; this.age = age; } public int getAge(){ return this.age; } public String getName(){ return this.name; } /** return:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。 */ public int compareTo(Object obj){ if(!(obj instanceof Student)) throw new RuntimeException("不是学生类"); Student s = (Student)obj; if(this.age > s.getAge()) return 1; if(this.age == s.getAge()){ //年龄如果相同,比较姓名是否相同 return this.name.compareTo(s.getName()); } return -1; } } ~~~ 例2:改变学生类的需求,要求让存储的学生类按照姓名的字母排序。 ~~~ import java.util.*; public class TreeSetDemo{ public static void main(String args[]){ TreeSet ts = new TreeSet(new myCopara()); ts.add(new Student("lzl",18)); ts.add(new Student("lzl",19)); ts.add(new Student("lzl",10)); ts.add(new Student("lzl",12)); ts.add(new Student("lml",20)); ts.add(new Student("lzl",20)); ts.add(new Student("xy",20)); ts.add(new Student("as",100)); Iterator it = ts.iterator(); while(it.hasNext()){ Student s = (Student)it.next(); sop(s.getName()+"------"+s.getAge()); } } public static void sop(Object obj){ System.out.println(obj); } } /** 实现Comparator接口,并覆写int compare(T o1, T o2) */ class myCopara implements Comparator{ public int compare(Object o1,Object o2){ if(!(o1 instanceof Student) || !(o2 instanceof Student)) throw new RuntimeException("不是学生类型"); Student s1 = (Student)o1; Student s2 = (Student)o2; int num = s1.getName().compareTo(s2.getName()); if(num == 0){ return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge())); } return num; } } class Student { private String name ; private int age; public Student(){ } public Student(String name,int age){ this.name = name; this.age = age; } public int getAge(){ return this.age; } public String getName(){ return this.name; } } ~~~ 练习:定义一堆字符串,要求按照字符串的长度大小来排序,如果字符串长度相同,那么按照字符串的字母顺序排序。 ~~~ import java.util.*; public class TreeSetDemo{ public static void main(String args[]){ TreeSet ts = new TreeSet(new myCopara()); ts.add("abc"); ts.add("abcd"); ts.add("abcde"); ts.add("abce"); ts.add("fffff"); ts.add("fffff"); // ts.add(2); Iterator it = ts.iterator(); while(it.hasNext()){ String s = (String)it.next(); sop(s); } } public static void sop(Object obj){ System.out.println(obj); } } /** 实现Comparator接口,并覆写int compare(T o1, T o2) */ class myCopara implements Comparator{ public int compare(Object o1,Object o2){ if(!(o1 instanceof String) || !(o2 instanceof String)) throw new RuntimeException("不是字符串类型"); String s1 = (String)o1; String s2 = (String)o2; int size1 = s1.length(); int size2 = s2.length(); int num = new Integer(size1).compareTo(new Integer(size2)); //如果长度相同,那么按照字符串的字母顺序排列 if(num == 0){ //System.out.println(s1+"----"+s2); return s1.compareTo(s2); } return num; } } ~~~