java集合总结
------- android培训、java培训、期待与您交流! ----------
集合是存储对象的的。相对于数组,集合有两个不同:长度可变,可以存储不同类型的对象。其关系如下:
Collection是一个接口,有如下方法:
返回类型 |
方法 |
作用 |
boolean |
add(E e) |
添加单个元素 |
boolean |
addAll(Collection<? extends E> c) |
添加多个元素 |
boolean |
remove(Object o) |
删除元素 |
boolean |
removeAll(Collection<?> c) |
删除多个元素 |
void |
clear() |
全部删除 |
boolean |
retainAll(Collection<?> c) |
删除部分元素,取交集 |
boolean |
contains(Object o) |
判断此集合是否包含指定对象 |
boolean |
containsAll(Collection<?> c) |
判断此集合是否为传入集合的父集 |
boolean |
isEmpty() |
判断此集合是否空 |
int |
size() |
返回集合中有多少个元素 |
int |
hashCode() |
算hash码 |
Iterator<E> |
iterator() |
返回迭代器 |
boolean |
equals(Object o) |
设置比较元素的方式 |
相对来说比较难以理解的就是迭代器Iterator。毕老师的视频里讲得很好:
由于不同容器的底层数据不同,所以取出元素的方式也不同,但如果对于不同的容器定义不同的数据取出方式,则会造成java体系过于臃肿和复杂。所以在每个类型的容器中,有实现数据取出的内部类,而这些内部类,实现了迭代器接口的功能,使得取出元素的方式变得统一。
一个非常便于理解的例子:在游戏厅里,有很多通过操纵杆抓取东西(公仔、冰激凌等)的游戏机,这些不同的游戏机就像不同的容器,其内部都有取出东西的勾爪(取出方式),而所有的勾爪都可以通过操作杆(Iterator)来进行方便、统一的控制。每个容器的对象,可以通过iterator()方法,返回一个实现了Iterator接口的对象,通过该对象的hasNext、next、remove的方法进行容器里对象的操作。
List
返回类型 |
方法 |
作用 |
boolean |
add(E e) |
在尾部添加元素 |
void |
add(int index, E element) |
在指定位置插入元素 |
boolean |
addAll(Collection<? extends E> c) |
在尾部添加一批元素 |
boolean |
addAll(int index, Collection<? extends E> c) |
指定位置插入一批元素 |
void |
clear() |
清空所有元素 |
boolean |
contains(Object o) |
判断是否包含指定元素 |
boolean |
containsAll(Collection<?> c) |
判断是否为传入集合的父集 |
E |
get(int index) |
用脚标获取对象 |
int |
hashCode() |
计算hash码 |
int |
indexOf(Object o) |
获取指定对象的脚标 |
boolean |
isEmpty() |
是否为空 |
int |
lastIndexOf(Object o) |
从后往前查找指定对象,返回脚标 |
E |
remove(int index) |
按脚标删除元素,返回对应元素 |
boolean |
remove(Object o) |
移除第一次出现的指定对象 |
boolean |
removeAll(Collection<?> c) |
移除指定集合的所有元素 |
boolean |
retainAll(Collection<?> c) |
只保留与指定集合的交集元素 |
E |
set(int index, E element) |
用指定对象替换掉对应脚标的对象 |
int |
size() |
返回列表的对象数 |
List<E> |
subList(int fromIndex, int toIndex) |
返回一个子list,含头不含尾 |
Object[] |
toArray() |
转成Array返回 |
<T> T[] |
toArray(T[] a) |
|
boolean |
equals(Object o) |
|
Iterator<E> |
iterator() |
返回迭代器 |
ListIterator<E> |
listIterator(),返回list类特有的迭代器 |
返回迭代器 |
ListIterator<E> |
listIterator(int index),返回list类特有的迭代器 |
返回指定位置开始的迭代器 |
List可以通过遍历的方式取出所有元素,也可通过迭代器取出所有元素。但在使用遍历的方式时,不能添加或删除元素。如果要添加或者删除元素,可以通过迭代器的方式实现(删除的时候,可以用Iterator;添加或修改的时候需要用到List特有的迭代器ListIterator)。
toArray的方法可以将List转为数组。需要注意的是,传入的数组的长度如果小于了List的长度,那么该方法会创建一个新的数组,长度为集合的长度,并返回;但传入的数组长度大于了List的长度,超出的部分其值为null。
这个方法的目的是限定对元素的操作。
List中有3个子类,Vector、ArrayList、LinkedList。
Vector是在集合框架出现以前的容器JDK1.0,其特点是线程同步,所以速度慢。100%增长。具备特有方法elements(可以返回Eumeration对象,在后面通过SequenceInputStream合并流的时候可以使用。
ArrayList是集合框架出现以前的内容器JDK1.2,线程不同步,所以速度快。50%增长。
ArrayList和Vector底层数据都是数组。
LinkedList的底层数据是链表。
Set
存入和取出的顺序不同,是无序的。不允许相同元素出现。
返回类型 |
方法 |
作用 |
boolean |
add(E e) |
如果不存在对象则添加,返回是否添加 |
boolean |
addAll(Collection<? extends E> c) |
如果set中没有指定collection中的所有元素,则将其添加 |
void |
clear() |
清空Set |
boolean |
contains(Object o) |
判断是否包含指定对象 |
boolean |
containsAll(Collection<?> c) |
判断是否包含指定的集合中所有的对象 |
boolean |
equals(Object o) |
|
int |
hashCode() |
hash码 |
boolean |
isEmpty() |
是否为空 |
Iterator<E> |
iterator() |
返回迭代器 |
boolean |
remove(Object o) |
如果存在指定对象,则移出 |
boolean |
removeAll(Collection<?> c) |
仅保留set与collection补集 |
boolean |
retainAll(Collection<?> c) |
仅保留set和collection的交集 |
int |
size() |
set中的元素数 |
Object[] |
toArray() |
转Array |
<T> T[] |
toArray(T[] a) |
Set有两个常用的子类:
HashSet,数据结构是哈希表,线程非同步。在比较元素是否相同时,先比较元素的hashCode()如果hashCode相同,再调用equals方法,比较元素是否相同。所以在创建类的对象,并想往HashSet中存储的时候,要定义类的hashCode和equals方法,覆盖掉Object类的方法。
TreeSet,数据结构是二叉树,线程非同步。因为TreeSet在添加元素时,要判断元素应该放在那个位置,所以对象所在的类,要实现Comparable接口,并定义compareTo方法。在定义compareTo的时候,先写主要条件,再写次要条件。如果对象所属的类没有实现Comparable接口,或者实现的方法不是我们需要的,可以在构造TreeSet的时候传入自定义的比较器。比较器需要实现Compartor接口,复写compare(o1,o2)方法。两种排序都存在的时候,以容器的比较器为主
Set集合通过迭代器取出元素。
List和Set的子类实现了Iterable,可以通过增强for循环来遍历元素。局限性就是只能取出,不能做修改。
Map
存储的键值对的映射关系。
返回值 |
方法 |
作用 |
void |
clear() |
清空map |
boolean |
containsKey(Object key) |
判断key中是否包含指定key |
boolean |
containsValue(Object value) |
判断value中是否包含指定value |
Set<Map.Entry<K,V>> |
entrySet() |
把map转成set |
boolean |
equals(Object o) |
|
V |
get(Object key) |
通过key获取对应的value |
int |
hashCode() |
算hashcode |
boolean |
isEmpty() |
是否为空 |
Set<K> |
keySet() |
返回key的集合 |
V |
put(K key, V value) |
添加或修改单个键值对 |
void |
putAll(Map<? extends K,? extends V> m) |
添加或修改一批键值对 |
V |
remove(Object key) |
移除指定的key的映射关系 |
int |
size() |
map的映射关系数 |
Collection<V> |
values() |
返回value的集合 |
三个主要的子类
HashTable底层是哈希表数据结构,不可以存入null键和null值;JDK1.0,线程同步。
HashMao底层是哈希表数据结构,键或者值可以为null;JDK1.2线程不同步。
TreeMap底层是二叉树数据结构,线程不同步,具备根据键排序特点。用作键的对象必须具备hashCode和equals方法。
Map集合的两种取出方式:
1, keySet()返回Map中所有的键的集合,返回类型是Set,再利用Set的迭代器取出值。
2, entrySet()返回Map中的对应关系的集合,类型为Set,其中的对象类型为Map.再利用Set的iterator方法获得其Map.Entry类型的对象,然后使用其getKey、getvalue返回键值对,还可用setValue进行值的修改。
Map.Entry是一个接口,是Map接口中的一个内部接口
可以使用以下方式取出元素