List有序可重复
1.ArrayList:底层数据结构为数组,查询快,增删慢
2.LinkedList:底层数据结构为链表,增删快,查询慢
Set无序不可重复
1.HashSet(无序,唯一):底层数据结构为哈希表。
依赖两个方法:hashCode()和equals()保证元素唯一性
2.LinkedHashSet(FIFO插入有序,唯一):底层数据结构是链表(保证元素有序)和哈希表(保证元素唯一)。
3.TreeSet(唯一,有序):底层数据结构是红黑树。
自然排序和比较器排序保证元素有序,
根据比较的返回值是否是0来保证元素唯一性。
TreeSet,LinkedHashSet and HashSet的区别
- TreeSet的主要功能用于排序
- LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出)
- HashSet只是通用的存储数据的集合
TreeSet两种排序方式
1.自然排序
自然排序要进行一下操作:
- Student类中实现 Comparable接口
- 重写Comparable接口中的Compareto方法
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student s) {
//return -1; //-1表示放在红黑树的左边,即逆序输出
//return 1; //1表示放在红黑树的右边,即顺序输出
//return o; //表示元素相同,仅存放第一个元素
//主要条件 姓名的长度,如果姓名长度小的就放在左子树,否则放在右子树
int num=this.name.length()-s.name.length();
//姓名的长度相同,不代表内容相同,如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。
//如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。
//如果这两个字符串相等,则结果为 0
int num1=num==0?this.name.compareTo(s.name):num;
//姓名的长度和内容相同,不代表年龄相同,所以还要判断年龄
int num2=num1==0?this.age-s.age:num1;
return num2;
}
}
2.比较器排序
比较器排序步骤:
- 单独创建一个比较类,这里以MyComparator为例,并且要让其继承Comparator接口
- 重写Comparator接口中的Compare方法
public class MyComparator implements Comparator<Student> {
@Override
public int compare(Student s1,Student s2) {
// 姓名长度
int num = s1.getName().length() - s2.getName().length();
// 姓名内容
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
// 年龄
int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
return num3;
}
}