JAVA 基础
1、HashSet存储字符串并遍历
- A:Set集合概述及特点
- Set集合,无索引,不可以重复,无序(存取不一致)
- B:案例演示
- HashSet存储字符串并遍历
小结
- Set集合,无索引,不可以重复,无序(存取不一致)
- 自定义对象的不重复性取决于是否重写你的equal()和hashCode()
- //只要能用迭代器迭代的,就可以使用增强for循环遍历
boolean a= strings.add(new Student("王一",11));
boolean b =strings.add(new Student("王一",11));
strings.add(new Student("王san",13));
strings.add(new Student("王si",14));
strings.add(new Student("王wu",15));
System.out.println(a);
System.out.println(b);
System.out.println(strings);
for (Student string : strings) {
System.out.println(string);
}
true
false
[Student{num=null, name='王wu', age=15}, Student{num=null, name='王san', age=13}, Student{num=null, name='王si', age=14}, Student{num=null, name='王一', age=11}]
2、HashSet存储自定义对象保证元素唯一性
- A:案例演示
-
存储自定义对象,并保证元素唯一性。
HashSet<Person> hs = new HashSet<>(); hs.add(new Person("张三", 23)); hs.add(new Person("张三", 23)); hs.add(new Person("李四", 23)); hs.add(new Person("李四", 23)); hs.add(new Person("王五", 23)); hs.add(new Person("赵六", 23));
-
- 重写hashCode()和equals()方法
小结
- 如果不重写会导致可以重复添加对象
3、HashSet存储自定义对象保证元素唯一性图解及代码优化
- A:画图演示
- 画图说明比较过程
- B:代码优化
- 为了减少比较,优化hashCode()代码写法。
- 最终版就是自动生成即可。
小结
确保唯一的过程:-------
- 1、先通过hashCode对比hash码是否一致
- 2、若一致调用equal()方法进行比对
详情见--------java小疑惑
4、HashSet如何保证元素唯一性的原理
- 1.HashSet原理
- 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数
- 当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象
- 如果没有哈希值相同的对象就直接存入集合
- 如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存
- 2.将自定义类的对象存入HashSet去重复
- 类中必须重写hashCode()和equals()方法
- hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
- equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储
小结
1、提高效率也是其中一个原因
5、LinkedHashSet的概述和使用
- A:LinkedHashSet的特点
- 底层是链表实现的,是set集合中唯一一个能保证怎么存就怎么取的集合对象
- 因为是HashSet的子类,所以也是保证元素唯一的,与HashSet的原理一样
- B:案例演示
- LinkedHashSet的特点
- 可以保证怎么存就怎么取
- LinkedHashSet的特点
6、TreeSet保证元素唯一和自然排序的原理和图解
通过compareTo来保证元素唯一的
* TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一
* 当compareTo方法返回0的时候集合中只有一个元素
* 当compareTo方法返回正数的时候集合会怎么存就怎么取
* 当compareTo方法返回负数的时候集合会倒序存储
7、TreeSet保证元素唯一和比较器排序的原理及代码实现
- A:案例演示
- TreeSet保证元素唯一和比较器排序的原理及代码实现
TreeSet的构造方法中可以传递比较器类(继承Comparator<> )
- TreeSet保证元素唯一和比较器排序的原理及代码实现
8、TreeSet原理
- 1.特点
- TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
- 2.使用方式
- a.自然顺序(Comparable)
- TreeSet类的add()方法中会把存入的对象提升为Comparable类型
- 调用对象的compareTo()方法和集合中的对象比较
- 根据compareTo()方法返回的结果进行存储
- b.比较器顺序(Comparator)
- 创建TreeSet的时候可以制定 一个Comparator
- 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
- add()方法内部会自动调用Comparator接口中compare()方法排序
- 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
- c.两种方式的区别
- TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
- TreeSet如果传入Comparator, 就优先按照Comparator
- a.自然顺序(Comparable)