Java中提供了许多容器接口及实现这些接口的容器类还有一些操作容器中元素的工具类。不好好总结一下,总是感觉有些混乱,特作一下总结,有不妥之处欢迎拍砖。
它们全部封装在java.util包中。
首先看一下容器API的继承结构图:
从图中可以清楚的看出Java容器主要分为两大类:a)继承自Collection的. b)继承自Map的.
并且这两类也很好区别。a类中存放对象都是一个一个的,有点类似基本数据类型中的数组。而b类则是成对的存放(Key-Value键值对的形式)。
A)Collection接口
Collection接口是第一类容器类的根接口,其中定义了和容器操作相关常用方法:
int size(); boolean isEmpty(); void clear(); boolean contains(Object element); boolean add(Object element); boolean remove(Object element); Iterator iterator(); boolean containsAll(Collection c); boolean addAll(Collection c); boolean removeAll(Collection c); boolean retainAll(Collection c); object[] toArray();
对于上面的这些方法有两类方法需要注意:容器类对象在调用contains,remove等方法时不可避免的要比较对象相等与否。这会涉及Object类的两个方法:boolean equals(Object obj), int hashCode();对于自定义的类我们自己要重写这两个方法以实现自定义的相等规则。
Collection 接口还有一个方法:Iterator iterator(); 用以返回一个实现了Iterator接口的对象。
此接口位于java.util中只有三个方法:
boolean hasNext(),判断游标右边是否有元素
E next(),返回游标右边的第一个元素,并将游标向右移一个位置
void remove(),删除游标右边的第一个元素,并将游标向右移一个位置
B) Set接口
set接口是Collection接口的子接口,set接口中的方法完全继承自Collection,自身没提供任何新方法。·Set中存放的元素是无顺序且不可重复的(类似数学中的集合)。其实现类主要有HashSet,TreeSet等。
C) List接口
实现List接口的容器类中的元素是有顺序且可重复的。List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。其实现类主要有ArrayList,LinkedList等。
其中java.util.Collections中提供了一些静态方法,实现了基于List容器的一些常用算法。
void sort(List) 对List容器内的元素排序
void shuffle(List)对List容器内的对象进行随机排列
void reverse(List)对List容器内的对象进行逆序排列
void fill(List,Object)用一个特定对象重写整个List容器
void copy(List dest,List src)将src 容器中的内容拷贝到dest中
int binarySearch(List,Object)对于顺序的List容器,采用折半查找的方法查找特定对象
有一个问题需要注意一下:java.util.Collections包中的方法是如何确定对象的“大小”顺序,其实这和前面我们说过的Collection接口中的remove,contains等方法是如何确定两个对象是否相等有些类似,Collection是通过Object方法中提供的 boolean equals(Object obj)及int hashCode()方法确定的。同样的Collections是通过 java.lang.comparable接口中的comparaTo方法实现的。其实所有可以排序的类都是通过实现comparable接口来进行排序的。
对于这三种容器:Array,Linked,Hash在实际使用中如何选择呢?
衡量标准:读和改的效率
Array 读快改慢
Linked 读慢改快
Hash 两者之间
D)Map接口
实现map接口的类用来存储键值对,Map中存储的值是通过键来标识的所以Map中的键要是惟一的不能重复。其主要实现类:HashMap,TreeMap等。
常用方法:
Object put(Object key,Object value);
Object get(Object key);
Object remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
void putAll(Map t);
void clear();
PS:后期有什么新的发现或理解会及时添加.