Set体系:
特点:无序(存取的顺序不一致),唯一。
// a b c d e f g
public boolean add(Object obj); //往set集合中添加重复元素的时候,返回值是false。
遍历:
1、迭代器。
2、增强for。
HashSet:
案例:存储字符串并遍历
存储自定义对象并遍历。
HashSet是如何保证元素唯一性的?
依赖于两个方法:hashCode(),equals()。
set.add(new Person("张三",23));
原理:
A:调用要添加的对象的hashCode()方法,计算出该对象的哈希值。
B:去集合中找是否有元素的哈希值和要添加的元素的哈希值相同。
如果不同:直接把该元素存到集合中。
如果相同:调用equals()方法去比较各个属性的值。
如果都相同,不添加,否则,就把该元素添加到集合中。
问题1:hashCode()方法没有重写,equals()没有执行。 ???
LinkedHashSet:
有序,唯一。
注意:一个类可以有多个对象,但是一个类的字节码文件对象只有一个。
Person p = new Person();
Class c1 = p.getClass();
Class c2 = p2.getClass();
.
中午作业:
1、编写一个程序,获取10个1至20的随机数,要求随机数不能重复。并把最终的随机数输出到控制台(for)
2、使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符
3、ArrayList集合存储元素,去重复。
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
list.add("d");
list.add("e");
4、HashSet存储自定义对象,然后保证元素唯一性。
TreeSet:
对元素进行排序的。
自然排序:
让基本类(要排序的类)去实现Comparable接口,并且重写接口中的compareTo()方法。
注意:
当compareTo()方法返回0的时候,集合中只有一个元素。
当compareTo()方法返回正数的时候,怎么存就怎么取。
当compareTo()方法返回负数的时候,倒序存储。
二叉树取元素的顺序是什么:左,中,右。
注意:
用TreeSet排序的时候,一定要考虑清楚什么是主要条件,什么是次要条件。
思考:
按照姓名排序。(采用的是Unicode编码表中的值)
//this.name.compareTo(s.name);
如果是按照 姓名的长度 排序呢?
//this.name.length() - s.name.length();
//内容,年龄
比较器排序:
使用的是 TreeSet(Comparator comparator); TreeSet类的带参构造。
做法:
1、新建一个类,去实现Comparator接口,重写接口中的compare(),然后创建一个该类对象,传入到 TreeSet类的带参构造中。
2、直接使用匿名内部类。 (推荐)
TreeSet的原理:
思考: 在一个集合中存储了无序并且重复的字符串,定义一个方法,让其有序(字典顺序),而且还不能去除重复 (1分钟)
TreeSet<String> ts = new TreeSet<>( new Comparator<String>(){
public int compare(String s1, String s2){
}
} );
|
|