Java Collection Framework:Java集合框架
在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架。
Javav程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创造出来一些对象,然后直接应用就可以了。大大提高了编程效率。
Java集合框架的基本接口/类层次结构:
注:[I]表示接口、[C]表示类
java.util.Collection [I]
+--java.util.List [I]
+--java.util.ArrayList [C]
+--java.util.LinkedList [C]
+--java.util.Vector [C]
+--java.util.Stack
+--java.util.Set [I]
+--java.util.HashSet [C]
+--java.util.SortedSet [I]
+--java.util.TreeSet [C]
java.util.Map [I]
+--java.util.SortedMap [I]
+--java.util.TreeMap [C]
+--java.util.Hashtable [C]
+--java.util.HashMap [C]
+--java.util.LinkedHashMap [C]
+--java.util.WeakHashMap [C]
对集合操作的工具类:
Java提供了java.Util.Collections和java.util.Arrays两个工具类简化了对集合的操作。
(注意:java.util.Collection是一个接口,是Java集合层次的根接口。java.util.Collections是一个对集合提供一些操作的工具类)
java.util.Collections提供了一些static方法用来操作或创建Collection,Map集合。
java.util.Arrays主要提供static方法来对数组进行操作。
线程安全的类:
Vector:比ArrayList多了线程同步机制。
Stack:堆栈类。
Hashtable:比HashMap多了线程安全。
Collection接口是所有集合接口的积累,提供了集合接口的通用操作。
定义如下:
public
interface
Collection<E>
extends
Iterable<E>
{
// Basic operations
int
size();
boolean
isEmpty();
boolean
contains(Object element);
boolean
add(E element);
//optional
boolean
remove(Object element);
//optional
Iterator<E>
iterator();
// Bulk operations
boolean
containsAll(Collection<?> c);
boolean
addAll(Collection<?
extends E> c);
//optional
boolean
removeAll(Collection<?> c);
//optional
boolean
retainAll(Collection<?> c);
//optional
void
clear();
//optional
// Array operations
Object[]
toArray();
<T>
T[] toArray(T[]
a);
}
List是一个顺序的Collection(通常被称作序列)。通常也代表一个线性表的数据结构。List可以包含重复元素。List接口基本功能如下:
按位置访问—通过元素在list中的位置索引访问元素。
查询—获取某元素在list中的位置。
迭代—扩展了Iterator的接口能实现更多的功能,可以在链表中间添加元素。
List子集合—获取List某个位置范围内的子集合。
public
interface
List<E>
extends
Collection<E>
{
// Positional access
E get(int
index);
E set(int
index, E element);
//optional
boolean
add(E element);
//optional
void
add(int index, E element);
//optional
E remove(int
index);
//optional
boolean
addAll(int index,
Collection<?
extends E> c);
//optional
// Search
int
indexOf(Object o);
int
lastIndexOf(Object o);
// Iteration
ListIterator<E>
listIterator();
ListIterator<E>
listIterator(int index);
// Range-view
List<E>
subList(int from,
int to);
}
Java提供了两个泛型的List的实现:LinkedList(链表)和ArrayList(数组列表)
ArrayList底层采用数组来保存每个集合元素。
LinkedList则是链式存储的线性表,本质是双向链表。我们可以把LinkedList当做栈来使用。
Set是一个不包含重复元素的无序集合(Collection)。Set接口中的函数都是从Collection继承而来。但限制了add的使用,使其不能添加重复元素。
Set接口声明如下:
public
interface
Set<E>
extends
Collection<E>
{
// Basic operations
int
size();
boolean
isEmpty();
boolean
contains(Object element);
boolean
add(E element);
//optional
boolean
remove(Object element);
//optional
Iterator<E>
iterator();
// Bulk operations
boolean
containsAll(Collection<?> c);
boolean
addAll(Collection<?
extends E> c);
//optional
boolean
removeAll(Collection<?> c);
//optional
boolean
retainAll(Collection<?> c);
//optional
void
clear();
//optional
// Array Operations
Object[]
toArray();
<T>
T[] toArray(T[]
a);
}
Java中包含了三个通用的Set实现:HashSet,TreeSet和LinkedHashSet。
HashSet通过hash表存储集合元素。TreeSet的底层通过TreeMap的key来保存set集合的元素,而TreeMap采用红黑树(二叉排序树)来保存Map每个Entry。LinkedHashSet通过通过链表存储集合元素。
Map是Java提供的一个接口。Map是一种包含键值对的元素的集合。Map不能包含重复的键,并可以通过键实现对值得快速访问。
public interface Map<K,V> {
// Basic operations
V put(K key, V value);
V get(Object key);
V remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
// Bulk operations
void putAll(Map<? extends K, ? extends V> m);
void clear();
// Collection Views
public Set<K> keySet();
public Collection<V> values();
public Set<Map.Entry<K,V>> entrySet();
// Interface for entrySet elements
public interface Entry {
K getKey();
V getValue();
V setValue(V value);
}
}
Java平台中提供了三种通用的Map实现:HashMap,TreeMap和LinkedHashMap。此外,哈希表也实现了Map接口。
Map不提供迭代器,而是提供3种方法,将Map对象的视图作为Collection对象返回。由于这些视图本身就是Collection,因此它们可以被迭代。
Set<KeyType> keySet()
Collection<ValueType> values()
Set<Map.Entry<KeyType,ValueType>> entrySet()
public
interface
Map<K,V>
{
// Basic operations
V put(K
key, V value);
V get(Object
key);
V remove(Object
key);
boolean
containsKey(Object key);
boolean
containsValue(Object value);
int
size();
boolean
isEmpty();
// Bulk operations
void
putAll(Map<?
extends K,
?
extends V> m);
void
clear();
// Collection Views
public
Set<K> keySet();
public
Collection<V> values();
public
Set<Map.Entry<K,V>>
entrySet();
// Interface for entrySet
elements
public
interface
Entry
{
K getKey();
V getValue();
V setValue(V
value);
}
}
因为在Map中不能有重复的键,所以keySet和entrySet是Set对象。