黑马程序员_学习笔记集合框架(I)

来源:互联网 发布:电脑自带录屏软件 编辑:程序博客网 时间:2024/05/29 11:42

------Java培训、Android培训、iOS培训、.Net培训期待与您交流! -------



Java的Collection集合类是一种工具类,用于存储不定长度的数据。

Collection集合常用的子接口为Set,List。

Map 接口也在java.util包下。

List代表有序、重复的集合;

Set代表无序、不可重复的集合;

而Map代表具有映射关系的集合。从Java5之后又增加了Queue体系集合,代表一种队列集合实现。


集合类的出现是为了在编程时保存数量不确定的数据,以及具有映射关系的数据(也就是关系数组),所以也称集合类为容器类。

集合类都位于Java.util包下,为解决线程并发问题Java5之后还在Java.util.concurrent包下提供了支持多线程的集合类。

与数组的不同:数组元素可以保存基本数据类型的值,也可以是对象,但对象必须是同种类型;而集合类只允许保存对象的引用变量。



一:常用集合类之间的层次、继承关系


Collection
|--List:元素是有序的,元素可以重复。因为飞机和体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度快,但是增删稍慢。
|--LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。
|--Vector:底层是数组结构,线程同步,被ArrayList替代了,因为效率低。
|--Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。
|--HashSet:底层数据结构是哈希表。HashSet通过hashCode和equals判断元素是否重复。如果元素的hashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。对于判断元素是否存在,以及删除等操作依赖的方法是元素的hashCode和equals方法。
|--LinkedSet:通过hashcode确定元素的存储位置,同时通过链表确定元素的顺序。
|--TreeSet:可以对Set集合中的元素进行排序,底层数据结构是二叉树。它保证元素唯一性的依据是compareTo方法的return。TreeSet默认顺序采用的是红黑树。TreeSet允许自定义排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需的,这是就需要让集合自身具备比较性,在集合初始化时就让其具有比较性方式。
|--EnumSet:专门为枚举类设计的集合类,其中所有的元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式的指定。EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum内部的定义顺序来决定集合元素的顺序。
|--Map:用于保存具有映射关系的数据。
|--HashMap:底层数据结构是哈希表。HashMap通过hashCode和equals判断元素是否重复。如果元素的hashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。
|--TreeMap:可以对Map集合中的元素进行排序,底层数据结构是二叉树。它保证元素唯一性的依据是compareTo方法的return。TreeSet默认顺序采用的是红黑树。TreeSet允许自定义排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需的,这是就需要让集合自身具备比较性,在集合初始化时就让其具有比较性方式。
|--EnumMap:与枚举类一起使用的Map实现,EnumMap中的所有KEY都必须是单个枚举类的枚举值。创建EnumMap的时候必须显式或隐式的指定它对应的枚举类。
|--Queue:用于模拟队列这种数据结构,不允许随机访问。
|--PriorityQueue:数据的存储不按照加入队列的顺序,而是按照队列元素的大小重新排序。因此,当取出队列元素时,取出的并不是最先加入队列元素而是最小的元素。
|--ArrayQueue:基于数组实现的是双端队列。

Collection提供的方法有:

 boolean add(E e)           确保此 collection 包含指定的元素(可选操作)。 
 boolean addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 
 void clear()           移除此 collection 中的所有元素(可选操作)。 
 boolean contains(Object o)       如果此 collection 包含指定的元素,则返回 true。 
 boolean containsAll(Collection<?> c)    如果此 collection 包含指定 collection 中的所有元素,则返回 true。 
 boolean equals(Object o)           比较此 collection 与指定对象是否相等。 
 int hashCode()           返回此 collection 的哈希码值。 
 boolean isEmpty()           如果此 collection 不包含元素,则返回 true。 
 Iterator<E> iterator()           返回在此 collection 的元素上进行迭代的迭代器。 
 boolean remove(Object o)           从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 
 boolean removeAll(Collection<?> c)       移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 
 boolean retainAll(Collection<?> c)       仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 
 int size()           返回此 collection 中的元素数。 
 Object[] toArray()           返回包含此 collection 中所有元素的数组。 
<T> T[]  toArray(T[] a)           返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 


List特有方法,凡是可以操作角标的方法都是该体系特有的方法


1、增
add(intindex,Eelement);
addAll(index,Collection);

2、删
remove(index);

3、改
set(index,element);

4、查
get(index);
subList(form,to);
listIterator();


List集合特有的迭代器是ListIterator,ListIterator是Iterator的子接口

在迭代时,不可以通过集合对象的方法操作集合中的元素,否则会发生ConcurrentModificationException并发操作异常
所以,在迭代时,只能用迭代器的方法操作元素,可以Iterator方法是有限的

只能使用Iterator的方法,对元素进行判断hasNext(),取出next()和删除remove()的操作

如果想要其他的操作如添加,修改等,就需要使用其子接口ListIterator


该接口只能通过List集合listIterator方法获取

ListIterator 提供特有的方法有

boolean hasPrevious()   如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。 
 int nextIndex()        返回对 next 的后续调用所返回元素的索引。 
 E previous()           返回列表中的前一个元素。 
 int previousIndex() 返回对 previous 的后续调用所返回元素的索引。 
 void set(E e)     用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。 


------Java培训、Android培训、iOS培训、.Net培训期待与您交流! -------


0 0
原创粉丝点击