Set
Set主要的特点是存放无序,List存放有序
HashSet
哈希表结构
1,判断存入对象的哈希码值是否在集合中已经存在
2,如果存在,那么调用equals()方法判断对象内容是否一致
3,如果equals方法返回值为true,表示对象已经存在,那么将不在存储
4,如果equals方法返回值为false,表示对象哈希码值一致,但内容不同,可以存在另一片内存中
5,如果哈希码值不一致,将其存储到对应当前哈希码值存在的地方
必须将存入对象所在的类,重写hashCode方法与equals方法
HashSet实例
1 package com.qf.hashsetdemo; 2 3 public class Students { 4 private String name; 5 private int age; 6 public Students(String name, int age) { 7 super(); 8 this.name = name; 9 this.age = age; 10 } 11 @Override 12 public String toString() { 13 return "Students [name=" + name + ", age=" + age + "]"; 14 } 15 16 //重写hashCode方法 17 @Override 18 public int hashCode() { 19 //自定义一个算法 20 return this.name.hashCode()*10+age; 21 } 22 //重写equals方法 23 @Override 24 public boolean equals(Object obj) { 25 if (this == obj) { 26 return true; 27 }else{ 28 if (obj instanceof Students) { 29 Students s = (Students) obj; 30 if(this.name.equals(s.name)&&this.age == s.age){ 31 return true; 32 } 33 } 34 } 35 return false; 36 } 37 }
主程序
package com.qf.hashsetdemo; import java.util.HashSet; /** * 使用HashSet存放自定义数据类型 * 要求存储内容不一致 */ public class HashSetDemoB { public static void main(String[] args) { //创建HashSet集合存入数据类型为Students HashSet<Students> set = new HashSet<Students>(); //创建Students对象 Students s1 = new Students("佳佳", 22); Students s2 = new Students("森少", 21); Students s3 = new Students("波波", 21); Students s4 = new Students("川川", 16); Students s5 = new Students("李秉鑫", 12); Students s6 = new Students("小乔", 18); Students s7 = new Students("周鹏", 22); Students s8 = new Students("老司机", 18); Students s9 = new Students("佳佳", 22); //向集合中存入数据 set.add(s1); set.add(s2); set.add(s3); set.add(s4); set.add(s5); set.add(s6); set.add(s7); set.add(s8); set.add(s9); System.out.println(s1.hashCode()); System.out.println(s9.hashCode()); //遍历集合中的元素 for (Students students : set) { System.out.println(students); } } }
重写HashCode的方法,自己定义可以,每个字符都对应有一个ASCII值, HashCode值一样,则不能写入相同的对象
重写的目的就是跳过比较地址这个环节,compareTo和remove都是基于hashcode值进行的.
TreeSet
输出会按照结果字典顺序排序
1 import java.util.TreeSet; 2 3 public class TreeSetDemoA { 4 public static void main(String[] args) { 5 TreeSet<Integer> set = new TreeSet<Integer>(); 6 set.add(8); 7 set.add(11); 8 set.add(4); 9 set.add(3); 10 set.add(5); 11 set.add(7); 12 set.add(9); 13 set.add(10); 14 set.add(13); 15 boolean b1 = set.add(1); 16 System.out.println(b1); 17 boolean b2 = set.add(1); 18 System.out.println(b2); 19 for (Integer integer : set) { 20 System.out.print(integer+","); 21 } 22 } 23 }