24.set集合

来源:互联网 发布:淘宝直播间看不到聊天 编辑:程序博客网 时间:2024/06/06 04:32

set集合:HashSet
1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构
2.哈希表又叫散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表
每个单链表都有一个独一无二的hash值,代表数组的下标,在某个单向链表中每一个节点上
hash值是相等的,hash值实际上是key调用hashcode方法,再通过hash function 转换成的值
3.如何向hash表中添加元素
   先调用被存储的key的hashcode方法,经过某个算法得出hash值,如果再这个hash表中不存在这个
  hash值,则直接加入元素,如果已存在这个hash值,继续调用key之间的equals方法,如果equals方法
    返回false,则将该元素添加,否则放弃添加该元素
4.hashSet其实是HashMap中的key部分,HashSet有什么特点,HashMap中的Key应该具备相同特点

import java.util.*;public class HelloWorld {public static void main(String[] args) {//创建Set集合Set s = new HashSet();//无序不可重复s.add(1);s.add(1);s.add(10);s.add(22);//遍历Iterator it = s.iterator();while(it.hasNext()) {System.out.println(it.next());}}}

5.Set集合中元素的HashCode和equals方法

import java.util.*;public class HelloWorld {public static void main(String[] args) {Set s = new HashSet();Employee e1 = new Employee("1000","JACK");Employee e2 = new Employee("1000","JACK");Employee e3 = new Employee("2000","TOM");Employee e4 = new Employee("2001","GYC");Employee e5 = new Employee("3000","GYF");Employee e6 = new Employee("3001","COOK");//添加元素s.add(e1);s.add(e2);s.add(e3);s.add(e4);s.add(e5);s.add(e6);//查看集合元素个数System.out.println(s.size());}}//公司员工编号:1000-9999class Employee{//姓名String name;//编号String no;Employee(String no,String name){this.no = no;this.name = name;}//重写equals方法(编号,名字相同)public boolean equals(Object o) {if(this == o) {return true;}if(o instanceof Employee) {Employee e = (Employee)o;if(e.no.equals(this.no)&& e.name.equals(this.name)) {return true;}}return false;}//重写hashcode方法public int hashCode() {//以员工编号分组return no.hashCode();}}
结论:存储在HashSet集合或者HashMap集合key部分的元素,需要同时重写hashCode+equals

6.SortedSet

(TreeSet是SortedSet接口的唯一实现类)

import java.util.*;public class HelloWorld {public static void main(String[] args) {//创建集合SortedSet ss = new TreeSet();//添加元素ss.add(10);//自动装箱ss.add(20);ss.add(15);ss.add(30);ss.add(25);ss.add(9);//遍历Iterator it = ss.iterator();while(it.hasNext()) {System.out.println(it.next());}//StringSortedSet strs = new TreeSet();strs.add("JACK");strs.add("SUN");strs.add("TOM");strs.add("KING");it = strs.iterator();while(it.hasNext()) {System.out.println(it.next());}}}
SortedSet集合存储元素为什么可以自动排序?
因为被存储元素实现了Comparable接口,SUN编写的treeset 集合在添加元素的时候
会调用compareTo方法完成比较

(方式一)

import java.util.*;public class HelloWorld {public static void main(String[] args) {//创建SortedSet集合SortedSet users = new TreeSet();//准备元素User u1 = new User(18);User u2 = new User(19);User u3 = new User(20);User u4 = new User(21);//添加元素users.add(u1);users.add(u2);users.add(u3);users.add(u4);//遍历Iterator it = users.iterator();while(it.hasNext()) {System.out.println(it.next());}}}class User implements Comparable{int age;User(int age){this.age = age;}public String toString() {return "User[age="+age+"]";}//实现java.lang.Comparable;接口中的compareTo方法//该方法程序员负责实现,SUN提供的程序已经调用了该方法//需求:按照user的age 排序public int compareTo(Object o) {int age1 = this.age;int age2 = ((User)o).age;return age1 - age2;//如果返回值是一个定值,equals方法将返回false 无法添加新元素}}
(方式二)

/*   java.util.Comparator;   单独编写一个比较器 */import java.util.*;public class HelloWorld {public static void main(String[] args) {//创建SortedSet集合的时候提供一个比较器SortedSet users = new TreeSet(new UserComparator());//准备元素User u1 = new User(18);User u2 = new User(19);User u3 = new User(20);User u4 = new User(21);//添加元素users.add(u1);users.add(u2);users.add(u3);users.add(u4);//遍历Iterator it = users.iterator();while(it.hasNext()) {System.out.println(it.next());}}}class User {int age;User(int age){this.age = age;}public String toString() {return "User[age="+age+"]";}}//单独编写一个比较器class UserComparator implements Comparator{//按年龄排序public int compare(Object o1, Object o2){int age1 = ((User)o1).age;int age2 = ((User)o2).age;if(age1 == age2) {return 0;}else if(age1>age2) {return 1;}else {return -1;}}}