(1)它是根接口
(2)它没有直接的实现类,有更具体的子接口.如:List和Set
(3)有些集合的元素是可以重复的,有些集合的元素是不能重复的,有些集合的元素是有序的,有些集合的元素是无序的
2.API
(1)添加
boolean add(Objiect o):添加一个元素
boolean addAll(Collection c):添加多个元素
(2)获取有效元素的个数
int size()
(3)是否包含
boolean contains(Object o):判断o是否在当前的集合中
boolean containsAll(Collection c):判断c是否是当前集合的子集
(4)boolean isEmpty():判断当前集合是否为空
(5)删除
boolean remove(Object o):删除一个对象
boolean removeAll(Collection c):删除多个(删除的是this n c 的部分)
void clear():清空所有
(6)retainAll(Collection c):保留交集
(7)Object[] toArray():把集合中的元素用数组返回
(8)Iterator iterator():获取遍历当前集合的迭代器对象
3.Collection系列的集合的遍历
(1)Object[] toArray():先返回数组,然后遍历数组
(2)每一个Collection系列的集合,内部都自带一个迭代器
Collection接口的iterator()方法返回一个Iterator,然后通过Iterator接口的方法实现遍历
(3)foreach循环:可用于遍历数组,Collection系列的集合等容器,底层还是用到了Iterator迭代器
凡是实现了java.lang.Iterable接口的集合/容器都支持foreach循环
for(元素的类型 元素临时的名称 :数组/集合名){
}
用foreach遍历时,进行删除可能报错可能不报错,也会导致结果不确定,所以不要用foreach去删除;因为使用foreach删除时,调用的是集合的remove方法,遍历调用的是Interator的遍历方法
//Iterable接口
public interface Iterable {
//只有一个返回迭代器的方法
Iterator iterator();
}
//集合的父接口Collection继承自Iterable,所以List和Set 都有返回迭代器的方法
public interface Collection extends Iterable {
}
java.util.Iterator:接口,
(1)boolean hasNext():判断是否存在另一个可访问的元素,是否可以继续迭代
(2)Object next():返回指针指向的对象
(3)remove():移除指针指向的对象
这个接口的实现类在每一种集合类中,例:ArrayList内部有一个内部类实现了Iterator接口
声明为内部类的原因:
(1)每一种集合的内部实现(物理结构不同 ),意味着对迭代器的实现是不同的,每一种集合都要单独定制迭代器
(2)内部类可以直接访问外部类的私有属性,成员,因此迭代器可以直接访问集合的私有元素
1.List系列的集合:有序的,可重复的
2.List 接口的实现类们:ArrayList(动态数组),Vector(动态数组,向量类),LinkedList(双向链表,双端队列,栈…),Stack(栈,是Vector的子类)
(1)Vector:最早版本的动态数组,线程安全的(有线程同步),不够后扩容为原来的2倍(造成空间浪费的可能性较大)Vector支持的遍历集合的方式:foreach,Iterator,支持旧版的Enumeration迭代器;ArrayList支持的遍历集合的方式:foreach,Iterator
(2)ArrayList:相对Vector来说新一点,线程不安全的(没有线程同步),不够后扩容为原来的1.5倍(造成扩容的次数增大)
(3)Stack:栈,先进后出(FILO)的特性通过以下方法实现:
Object peek():访问当前栈顶元素,但不拿走栈顶元素
Object pop():弹出栈顶元素
Object push(Object item):把元素压入栈顶
(4)LinkedList:双向链表
//内部有一个结点的类型
class Node{
Object data;
Node previous;
Node next;
}
class LinkedList{
Node first;
Node last;
}
如何体现双向链表?
E getFirst():返回此列表的第一个元素
E getLast():返回此列表的最后一个元素
boolean offerFirst(E e):在此列表的开头插入指定的元素
boolean offerLast(E e):在此列表的末尾插入指定的元素
int indexOf(Object o):返回指定元素的索引,从头找
int lastIndexOf(Object o):从尾找
E get(int index):返回列表指定位置的元素,
体现栈和Stack一样
体现队列?
offer(e):插入队头
poll():移走队头元素
peek():检查队头元素
体现双端队列?
头部 尾部
插入 offerFirst(e) offerLast(e)
移除 pollFirst() pollLast()
检查 peekFirst() peekLast()
3.List的API(List接口比Collection接口多的方法)
(1)void add(int index,Object element):在[index]位置添加一个元素,相当于插入
boolean addAll(int index,Collection c):在[index]位置添加多个元素
(2)Object remove(int index):删除指定位置的元素
(3)Object get(int index):返回[index]位置的元素
(4)Object set(int index,Object element):替换[index]位置的元素为element
(5)int indexOf(Object o):在当前集合中查找o这个元素的下标,如果没有返回-1,如果有多个就返回找到的第一个元素的下标
(6)int lastIndexOf(Object o):在当前集合中查找o这个元素的下标,如果没有返回-1,如果有多个就返回找到的最后一个元素的下标
(7)List subList(int fromIndex,int toIndex):截取一部分[fromIndex,toIndex)
(8)ListIterator listIterator():获取一种迭代器
ListIterator是Iterator的子接口,它比Iterator增加了:从后往前遍历的方法,增加了遍历的同时添加和修改元素
boolean hasPrevious():是否前面还有元素
Object previous():获取前面的元素
void add(E e):遍历的同时,添加元素
void set(E e):遍历的同时,替换元素
int nextIndex():返回下一个元素的索引
int previousIndex():返回上一个元素的索引
1.Set系列集合的元素是不能重复的
2.Set的实现类们:HashSet,TreeSet,LinkedHashSet(是HashSet的子类 )
按照元素的存储顺序来说,有一些可保证,有一些不可保证,唯有LinkedHashSet可保证元素添加的顺序
按照元素的大小顺序来说,有一些可保证,有一些不可保证,唯有TreeSet可保证元素的大小顺序
HashSet即不能保证添加顺序,也不能保证大小顺序,是完全无序的
3.如何保证元素不重复?
HashSet和LinkedHashSet:先比较hash值,如果hash值不一样,说明一定不相同,如果hash值一样,再调用equals方法比较
TreeSet:按照元素的大小来决定元素是否相同
4.Set的底层实现是什么?
HashSet: HashMap
TreeSet: TreeMap
LinkedHashSet: LinkedHashMap
Set添加元素add(元素),Map用put(key,value);发现添加到Set中的元素,是作为底层的Map的key,那么value选用了一个Object类型的常量对象PRESENT,
所有的HashSet,TreeSet,LinkedHashSet共用同一个PRESENT对象
1.API
put(Object key,Object value):将指定的值与此映射中的指定键关联
putAll(Map m):将另一个m中所有的映射关系都添加到当前map中
boolean containsKey(Object key):是否包含某个key
boolean containsValue(Object value):是否包含某个value
boolean isEmpty():是否为空
Object get(Object key):根据key获取它的value
void clear():清空所有
Object remove(Object key):根据key删除一对映射关系,并且返回其中的value
int size():元素的个数
遍历Map:
Map接口没有继承java.lang.Iterator接口,因此不支持foreach循环
Map接口中没有提供Iterator iterator()方法返回迭代器对象
Set keySet():获取所有的key,然后遍历它们;这里所有的key组成了一个Set集合,因此它们不可重复
Collection values():获取所有的value,然后遍历它们;这里所有的Value组成了Collection系列的集合,可能重复,也可能不重复
Set entrySet():获取所有的映射关系,然后遍历它们;此时把一对映射关系(key,value)看成一个整体,是Entry类型的对象
任意的引用数据类型都可以作为key和value
2.Map接口的实现类们
HashMap,TreeMap,LinkedHashMap,Hashtable,Properties
Hashtable:旧版,线程安全,它的key和value不能为null
HashMap:相对Hashtable来说新一点,线程不安全,它允许key和value为null
LinkedHashMap是HashMap的子类,比HashMap多维护了映射关系的添加顺序
HashMap:无序的
LinkedHashMap:可以记录添加顺序
TreeMap:按key的大小排序
Properties:是Hashtable的子类,不允许key和value是null,并且它的key和value的类型是String,通常用于存储配置属性
setProperty(key,value):
getProperty(key):返回value值
3.Map中的key不能重复,如何实现不能重复?
TreeMap:根据key的大小,大小相等的两个key就是重复的;如果key重复了,那么后面的value会替换原来的value
其余四个:根据key的hashCode和equals方法
4.Map的底层实现是?
哈希表系列:数组+链表(JDK1.7及之前) 数组+链表/红黑树(之后)
TreeMap:红黑树
数组优点:访问速度块,根据下标直接定位到某个元素
链表优点:不需连续空间,在删/添元素是不需要移动元素,
因为底层根据key的hashCode值通过算法得出[index],但不同的hashCode值可能[index]是相同的,那么这是只能把[index]的多个映射关系用链表连接起来
树的优点:查找速度比链表快