1. 集合:用来动态存储多个对象的一种数据结构。
Java SE API中提供的集合都放置在java.util包中。
2. Collection<E>接口:申明一了系列操作集合中的对象的方法。
1) 常用方法:
boolean add(E e);
int size();
Iterator iterator(); //返回迭代器
3. Iterator<E>接口:迭代器接口,用来遍历集合中的所有元素。Collection接口中定义了返回迭代器的方法。
1) boolean hasNext();
2) E next();
3) 凡是实现了Iterable接口的集合类都可以直接使用for-each来进行遍历。
3. Set接口:不允许重复元素(equals相等)的集合接口。数学中的集合。
1) 要存放到Set接口中的对象,它对应的类应该重写equals方法和hashCode方法,以实现业务意义上的相等规则。
2) 常用的数据类型:8种基本数据类型包装类、String类、Date类、Calendar类它们都重写了equals和hashCode方法。
4. Set实现类:
★1) HashSet: 内部采用散列表来存储元素。
a) 散列表的存储原理:首先获取对象的哈希码值,根据这个值用固定算法计算出它在散列表中的存储位置;把对象存储到散列表的指定位置。存储到指定位置时,先看指定位置原来是否已经存在对象,如果存在,还需要进行equals比较(如果equals相等,说明存在重复元素,不存放,否则存放)。
b) 散列表存取对象的效率最高。
c) 示例:
d) 适合情况:不允许重复元素,又不在乎存取顺序。
2) LinkedHashSet: 内部采用散列表和双向链表结构来存储元素。
a) 适合情况:不允许重复元素,但又需要保存元素的顺序。
b) 示例:
5. List接口:有序的列表。允许重复元素。
1) 可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
2) 可以使用listIterator方法返回List专用的ListIterator迭代器。
6. List实现类
★1) ArrayList:数组列表。内部采用数组结构来存储元素。
a) 根据索引来存取元素的效率很高。
b) 示例:
c) 适合于:要遍历显示所有元素的情况。不适合需要频繁增删元素的情况。
2) LinkedList:链式列表。内部采用双向链表结构来存储元素。
a) 适合于:需要频繁增删元素的情况下。但不要使用根据索引来获取元素。
b) 示例:
7. Map接口:描述了存储“键/值”对的一个映射。
1) 常用方法:
a) V put(K key, V value);
b) V get(Object key);
c) V remove(Object key);
d) int size();
2) Map接口提供三种collection视图:
a) Set<K> keySet(); 键集
b) Collection<V> values(); 值集
c) Set<Map.Entry<K,V>> entrySet(); 键-值映射关系集(在Set集中存放的是Entry对象,Entry对象用属性保存键和值)
3) 没有提供直接的迭代器。
4) Map中元素的遍历方式:
Map<String,Object> map = ...
for(String key : map.keySet()){ //常用方式
Object value = map.get(key);
}
for(Entry<String, Object> entry : map.entrySet()){
String key = entry.getKey();
Object obj = entry.getValue();
}
8. Map实现类
★1) HashMap:哈希映射(散列映射)。内部采用散列表来存储键/值对的键。
a) 作为映射对的键对应的类要重写equals和hashCode方法,以实现键相等规则。
b) 因为键是用散列表存放的,所以键/值对在Map中的存放是无序的。
c) 适合于:需要以键/值对形式存放元素时。它的存取效率很高。它是使用频率最高的一个集合类。
2) LinkedHashMap:内部采用哈希表和双向链表来存储,键/值对的存放有序。
9. 排序集合:元素存放到该类集合中时,自动完成自然排序。
1) Comparable接口和Comparator接口
a) 可排序的类必须实现java.lang.Comparable接口,在compareTo方法中定义比较规则。
int compareTo(T t); 如果当前对象小于指定对象,返回负整数;大于,返回正整数。等于,返回0。
b) 为了便于使用各种排序规则的要求,可以通过实现Comparator<T>接口来定义比较器类。
int compare(T t1, T t2); 如果t1对象小于t2对象,返回负整数;大于,返回正整数。等于,返回0。
2) TreeSet:树集。内部使用红黑树来存储排序的元素。
a) 一种方式,存入的对象对应的类实现了Comparable接口。
b) 另一种方式,把一个比较器的对象传入该类的构造器来创建指定比较器的树集对象。
3) TreeMap:树结构映射。内部使用红黑树来存储排序的键。
a) 一种方式,存入的键对应的类实现了Comparable接口。
b) 另一种方式,把一个针对键的比较器对象传入该类的构造器来创建。
10. 遗留集合:JDK1.0或1.1中就有的集合类。
1) Vector: 向量。可以认为Vector就是旧版的ArrayList。Vector是同步的,即线程安全。首选ArrayList
2) Stack:栈。具有LIFO的功能。JDK1.6中建议使用Deque。
3) Hashtable:可以认为是旧版的HashMap。Hashtable是同步的,即线程安全。HashMap是不同步的,线程不安全。
☆4) Properties:属性集。它是Hashtable的子类。线程安全的。
a) Properties可保存在流中或从流中加载。
b) 属性列表中每个键及其对应值都是一个字符串。不是泛型类。
c) 不建议使用put和get方法存放键值对。应该改用setProperty(String key, String value);和String getProperty(String key);
11. 集合工具类Collections:它针对集合提供了一些常用算法。如:排序,混排,查找,求极值等。所有的方法都是静态的。
1) public static void sort(List<T> list); 元素的自然顺序对指定列表按升序排序。
2) public static void shuffle(List<?> list); 混排。洗牌算法。
3) public static int binarySearch(List<? extends Comparable<? super T>> list,T key): 使用二分搜索法搜索指定列表,以获得指定对象。在进行此调用之前,必须根据列表元素的自然顺序对列表进行升序排序
4) public static T max(Collection<? extends T> coll): 根据元素的自然顺序,返回给定 collection 的最大元素。collection 中的所有元素都必须实现 Comparable 接口。
5) public static void reverse(List<?> list): 反转指定列表中元素的顺序。
6) 对集合类进行同步处理:
public static <T> Collection<T> synchronizedCollection(Collection<T> c):返回指定 collection 支持的同步(线程安全的)collection。
12. 并发集合类
13. 怎么选择合适的集合类-->根据实际的需求
1) 存放的数据
需要有序-List
无序-Set
“key-value”对-Map
2) 读的效率和改的效率
Array* - 读快改慢
Linked* - 改快读慢
Hash* - 介于两者之间
14. 重点掌握:HashSet、ArrayList、HashMap、Properties类的使用。都建议针对泛型编程。