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接口中的一个内部接口

可以使用以下方式取出元素

posted @ 2012-12-29 12:25  qinbin  阅读(337)  评论(0编辑  收藏  举报