java集合框架
更新日期:
集合初识
集合类的由来:
对象用于封装特有的数据, 对象多了需要存储, 如果对象不确定. 存储就使用集合容器进行
集合特点:
- 用于存储对象的容器
- 集合长度是可变的
- 集合不可存储基本数据类型
集合体系的共同父类 java.util.Collection
1 2 3 4 5 6 7 8 9 10 | boolean add(E e); boolean contains(Object o); void clear() boolean containsAll(Collection<?> c); boolean remove(Object o); boolean removeAll(Collection<?> c); int size(); Iterator<E> iterator(); // 迭代器 boolean retainAll(Collection coll); // 取交集 Object[] toArray(); // 集合转数组 |
Iterator
Iterator 对象必须依赖于具体容器, 因为每一个容器的数据结构都不同. 所以该迭代器对象在容器中进行内部实现的. Iterator用法
1 2 3 | for(iterator it = coll.iterator(); it.hasNext();){ it.next(); } |
Collection 的继承结构图
List 和 Set
List 和 Set 都从 Collection 继承
List: 有序,元素有索引, 元素可以重复
Set: 元素不能重复, 无序
java.util.List
1 2 3 4 5 6 7 8 9 10 | void add(index, element); void add(index, collection); Object remove(index); Object set(index, element); Object get(index); int indexOf(object); int lastIndexOf(object); List subList(from, to); |
Iterator 接口在迭代过程中不能执行添加操作, 可以使用Iterator的子接口ListIterator进行操作.
1 2 3 4 | ListIterator it = list.listIterator(); it.add("xx"); it.previous(); it.hasPrevious();//允许逆向便利 |
Vector
内部是是数组数据结构, 是线程安全的, 长度可变, 增删查询都慢
ArrayList
内部是是数组数据结构, 是线程不同步的, 长度可变, 查询速度快
LinkedList
内部是链表, 是不同步的, 增删元素的速度快
Set
Set接口中的方法和 Collection 接口的方法一致
HashSet
内部数据结构是哈希表, 是不同步的
使用元素的hashCode方法来确定位置, 如果位置相同,
在通过元素的equals来确定是否相同.
所以在使用一个新类时要重写类的方法 hashCode()
和 equals()
LinkedHashSet
有序的HashSet
TreeSet
可以对Set集合中的元素进行排序(从小到大), 是不同步的.
存储在里面的元素必须实现 java.lang.Comparable
接口,
他根本不看哈希码, 他判断元素的唯一性, 是看比较结果
1 2 3 4 5 6 7 8 | import java.util.Comparator; public class ComparatorByName implements Comparator { @Override public int compare(Object obj1, Object obj2){ return 0; } } ThreeSet ts = new TreeSet(new ComparatorByName()); |
Map
Map: 一次添加一对元素. Collection 一次添加一个元素. Map集合中存储的是键值对, 必须保证键的唯一性.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void clear(); V put(K key, V value); //返回前一个和key关联的值, 如果没为null V remove(K key); // 删除键值对, 返回值 boolean containsKey(key); boolean containsValue(value); boolean isEmpty(); value get(key); // 如果没有则返回null int size(); Set keySet(); Set<Map.Entry> entrySet(); Collection<V> values(); |
Hashtable
内部结构是哈希表, 是同步的, 不支持空键和空值.
Properties: 用来存储键值对型的配置文件信息, 可以和IO技术结合
HashMap
内部结构是哈希表, 不是同步的. 允许空值和空键.
TreeMap
内部是二叉树, 不是同步的. 可以对Map中的键进行排序.
LinkedHashMap
有序的存储Map中的键
集合框架工具
Collections
是集合框架的工具类, 里面的方法都是静态的.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | Collections.sort(list, comparator); //对list集合进行指定顺序的排序 Collections.sort(list); //对list集合进行指定顺序的排序 Collections.swap(list); //对list位置进行交换 Collections.binarySearch(list, comparator); // 二分法查找, 必须先排序 Collections.max(set); Collections.min(set); Collections.reverseOrder(); // 对排序进行逆转 new TreeSet<Sring>(Collections.reverseOrder()); Collections.replaceAll(list, old, new); Collections.reverse(list); Collections.fill(list, obj); // 替换成所有同一个元素 Collections.shuffle(list, obj); // 乱序排序 Collections.list(enumeration); // 转成Arraylist Collections.synchronizedCollection(Collection|Set|Map); //返回一个同步的集合 |
Arrays
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | binarySearch(); copyOf(); copyOfRange(); fill(); equals(); // 比较两个数组 sort(); deepEquals(); toString(array); /** 如果数组中的元素是对象, 那么转成集合时, 直接将数组中的元素作为集合中的元素进行集合存储 ** 如果数组中的元素是基本类型, 那么会将该数组作为集合中的元素进行存储 **/ asList(array); // 将一个数组转换成固定长度的List int [] a = {1,3,4} List<int[]> x = Arrays.asList(a) |
集合变数组
1 2 3 4 5 6 7 | // 集合变成数组, 不能进行增删 List<String> list = new ArrayList<String>() list.add("1") list.add("2") list.add("3") String[] arr = list.toArray(new String[4]) // [1,2,3,null] |
静态导入
1 2 3 4 5 | import static java.util.Collections.*; // 导入类中的静态成员 impport static java.lang.System.*; out.println("hello world"); |