概要
List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口
Set下有HashSet,LinkedHashSet,TreeSet等实现方法
List下有ArrayList,Vector,LinkedList等实现方法
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap等方法
关系如图:
总结:
— List 有序,可重复
ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
Set 无序,唯一
HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
TreeSet
底层数据结构是红黑树。(唯一,有序)
- 如何保证元素排序的呢?
自然排序
比较器排序
2.如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
TreeSet的两种排序方式
1.以普通数字来进行排序
public class MyClass {
public static void main(String[] args) {
// 创建集合对象
// 自然顺序进行排序
TreeSet<Integer> ts = new TreeSet<Integer>();
// 创建元素并添加
// 20,18,23,22,17,24,19,18,24
ts.add(20);
ts.add(18);
ts.add(23);
ts.add(22);
ts.add(17);
ts.add(24);
ts.add(19);
ts.add(18);
ts.add(24);
// 遍历
for (Integer i : ts) {
System.out.println(i);
}
}
}
2.以对象为例排序
public class Students implements Comparable<Students>{
private String name;
private int age;
public Students() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Students [name=" + name + ", age=" + age + "]";
}
public Students(String name, int age) {
super();
this.name = name;
this.age = age;
}
public int compareTo(Students o) {//重写了比较算法
if(this.age<o.age) {
return 1;
}
else if (this.age>o.age) {
return -1;
}
else {
return this.name.compareTo(o.name);
}
}
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;
}
}
import java.util.Set;
import java.util.TreeSet;
public class JavaCollectDemo {
public static void main(String[] args) {
Set<Students> all = new TreeSet<Students>();
all.add(new Students("张飞",28));
all.add(new Students("张三丰",100));
all.add(new Students("关羽",32));
all.add(new Students("刘备",35));
all.add(new Students("诸葛亮",20));
all.add(new Students("曹操",100));
all.add(new Students("曹操",100));
for(Students students:all){
System.out.println("名字为"+students.getName()+" "+students.getAge());
}
}
}