1、集合体系概述
为什么有多种容器:因为存放数据的数据结构不同。
2、Collection集合
方法
第一、add方法的参数类型是Object,以便接受任意类型的对象。
第二、集合中存储的都是对象的引用(地址)。
第三、什么就是迭代器?就是集合取出元素的方式。
迭代器原理:
集合把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类。
而每一个容器的数据结构不同,所以取出的动作细节也不一样,但是取出动作都有判断和取出的共同点,那么这样就可以抽取出共同点Iterator。
获取集合的取出对象方法,就是通过集合对外提供一个方法iterator();。
import java.util.*;
public class CollectionDemo{
public static void main(String[] args){
method_get();
}
public static void method_get(){
ArrayList a = new ArrayList();
a.add("java1");
a.add("java2");
a.add("java3");
a.add("java4");
//迭代器第一种方法,迭代器对象用完后不销毁内存不好,但常用。
Iterator it = a.iterator();
while(it.hasNext()){//获取迭代器,用于取出集合中的元素
sop(it.next());
}
//迭代器第二种方法,迭代器对象是局部变量,用完后会释放内存。
for(Iterator it2 = a.iterator();it2.hasNext();){
sop(it2.next());
}
}
public static void method_retain(){
ArrayList a = new ArrayList();
a.add("java1");
a.add("java2");
a.add("java3");
a.add("java4");
ArrayList b = new ArrayList();
b.add("java1");
b.add("java2");
b.add("java5");
//4、取交集,取出相同的
//a.retainAll(b);
//5、删除相同的
a.removeAll(b);
sop(a);
sop(b);
}
public static void method_base(){
ArrayList a = new ArrayList();
//1、添加元素
a.add("java1");
a.add("java2");
sop("size:"+a.size());
sop("原集合:"+a);
//2、删除元素
//a.remove("java1");
//清空集合
//a.clear();
//3、判断元素
sop("java1是否存在:"+a.contains("java1"));
sop("集合是否为空?"+a.isEmpty());
sop(a);
}
public static void sop(Object obj){
System.out.println(obj);
}
}
3、List特有方法:凡是可以操作角标的方法都是该体系特有的方法。
增:
add(index,element);
addAll(index,Collection);
删:
remove(index);
改:
set(index,element);
查:
get(index);
subList(from,to);
listIterator();
List特有的迭代器,ListIterator是Iterator的子接口。
4、为什么在List中用ListIterator迭代器代替Collection中的Iterator迭代器?
第一、Iterator迭代器只有3个方法:hasNext()、next()、remove()方法。没有增加、修改等方法。当以后程序中需要用到增加元素、修改元素功能时,使用Collection集合中的add()、set()就会出现用集合和迭代器在同时操作对象的情况,这时就会出现ConcurrentModificationException异常。
第二、ListIterator列表迭代器中添加了add()、set()等功能,这样当使用列表迭代器时,就可以保证不需要集合方法就可以完成所有需要的功能,避免集合和迭代器同时操作一个对象元素的情况。
5、Vector集合中的枚举
Enumeration en = v.elements();====>Iterator it = a.Iterator();
枚举就是Vector特有的取出方式。
6、LikedList集合
LinkedList特有方法:
addFirst();
addLast();
removeFirst();
removeLast();
7、ArrayList集合:数组结构
开发中List看需求选择LinkedList、ArrayList;不过一般用ArrayList,因为开发中查询多,增删少。
8、TreeSet集合原理二叉树
9、List、Set集合
Collection
|---List:元素是有序的(存入和取出的顺序一致),元素可以重复,因为该集合体系有索引。
|---ArrayList:底层的数据结构使用的是数组结构。特点:查询速度快,但是增删慢。线程不同步。可变长度数组:数组初始化默认长度为10,当长度超过时,50%延长,节约空间。
|---LinkedList:底层的数据结构使用的是链表。特点:增删速度快,查询慢。
|---Vector:底层的数据结构使用的是数组结构。线程同步。被ArrayList替代了。可变长度数组:数组初始化默认长度为10,当长度超过时,100%延长。
|---Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。Set的功能和Collection的功能是一样的。
|---HashSet:底层数据结构是哈希表。线程是非同步的。HashSet是如何保证元素唯一性呢?是通过元素的两个方法,hashCode()和equals()来完成。如果元素的hashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。ArrayList判断元素是否相同只依赖于equals,Set判断元素是否相同依赖于hashCode和equals。写集合时要覆写hashCode\equals方法。
|---TreeSet:可以对Set集合中的元素进行排序。排序时,当主要条件相同时,一定要判断一下次要条件。底层数据结构是二叉树。保证数据元素唯一性的依据:compareTo方法return0,return -1在二叉树左边,return 1在二叉树右边。
TreeSet第一种排序方式:让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法。这种方式也称为元素的自然顺序或者叫默认顺序。
TreeSet第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是需要的。这时就让集合自身具备比较性。在集合初始化时就有了比较方法。定义了比较器,将比较器作为参数传给TreeSet的构造函数。
当两种排序都存在时,以第二种方式比较器为准。具体步骤是定义一个类,实现Comparator接口,覆盖compare方法。