集合类主要是负责保存、盛装其他数据,因此集合类也叫容器类。所有的集合类都在java.util包下面,集合只能保存对象,与数组都点区别,数组可以保存基本类型和对象,主要由Collection和Map接口派生出来。
一、Collection
Collection 是List、Set、Queue接口的父接口,它有以下接口:
- boolean addAll(Collection c) :该方法是把集合c里的元素全部添加到操作集合中,如果添加操作改变了就返回true。
- void clear() :这个方法是清除集合里的所有元素,把集合的长度变为零。
- boolean contains(Object o):这个方法是判断集合是否包含指定元素。
- boolean containsAll(Collection c):判断集合里是否包含集合c里所有的元素。
- boolean isEmpty():判断集合是否为空,长度为零时返回true。
- Iterator iterator():返回一个iterator对象,用来遍历集合。
- boolean remove(Object o):删除集合中的元素o,一个或者多个成功就返回true。
- boolean removeAll(Collection c):删除集合中包含集合c中的元素
- boolean retainAll(Collection c):删除集合中不包含集合c中的元素。
- int size():返回集合中的元素个数
- Object toArray():把集合转换成数组
Collection 的实现类已经重写了toString的方法,可以一次性的输出所有的元素,以上的方法不用刻意去记,了解后,平时多用自然会记住。
Iterator接口
Iterator接口主要是用于遍历Collection集合元素。
- boolean hasNext():如果被迭代的集合元素还未遍历,就返回true
- Object next():返回集合里的下一个元素
- void remove():删除上一次next返回的集合元素。
当使用Iterator迭代Collection集合元素的时候,集合里的元素不能被改变,只能用iterator的remove,否则会抛异常。具体原因看一下 Iterator的原码就明白了。
foreach循环遍历集合
for(Object obj : collection){
}
使用foreach循环,也不能修改集合的元素,否则会抛出异常。
二、Set集合
Set集合与Collection集合基本一样,没有增加方法,但set集合不能有重复的集合。
set集合是根据元素对象的equals方法比较的。
HashSet类
大多数使用set的时候就是使用这个实现类,具体特点:
- 不能保证元素的排列顺序,顺序有可能发生变化
- 不是同步的,如果多线程访问的时候,就要使用代码来控制
- 集合元素值可以为null
HashSet 对比的是equals 和hashCode 两个方法,HashSet是根据hashCode值来决定元素的存储位置,当hashCode()方法返回的值不相同,可以存入,当hashCode返回相同,如果equals返回的也相同,那就会判断元素重复,无法添加,如果hashCode返回的相同,但equals返回的不相同,也会存入,但这样是最影响性能的。
LinkedHashSet类
LinkedHashSet类是HashSet的子类,所以有hashset的属性,也是根据hashcode来决定元素的存储位置,但它同时使用链表来未婚元素的次序,这样访问元素的时候会按照添加的顺序去访问,这这样会降低插入的性能,不过会提高迭代的性能。
TreeSet类
TreeSet 是SortedSet接口的实现类,TreeSet 可以确保集合元素处于排序状态,TreeSet增加了这几个方法:
- Comparator comparator():如果采用了定制排序就会返回Comparator,如果采用自然排序就会返回null
- Object first():返回集合中的第一个元素
- Object last():返回集合中的最后一个元素
- Object lower(Object e):返回指定元素之前的元素。
- Object higher(Object e):返回指定元素之后的元素。
- SortedSet subSet(fromElement,toElement):返回此set的子集合,范围从from(包含)到to(不包含)
- SortedSet headSet(toElement):返回子集,由小于toElement的元素构成。
- SortedSet tailSet(fromElement):返回子集,由大于或等于fromElement的元素组成
TreeSet支持两种排序方法:自然排序和定制排序,默认是自然排序
1、自然排序
用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列,这种方式就是自然排序。
compareTo方法哪来的呢?它是从Comparable接口继承过来的,方法返回int,当返回0,表示对象相等,对象相等则不能存入set中,返回正整数,表示调用者大于对比者,反之对比者小于调用者。如果一个对象添加到treeset集合里,这个对象没有实现Comparable接口,那么会报错。正常情况下,集合里的元素都是同一类的对象。
2、定制排序
定制排序通过Comparator接口来实现来帮助实现,这个接口有个方法 int compare(T o1,T o2),返回正数则o1比o2大,返回0表示o1等于o2,返回负数表示o1小于o2.
要实现定制排序,就要在创建TreeSet集合对象的时候,提供一个Comparator对象与该TreeSet集合关联。
public class TreeSetTest {
public static void main(String[] args) {
TreeSet ts = new TreeSet<M>(new Comparator<M>() {
public int compare(M o1, M o2) {
return o1.age > o2.age ? 1 : o1.age < o2.age ? -1 : 0;
}
});
ts.add(new M(7));
ts.add(new M(9));
ts.add(new M(2));
System.out.println(ts);
}
}
class M{
int age;
public M(int age) {
this.age =age;
}
public String toString() {
return "M:age="+age;
}
}
三、List集合
List集合代表一个元素有序、可重复的元素,默认是按元素的添加顺序为索引。
List 是Collection的子接口,增加了以下一些方法:
- void add(int index,Object element):将元素element插入到集合的index处
- boolean addAll(int index,Collection c):将集合c插入到集合的index处
- Object get(int index):返回集合index处的元素
- int indexOf(Object o):返回对象o在集合中第一次出现的位置
- int lastIndexOf(Object o):返回对象o在集合中最后一次出现的位置
- Object remove(int index):删除集合index的元素并返回
- Object set(int index,Object element):把集合index处的元素替换成element,并返回新元素
- List subList(int fromIndex,int toIndex):返回从from开始到to的集合子集,不包含to处的元素
ArrayList和Vector实现类
两个实现类封装了一个动态的允许再分配的Object[] 数组。
这个两个类的用法基本相同,但ArrayList不是线程安全,而Vector是线程安全。
- void ensureCapacity(int minCapacity):将集合中的Object[] 数组长度增加minCapacity,如果需要大量加入元素,可一次性增加,提高性能。
- void trimToSize():调整集合中数组长度当前元素的个数,可节省空间
四、queue集合
Queue 用于模拟队列数据结构,先进先出(FIFO)
- void add(Object e):加入队列的末尾
- Object element():获取队列头部的元素,但不删除
- boolean offer(Object e):加入队列的末尾,如果队列有容量限制,用这个方法会更好
- Object peek():获取队列头部的元素,但不删除,如果为空返回null
- Object poll():获取队列头部的元素,并且删除,如果队列为空返回null
- Object remove():获取队列头部的元素,并且删除
PriorityQueue实现类
该类保存的元素不是按照加入队列的顺序,而是按照队列元素的大小进行重新排序,排序规则有自然排序和定制排序,使用跟TreeSet的一样。
Deque接口
Deque接口是Queue的子接口,代表一个双端队列。
该类包含了pop、push方法可当成栈来使用。
ArrayDeque 是Deque的实现类。
LinkedList是List、Deque接口的实现类。
使用ArrayList、Vector集合用随机访问的方法(get)来遍历元素,而对于LinkedList集合,应该使用迭代器来遍历,经常使用插入、删除的操作使用LinkedList的性能比较好。
五、Map
map 用于保存具有映射关系的数据,key、value可以是任何引用类型的数据,key不能重复,就是key对象的equals方法都是返回false。
- void clear():清除map对象里的值
- boolean containsKey(Object key):判断是否包含key
- boolean containsValue(Object value):判断是否包含value
- Set entrySet():返回set集合,集合里存放Map.Entry对象,这个对象是map内部类里面存放key-value对,有getKey、getValue、setValue方法
- Object get(Object key):根据key获取value值
- boolean isEmpty():判断集合是否为空
- Set keySet():返回全部key的set集合
- Object put(Object key,Object value):添加key-value对,如果存在key相等,会覆盖旧的value值
- void putAll(Map m):复制map m到集合中
- Object remove(Object key):根据key删除key-value对,返回value,如果没有key,就返回null
- int size():返回map集合里的对数
- Collection values():返回所有value组成的collection
实现类
HashMap和Hashtable
Hashtable的key和value不能为null,并且是线程安全的,HashMap的key或value,可以为null,不是线程安全。
他们的key对比的规则跟hashset的规则是一样的,而value的对比就是用equals方法对比。都是无序的。
LinkedHashMap是HashMap的子类,增加了链表来维护插入的顺序。
properties类
Properties类是Hashtable的子类,用来处理属性文件。
- String getProperty(String key):根据key获取value
- String getProperty(String key ,String defaultValue):根据key获取value,如果没有就返回defaultValue
- Object setProperty(String key ,String value):根据key设置value
- void load(InputStream inStream):从输入流中获取key-value,追加到到集合中。
- void store(OutputStream outputSteam,String comments):将key-value输出到文件中
六、Collections工具类1、 排序操作
1、排序操作
- void reverse(List list) 反转
- void shuffle(List list) :随机排序
- void sort(List list):根据元素的自然顺序排序
- void sort(List list,Comparator c):根据指定的comparator产生的顺序排序
- void swap(List list,int i,int j):交换
- void rotate(List list,int distance):移动
2、查找、替换操作
3、同步控制
使用synchronizedXxx()方法包装成线程安全。