1.set的集合概述和特点
2.哈希值
3.HashSet集合概述和特点
4.HashSet保证元素唯一的源码分析
5.数据结构之哈希表
6.LinkedHashSet集合概述和特点
7.TreeSet集合概述和特点
1.set的集合概述和特点
Set<String> set = new HashSet<String>();
set.add("hello");
set.add("world");
set.add("java");
System.out.println(set.add("hello"));
System.out.println("----------------------------");
for (String s:set){
System.out.println(s);
}
运行结果
2.哈希值
示例:注释为运行结果
字符串String中重写了hasCode方法,所以“重地”和“通话”的哈希值相同
3.HashSet集合概述和特点
HashSet<String> hs = new HashSet<String>();
hs.add("hello");
hs.add("world");
hs.add("java");
hs.add("world");
for (String s:hs){
System.out.println(s);
}
输出:
4.HashSet保证元素唯一的源码分析
HashSet集合添加一个元素的过程
5.数据结构之哈希表
存储流程
练习:
/*
要求:
创建一个存储学生对象的集合,并存储3个学生对象,在控制台遍历
要求学生对象的成员变量值相同,我们就认为是同一个对象
*/
public class set {
public static void main(String[] args){
HashSet<Student> hs = new HashSet<Student>();
Student s1 = new Student("盖俊豪",22);
Student s2 = new Student("王宇",23);
Student s3 = new Student("王硕",24);
Student s4 = new Student("盖俊豪",22);
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
for (Student s:hs){
System.out.println(s.getName()+","+s.getAge());
}
}
}
运行结果:
重写Student类中的equals()方法:alt+insert 自动生成
重新运行:
6.LinkedHashSet集合概述和特点
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<String>();
linkedHashSet.add("hello");
linkedHashSet.add("world");
linkedHashSet.add("java");
linkedHashSet.add("world");
for (String s : linkedHashSet){
System.out.println(s);
}
结果
7.TreeSet集合概述和特点
TreeSet<Integer> ts = new TreeSet<Integer>();
ts.add(10);
ts.add(40);
ts.add(30);
ts.add(50);
ts.add(20);
ts.add(30);
for (Integer i:ts){
System.out.println(i);
}
运行结果:
自然排序Comparable的使用
/*
存储学生对象遍历,创建集合使用无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
*/
public class set {
public static void main(String[] args){
TreeSet<Student> ts = new TreeSet<Student>();
Student s1 = new Student("xishi",29);
Student s2 = new Student("wangzhaojun",28);
Student s3 = new Student("diaochan",30);
Student s4 = new Student("yangyuhuan",31);
Student s5 = new Student("linqingxia",31);
ts.add(s1); //添加第一个元素不需要比较
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
//添加第二个元素会与第一个元素比较,通过重写的compareTo方法。返回0表明与第一个元素相同,不存入。返回1表明s2大于s1,所以s2存在了s1后面,升序。返回-1表明s2小于s1,所以s2存在了s1前面面,降序
for (Student s:ts){
System.out.println(s.getName()+","+s.getAge());
}
}
}
使Student继承Comparable
重写compareTo方法,负责会出现ClassCastException异常
比较器排序Comparator的使用
/*
存储学生对象遍历,创建集合使用无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
*/
public static void main(String[] args){
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { //匿名内部类
@Override
public int compare(Student o1, Student o2) {
int num = o1.getAge()-o2.getAge();
int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num;
return num2;
}
});
Student s1 = new Student("xishi",29);
Student s2 = new Student("wangzhaojun",28);
Student s3 = new Student("diaochan",30);
Student s4 = new Student("yangyuhuan",31);
Student s5 = new Student("linqingxia",31);
ts.add(s1); //添加第一个元素不需要比较
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for (Student s:ts){
System.out.println(s.getName()+","+s.getAge());
}
}
练习1:成绩排序
/*
用TreeSet集合存储多个学生信息(姓名,语文成绩,数学成绩),并遍历该集合
要求:按照总分从高到低出现
*/
public static void main(String[] args){
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num1 = s2.getMath()+s2.getChinese()-s1.getMath()-s1.getChinese();
return num1;
}
});
Student s1 = new Student("王宇",85,89);
Student s2 = new Student("吴彬",99,100);
Student s3 = new Student("盖俊豪",90,91);
ts.add(s1);
ts.add(s2);
ts.add(s3);
for (Student s : ts){
System.out.println(s.getName()+","+s.getChinese()+","+s.getMath());
}
}
练习2:不重复的随机数
/*
需求:
编写一个程序,获取10个1到20之间的随机数,要求随机数不能重复,并在控制台输出
思路:
1.创建Set集合
2.创建随机数对象
3.判断集合的长度是否小于10
是:产生一个随机数,添加到集合
回到3继续
4.遍历集合
*/
public static void main(String[] args){
Set<Integer> set = new HashSet<Integer>(); //使用HashSet不会排序,TreeSet会排序
//Set<Integer> set = new TreeSet<Integer>();
Random r = new Random();
while(set.size()<10){
int number = r.nextInt(20)+1;
set.add(number);
}
for (Integer i :set){
System.out.println(i);
}
}