List和Set的共同点和异同点
A:元素特点:
List:元素有序(存储顺序一致),元素可以重复,可通过索引遍历元素,
Set: 元素无序,唯一;
B:List的去重复值:
1、创建两个集合,一个有元素,一个为空,遍历有元素的集合,比较判断为空的集合是否包含被遍历
集合的元素,有就舍弃,没有就添加,这样就获取了一个没有重复元素的集合
public static void main(String[] args) {
//创建集合
List<Student> list1 = new ArrayList<>();
List<Student> list2 = new ArrayList<>();
//创建对象
Student s1 = new Student();
..........
//添加元素
list1.add(s1);
..........
//遍历集合
//方法1
Iterator<Student> it = new list1.iterator();
while(it.hasNext()) {
Student s = (Student)it.next();
if(!list2.contains(s)) {
list2.add(s);
}
}
// 遍历list2
for (int x = 0; x < list.size(); x++) {
Student s1 = (Student) list2.get(x);
System.out.println(s1);
}
System.out.println(list2);
}
2、在使用contains()方法时,底层使用的是Object类的equals()方法,Stduent类中没有重写equals();
需要在Student类中重写equals()方法。
重写equals()方法只需三步:如下
@Override
public boolean equals(Object obj) {
if(obj == this) {
return true;
}
//第二:obj不属于Student类型
if(!obj instanceof Student) {
return false;
}
Student s = (Student)obj;//强转
return this.name.equals(s.name) && this.age == s.age;
}
C: Set的两个实现类:hashSet和TreeSet
hashSet:底层数据结构是哈希表,不能保证集合的存取顺序,只能保证元素的唯一。
1、hashSet是怎么保持元素的唯一
因为它是通过hashCode()和equals()方法来保持元素的唯一
当存入元素时,首先调用hashCode()方法获取哈希值,再根据哈希值计算出一个存储位置,如果该位置上
没值,直接存入;若有,调用equals()方法比较元素的值,相同就丢弃,不同就存入。
首先,判断hashCode()值。相同返回为0;
相同:
调用equals()方法,根据其返回值:
true:说明元素重复,不添加到集合。
false:说明元素不重复,添加到集合。
不同:直接添加到集合。
2、hashCode()和equals()的重写;
(注:在开发中,不用写,直接鼠标右键--sourse--hashCode()and equals())
(1)hashCode():
把所有的对象的成员变量的值相加
基本类型:加值; 引用类型:加哈希值
例:
public int hashCode() {
return this.name.hashCode() + this.age*13 + this.score*11;
}
(2)equals()
同上面List的equals()的重写方法分为三步
A:if(obj == this) {}
B:if(!obj instaceof Student) {}
C:Student s = (Student)obj;
return this.name.equals(s.name) + this.age == s.age;
TreeSet:底层数据结构是二叉树结构,可以保证元素的唯一,也可以保证元素的存取顺序;
1、TreeSet保证元素的唯一、排序;
原理:(1)第一个添加的元素作为根节点
(2)从第二个添加的元素开始与根节点比较
如果大了,放在根节点的右边
如果小了,放在......的左边
如果相同,丢弃
(3)排序原则:左中右原则;
2、排序:
(1)自然排序(元素具备比较性),无参构造;
要求对象所属的类实现接口Comparable;重写compareTo()方法
public int compareTo(student s) {
int num = this.name.length() - s.name.length();
int num1 = (num == 0) ? this.name.equals(s.name) : num;
int num2 = (num1 == 0) ? this.age - s.age;
return num2;
}
(2) 比较器排序(集合具有比较器),有参构造;
要求构造方法接受一个实现了Comparator接口的对象,重写一个compare()方法
TreeSet<Student> ts = new TreeSet(new Comparator<Student> {
@Overrided
public int compare(Student s1, Student s2) {
int num = s1.getAge() - s2.getAge();
int num1 = (num == 0) ? s1.getName().compareTo(s2.getName()) :num;
return num1
}
});
D:遍历方法:
List:
(1)普通Iterator迭代器
(2)增强for循环
(3)ListIterator列表迭代器
(4)普通for循环
Set:
(1)普通Iterator迭代器
(2)增强for循环
|
|