List接口: arrayList: 底层实现基于动态数组,随机的访问查询比较快,插入,删除,修改比较慢,线程不安全。
LinkedList 底层实现基于链表,所以查询码,修改,删除插入快,线程不安全。
Vector :也是基于数组实现的,和arrayList的区别是线程安全,效率低。
Set: 不可重复
* HashSet: 使用哈希算法去重复, 效率高
LinkedHashSet: HashSet的子类, 去重复并且保留存储顺序
* TreeSet: 可以用指定的比较方法进行排序
Map: 键值对, 每次存一个键值对
* HashMap: 使用哈希算法对键去重复, 效率高
LinkedHashMap: HashMap的子类, 去重复并且保留存储顺序
Hashtable: 算法和HashMap相同, 不允许null键和null值, 线程安全, 效率低
Properties: Hashtable的子类, 通常用来操作.properties配置文件
* TreeMap: 可以用指定的比较方法对键进行排序
4.HashMap 在存储键值对的时候, 使用哈希算法对键对象去重复, 效率高, 没有顺序.
当存储一个键值对的时候, 先调用键对象的hashCode()方法计算一个哈希值, 在集合中查找是否有哈希值相同键对象.
如果没有哈希值相同的键对象, 直接将键值对存入.
如果有哈希值相同键对象, 则和哈希值相同的键对象进行equals()比较.
比较结果为false就存入键值对.
比较结果为true则用新的值覆盖旧的值.
5.TreeMap 在存储键值对的时候, 通过指定的比较算法, 对键对象进行排序, 以二叉树形式进行存储.
创建TreeMap时如果没有传入比较器, 则会按照键对象的自然顺序来排序. 自然顺序就是实现了Comparable接口之后compareTo方法中定义的顺序.
如果我们不希望使用自然顺序排序, 还在TreeMap的构造函数中可以传入一个比较器. 比较器就是实现了Comparator接口的对象, 按照其中compare方法排序.
6.LinkedHashMap HashMap的子类, 实现原理和HashMap相同, 但是可以保留存储顺序.
7.Hashtable Hashtable和HashMap原理相同, 都是基于哈希算法的, Hashtable是线程安全的, 而且Hashtable不允许存储空的键和空的值.
8.Properties Hashtable的子类, 通常用来操作配置文件.
使用setProperty(String, String)方法来设置一个配置项
使用getProperty(String)来获取一个配置项的值
使用propertyNames()方法获取所有Key对象的Enumeration
使用load(InputStream)来加载数据
使用list(PrintStream)来写出数据
三.知识 1.集合分类 Collection: 单列集合, 每次存一个对象
List: 可重复, 有存储顺序, 可以根据索引控制
* ArrayList: 数组实现, 查找快
* LinkedList: 链表实现, 增删快
Vector: 和ArrayList原理相同, 线程安全, 效率低
Set: 不可重复
* HashSet: 使用哈希算法去重复, 效率高
LinkedHashSet: HashSet的子类, 去重复并且保留存储顺序
* TreeSet: 可以用指定的比较方法进行排序
Map: 键值对, 每次存一个键值对
* HashMap: 使用哈希算法对键去重复, 效率高
LinkedHashMap: HashMap的子类, 去重复并且保留存储顺序
Hashtable: 算法和HashMap相同, 不允许null键和null值, 线程安全, 效率低
Properties: Hashtable的子类, 通常用来操作.properties配置文件
* TreeMap: 可以用指定的比较方法对键进行排序
2.集合迭代 Collection:
2种通用的方式:
使用iterator()方法获取Iterator, 使用hasNext()和next()方法进行迭代
使用增强for循环, 其内部也是使用的Iterator
List可以使用普通for循环, 调用get(int)方法根据指定索引获取
Vector可以使用Enumeration进行迭代
Map:
通过keySet()方法得到所有Key对象组成的Set, 迭代Set得到每一个Key, 然后再通过Key获取Value
通过entrySet()方法得到所有Entry对象组成的Set, 迭代Set得到每一个Entry, 然后再调用getKey()和getValue()
四.常用工具类 1.Arrays: 对数组操作 List<T> asList(T... a) 将数组或者若干相同类型的对象转为一个List
int binarySearch(int[] a, int key) 二分法查找, 在一个有序且不重复的数组中查找某个元素的位置
int[] copyOfRange(int[] original, int from, int to) 将指定数组中的一部分拷贝到一个新的数组中
boolean equals(int[] a, int[] a2) 比较两个数组中元素是否完全相同
void fill(int[] a, int val) 用指定值替换数组中所有元素
void sort(int[] a) 对指定数组进行排序
String toString(int[] a) 将数组转为字符串表达形式
2.Collections: 对集合操作 boolean addAll(Collection<? super T> c, T... elements) 将多个同类型的元素一次性添加到Collection中
int binarySearch(List<T> list, T key) 在List中查找指定元素出现的位置
void copy(List<? super T> dest, List<? extends T> src) 用src中的元素替换dest中的元素
boolean disjoint(Collection<?> c1, Collection<?> c2) 判断是否没有相同元素
void fill(List<? super T> list, T obj) 用指定元素替换集合中所有元素
int frequency(Collection<?> c, Object o) 统计指定元素在集合中出现的次数
T max(Collection<? extends T> coll) 找到集合中最大的元素
T min(Collection<? extends T> coll) 找到集合中最小的元素
boolean replaceAll(List<T> list, T oldVal, T newVal) 用一个指定元素替换List中另一个指定元素
void reverse(List<?> list) 反转集合中所有元素
void sort(List<T> list) 对List进行排序
void swap(List<?> list, int i, int j) 交换集合中的两个元素
Enumeration<T> enumeration(Collection<T> c) 从Collection中获取Enumeration
ArrayList<T> list(Enumeration<T> e) 通过Enumeration得到ArrayList
(1)HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为null,不允许多条记录的值为null。HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要同步,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力。
l (2)Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢。
l (3)LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢。有HashMap的全部特性。
l (4)TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iteraor遍历TreeMap时,得到的记录是排过序的。TreeMap的键和值都不能为空。