Java集合容器类型:Collection集合和Map图及其实现类

【数组与集合框架】
Java数组有以下缺点:
1.数组只能存储同一类型的数据
2.数组长度固定不变,不能适应元素数量动态变化的情况
3.数组长度不能代表实际元素的数量
4.数组在内存中以连续空间存储,查找效率低
针对数组的缺陷,java提供了更加灵活可靠的集合框架(封装并改进了数组),框架中有多个集合接口、抽象类和实现类,它们各自适用于不同场合,除了Iterable接口位于java.lang包,集合框架的所有接口和类均位于java.util包中。

【主要继承链】
Java集合容器类型:Collection集合和Map图及其实现类_第1张图片

Java
集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection
接口又有 3 种子接口类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有
ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
【摘自菜鸟教程】

【接口使用说明】
1.Iterable接口和Iterator接口
Iterable接口位于java.lang包,只有一个方法Iterator iterator(),返回一个迭代器的对象,Iterable接口所有的(间接)实现类都实现了该方法(所有的List集合类和Set集合类都有迭代器方法,Map接口的集合类则没有实现迭代器方法)。

Iterator接口位于java.util包,是专门用来实现Collection集合类遍历的接口,List类由于是有序的,还可以使用下标进行遍历,Set类只能使用迭代器进行遍历。
迭代器主要有2个方法:

boolean hasNext()
return true if the iterator has more elements

E next()
return the next element in the iteration.
exception NoSuchElementException if iteration has no more elements
注:该方法将返回Object类型元素,需强转到具体的集合元素的类型

迭代器用法举例:

//1.获取Collection集合类的迭代器
List list=new ArrayList();Iterator it=list.iterator();
//2.遍历迭代器访问集合元素
while (it.hasNext()) {
   String s=(String) it.next();
   System.out.println(s);
  }

2.Collection接口
Collection接口,可以存储一组任意数据类型的、无序的、值可重复的、长度可变的数据(对象)。
Collection接口没有直接的实现类,只有子接口,常用的子接口为Set和List,此外,还有一个没有实现类的Queue接口
Collection接口定义有多个方法,List接口和Set接口继承了这些方法,并各自扩展了相应的方法。
3.List接口
List接口是有序的、值可重复的集合接口,有直接的实现类,常用的实现类为ArrayList和LinkedList。
由于值有序,可以通过索引访问List集合中的元素,另外,由于继承了迭代器方法,还可以通过迭代器来访问List集合中的元素,最后,还可以使用增强for循环来遍历List集合。
List接口中常用的方法:

1.int size()//集合中元素的数量
@return the number of elements in this list

2.boolean isEmpty()//集合是否为空
@return true if this list contains no elements

3.boolean contains(Object o)//集合是否包含指定的对象
@return true if this list contains the specified element

4.Iterator iterator()//集合对应的迭代器对象
@return an iterator over the elements in this list in proper sequence

5.Object[] toArray()//集合对应的数组形式
@return an array containing all of the elements in this list in proper sequence

6. T[] toArray(T[] a)//数据类型统一的集合对应的数组形式,泛型
@param a the array into which the elements of this list are to be stored, if it is big enough; otherwise, a new array of the same runtime type is allocated for this purpose.
@return an array containing the elements of this list
例:x为只含有String类型数据的List集合类对象
String[] y = x.toArray(new String[0]);
将x转换为数组形式,数组长度初定为0,如果对应的List集合元素数量大于0,数组长度扩展至相应长度

7.boolean add(E e)//集合末尾添加一个对象(数据),一些集合类不允许添加null元素,一些集合类还有其它限制
@param e element to be appended to this list
@return true if this collection changed as a result of the call
* Lists that support this operation may place limitations on what
* elements may be added to this list.  In particular, some
* lists will refuse to add null elements, and others will impose
* restrictions on the type of elements that may be added.  List
* classes should clearly specify in their documentation any restrictions
* on what elements may be added.

8.boolean remove(Object o)//集合移除一个对象(数据),如果存在,移除索引下标最低的那个
@param o element to be removed from this list, if present
@return true if this list contained the specified element
*Removes the first occurrence of the specified element from this list,
*if it is present (optional operation).

9.boolean containsAll(Collection c)//集合是否包含指定的集合中的所有对象
10.boolean addAll(Collection c)//集合添加一个集合中的所有对象,迭代取出添至the end of this list
11.boolean addAll(int index, Collection c)//集合添加一个集合中的所有对象,迭代取出从index位置开始添加
12.boolean removeAll(Collection c)//集合移除一个集合中的一组对象,匹配多少移除多少
13.boolean retainAll(Collection c)//集合移除所有的,和另一个集合中的任何对象都不匹配的,对象
14.void clear()//清空集合,使其为空empty

15.boolean equals(Object o)//两个集合是否相等
@Returns true if and only if the specified object is also a list and two lists are defined to be
equal if they contain the same elements in the same order.

16.int hashCode()//集合的散列值,每一种数据类型都有自己的hashcode值计算方法,详见底层代码
17.E get(int index)//集合索引下标获取对象
18.E set(int index, E element)//替换(重赋值)集合索引下标对应的数据
19.void add(int index, E element)//集合在指定位置插入数据,该位置及以后的原数据的索引值加1,即右移
20.E remove(int index)//集合移除指定位置的数据,该位置以后的原数据的索引值减1,即左移
21.int indexOf(Object o)//查找对象在集合中的索引下标中最低的一个,未找到返回-1
22.int lastIndexOf(Object o)//查找对象在集合中的索引下标中最高的一个,未找到返回-1

4.Set接口
Set接口是无序的、值不可重复的集合接口,有直接的实现类,常用的实现类为HashSet。
由于值无序,不可通过索引访问Set集合中的元素,需要使用foreach循环或迭代器。
Set接口中的方法共15个,同List接口中的方法的第1-16个,除第11个
5.Map接口
Map接口存储键到值的映射关系,key无序且不允许重复(key集实际是一个Set集),每一个key最多可以映射一个value,value无序且允许重复(value集实际是一个Collection集),可以通过key值来检索value值。
Map接口提供了相应的方法用来查看所有key的集合(Set集)、所有value的集合(Collection集)、所有key-value的集合(Set集)。
可单独循环遍历键集和值集(使用迭代器或增强for循环),for-each循环方法如下:

for (Object key : map.keySet()) {
	//键Set集遍历
}
for (Object value : map.values()) {
	//值Collection集遍历
}

Map接口最常用的实现类是HashMap,HashMap类不对外提供迭代器方法,需使用间接方法循环遍历HashMap本身,如取得key集后遍历出key-value集,或者通过public Set> entrySet()直接取得key-value对的Set集后再遍历该集合,后者使用方法如下:

Map map = new HashMap();
//获取key-value对的Set集
Set> keyValueSet = map.entrySet();
//for-each遍历Set集
for (Entry mapElement : keyValueSet) {
	System.out.println("key:"+mapElement.getKey());
	System.out.println("value:"+mapElement.getValue());
}

Map集合的key、value可以是任何数据类型,包括原始数据类型和引用类型,但key值不允许也是一个Map类型(value值可以)。
Map接口的一些实现类对key和value值有所约束,有些不允许出现空的key值和value值,有的限制key值的数据类型。

Map接口中常用的方法:

1.int size()//集合中键值对的数量
2.boolean isEmpty()//集合是否为空
3.boolean containsKey(Object key)//集合是否包含指定key
4.boolean containsValue(Object value)//集合是否包含指定value
5.V get(Object key)//根据指定key值获取对应的value值,如果不含该key值且Map实现类允许出现空的value,则返回null,否则抛异常。如果含该key值,但该key值没有对应的value值或对应空的value值,也返回null。较复杂,详见底层注释
6.V put(K key, V value)//集合中放入一对key-value,如果集合之前有该key值,则对应的value值被新值替换,且返回原来的value值,如果原来没有对应的value或对应的value为空值,返回null;如果之前无该key值,返回null。较复杂,详见底层注释
7.V remove(Object key)//删除指定key所对应的key-value对,如果无该key值,则?,如果有该key值,则返回对应的value值,如果原来没有对应的value或对应的value为空值,返回null。较复杂,详见底层注释
8.void putAll(Map m)//复制一个Map集合到本集合中
9.void clear()//清空集合中的所有键值对,集合为empty
10.Set keySet()//获取所有key的集合,获取集合后支持Set集合的remove方法,不支持add方法
11.Collection values()//获取所有value的集合,获取集合后支持Collection集合的remove方法,不支持add方法
12.Set> entrySet()//获取key-value实体对组成的Set集合

【常用实现类使用说明】
1.ArrayList、LinkedList和HashSet类
ArrayList类和LinkedList都是List接口的实现类,对数组进行了封装,二者都是有序、值可重复、长度可变的,二者几乎是一样的,主要区别是存储数据方式不同,进而使用场景也不同。
ArrayList,正如其名"数组列表",其存储方式和数组相同,都是使用连续内存空间存储数据,和数组非常接近,与数组最大的区别就是长度可变,因此又称动态数组。
LinkedList,正如其名"链式列表",其存储方式和数组不同,而是使用非连续内存空间存储数据。
HashSet是Set接口最常用的一个实现类,是无序的、值不可重复、长度可变的集合类。HashSet和LinkedList类似,也是使用非连续内存空间存储数据。
ArrayList、LinkedList和HashSet使用场景:
在内存中连续分配存储空间的好处是,对集合循环遍历以及随机访问元素时效率较高,但缺点是,在添加和删除非尾部元素时会导致后面所有元素的移动,从而降低效率,因此,ArrayList最适用于以查询为主的数据的存储 。
采用链表的方式存储数据的好处是,插入、删除元素时只需破坏和重建一环,效率较高,但缺点是,查找效率很低,由于地址不连续,只能从头开始一环环地查找目标地址,因此,LinkedList最适用于以增删改为主的数据的存储。
当数据是可以重复的时,只能使用ArrayList、LinkedList存储。当数据是不可重复的时,既可以使用ArrayList、LinkedList存储,也可以使用HashSet存储。HashSet使用非连续内存空间存储数据,因此HashSet最适用于以增删改为主的数据的存储。
综上,当数据以查询为主时,一律使用ArrayList;当数据以增删改为主时,如果数据不可重复,使用HashSet,如果数据可重复,则使用LinkedList。
2.HashMap类
HashMap是Map接口最常用的一个实现类,内容和Map定义的基本相同
HashMap使用场景:
需要存储键值对时使用Map实现类,最常用的就是HashMap
HashMap、Hashtable、ConcurrentHashMap区别简介:
HashMap源自JDK1.2,是线程不安全的(其操作方法没有被synchronized)
Hashtable源自JDK1.0,是线程安全的,但该类名没有遵循驼峰命名
ConcurrentHashMap源自JDK1.7,是线程安全的,且并发效率高于Hashtable

你可能感兴趣的:(Java常用基础)