Set
HashSet
方法:与List集合中方法一样。
元素唯一:
在添加元素时,会对集合中已有的元素和你要添加的元素做比较,
如果集合中有相同的元素,就不添加,返回false。
判断依据:
在存储自定义对象是,他会根据自定义对象中的hashCode()方法和equals()方法进行判断,
两个对象是否是相同的元素。
添加一个元素,
先会判断添加的元素和集合中所有元素,hashCode 是否相等,
如果相等在来调用equals方法进行比较,如果结果为true不添加,结果为false添加这个元素
如果hashCode不相等,直接添加元素
注意:
如果想让集合中存储自定义对象去重,那么必须在自定义对象的这个类中重写hashCode和equals方法。
(开发时自动生成即可)
保证元素唯一:
重写hashCode和equals方法
LinkedHashSet 他是HashSet的子类
特点:保证元素唯一,存储有序。
TreeSet
自然排序接口 Comparable 重写方法 compareTo ,使用:存储的元素需要实现这个接口
TreeSet<Person> ts = new TreeSet<>();
如果这个集合存储的是Person对象,那就需要在Person这个类中实现Comparable接口,并重写compareTo方法
eg:
public class Person implements Comparable<Person>{
//此处省略 属性,构造方法,get、set方法等
@Override
public int compareTo(Person o) { //this在前是正序,如:123 abc
int num = this.age - o.age;
return num == 0 ? this.name.compareTo(o.name) : num;
}
比较器接口 Comparator 重写方法 compare ,使用:创建集合对象,作为参数传进去
使用比较器时,这个Person类中可以不实现Comparable接口,但是在创建集合的时候需要传参数
参数就是Comparator的子类对象
eg:
TreeSet<Person> ts2 = new TreeSet<Person>(new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {//p1在前是正序,如:123 abc
int num = p2.getAge() - p1.getAge();
return num == 0 ? p1.compareTo(p2) : num;
}
});
*是否可以同时使用自然排序和比较器 ? 可以,优先使用比较器。
List 和 Set :
1.List
a.普通for循环, 使用get()逐个获取
b.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
c.增强for循环, 只要可以使用Iterator的类都可以用
d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法
2.Set
a.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
b.增强for循环, 只要可以使用Iterator的类都可以用 |
|