|————Collection接口:单列数据,定义了存取一组数据对象的方法的集合
|————List接口:元素有序、可重复的集合
|————ArrayList、LinkedList、Vector
|————Set接口:存储无序、不可重复数据
|————HashSet Set接口主要实现类,线程不安全的,可以存储null值
|————LinkedHashSet 作为HashSet的子类,遍历内部数据时,可以按照添加的顺序遍历
|————TreeSet 可以按照添加对象的指定属性 进行排序
比较
1、数据结构:
2、线程安全:
3、执行效率:
4、内存空间:
=====================================
List:接口
ArrayList:底层是Object[]数组,随机查询效率高,插入、删除受时间复杂度影响O(n-1),顺序添加效率高O(1),非同步,扩容机制是原有的1.5倍,并把原有数据放到扩容后的新数组
jdk1.7 new的时候会创建一个默认长度长度为10的数组
jdk1.8 new的时候不会创建调方法时会创建默认长度为10的数组
LinkedList:底层是双向链表,多了两个指针,直接前驱和直接后继(JDK1.7及以后取消了循环),添加、删除、修改效率高,链表存储,非同步
Vector:底层是Object[]数组,数组存储,底层方法加了synchroize锁的同步方法
==========================================
Set:接口
HashSet:HashSet底层是数组加链表结构,默认长度16
LinkedHashSet:是HashSet的子类,,添加数据的同时增加了双向链表的特性先后添加的元素有顺序的指向,所以可以按顺序遍历出来,比HashSet遍历效率高
TreeSet:相同类的对象两种排序方式:自然排序 和 定制排序
自然排序中,比较两个对象是否相同的标准为:compareTo()返回0,不在是equals()
定制排序中:比较两个对象是否相同的标准为:compare()返回0,不在是equals()
要求:向set中添加的数据,其所在的类一定要重写hashCode()方法和equals()
// TreeSet 按照姓名从小到大排序,会出现问题当姓名一样年龄不同的时候会添加失败
// 解决办法:实现类实现complable中重写compareTo方法
@Override
public int compareTo(Object o) {
if (o instanceof Student) {
Student s = (Student) o;
int compare=-this.name.compareTo(s.name);
if (compare!=0){
return compare;
}else {
return Integer.compare(this.age,s.age);
}
} else {
throw new RuntimeException("类型错误");
}
}
// 按照年龄从小到大排序
Comparator com = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof StudentSet && o2 instanceof StudentSet) {
StudentSet s1 = (StudentSet) o1;
StudentSet s2 = (StudentSet) o2;
return Integer.compare(s1.getAge(), s2.getAge());
} else {
throw new RuntimeException("类型错误");
}
}
};
TreeSet treeSet = new TreeSet(com);
treeSet.add(new StudentSet(15, "李四"));
treeSet.add(new StudentSet(16, "李四"));
treeSet.add(new StudentSet(17, "李四"));
Iterator iterator = treeSet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
其中: Comparable接口里面的方法是 public int compareTo(T o); 在java.lang包下
Comparator接口里面的方法是 int compare(T o1,T o2); 在java.util包下