Java的集合体系结构
由于基本数据类型使用不方便,因此,常用的数据结构Java已经为我们封装好了对应的容器,放在java.util包下,主要分为两部分,一部分是Collection接口下的类,一部分是Map接口下的类。
Collection体系
Collection接口是Collection体系的顶级接口,其结构关系如下所示:
需要注意的是,其实Collection接口还实现了Iterable接口,也就是说Collection接口下的所有子类都可以通过迭代器进行遍历。
Collection接口下包含Set、Queue、List三大接口,分别对应集合、队列、列表,他们各自的特点以及我们常用的子类如下所示:
我们最常用的是ArrayList和HashSet,ArrayList本质是一个可变的Object数组,支持自动扩容等。HashSet是一个不可重复的集合,底层存储的其实是一个value为null的HashMap。
以上集合,只有Vector是线程安全的,其余均非线程安全的。Vector是通过在所有方法上加synchronize锁来保证安全性。
Map体系
Map是Java提供给我们的映射类型,主要结构如下所示:
我们常用的Map有HashMap和TreeMap
- HashMap的key不可重复,可为null,线程不安全
- TreeMap的key不可重复,不可为null,TreeMap实现了SortedMap接口,而SortedMap接口里定义了Comparator接口,泛型是Key的超类,因此可以实现根据Key的值进行排序。线程不安全
需要注意的是,除了这些之外,我们常用的容器还有一个线程安全的ConcurrentHashMap,只是它并没有被放在我们java.util包下,而是放在了JDK1.5提供的Java并发包JUC(java.util.current)包下
工具类
Java除了提供给我们这些容器之外,还提供了一些工具类给我们使用,比如collections、Arrays、Objects。他们也都在java.util包下。
Collections
Collections是针对集合类(Collection)的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
sort(List<T> list);
// 对集合进行排序, 底层通过转换为数组进行排序, Arrays.sort通过ComparableTimSort.sort排序:需要实现Comparable接口。
shuffle(List<?> list, Random rnd);
// 对集合进行随机排列。
reverse(List<?> list);
// 反转集合中元素的顺序
binarySearch(List<? extends Comparable<? super T>> list, T key);
// 通过二分检索查找指定集合中的元素, 返回索引位置
max(Collection<? extends T> coll, Comparator<? super T> comp);
// 通过Comparator接口实现进行比较(大于0, 等于0 , 小于0), 获得最大值
min(Collection<? extends T> coll, Comparator<? super T> comp);
// 通过Comparator接口实现进行比较(大于0, 等于0 , 小于0), 获得最小值
max(Collection<? extends T> coll);
// 通过自然数进行比较, 获得最大值
min(Collection<? extends T> coll);
// 通过自然数进行比较, 获得最小值
indexOfSubList(List<?> source, List<?> target);
// 查找subList中首次出现位置的索引
lastIndexOfSubList(List<?> source, List<?> target);
// 查找subList中最后出现的位置的索引
replaceAll(List<T> list, T oldVal, T newVal);
// 替换集合中的某个元素, 如果该元素存在返回true
rotate(List<T> list, int distance);
// 集合中的元素后移distance个位置, 后面遮盖住的位置移动到前面; 底层数量大于100个通过3次reverse实现, 通过排序算法实现
copy(List<? super T> dest, List<? extends T> src);
// 将src中的元素全部复制到dest中, 并且覆盖索引;(src的存储大小必须小于dest)
swap(List<?> list, int i, int j);
// 交换集合中指定索引位置的元素
fill(List<? super T> list, T obj);
// obj替换集合中所有的元素
nCopies(int n, T o);
// 返回大小为n的List集合, 其中所有的元素内容指向o
enumeration(final Collection<T> c);
// 根据集合生成一个旧版枚举
list(Enumeration<T> e);
// 旧版枚举生成ArrayList
synchronizedCollection(Collection<T> c)
//将容器转为线程安全的,底层通过加synchronize锁实现
Arrays
Arrays工具类包含操作数组(如搜索和排序等)的各种方法。其中此类还包含一个允许将数组作为列表来查看的静态工厂。
Arrays和Collections的方法大致相同,只是Collections面向封装好的容器,而Arrays面向基本数据类型,数组等。
常用的相关方法
public static String toString(int[] a);把数组转化成为一个字符串。
public static void sort(int[] a):对数组进行排序
public static int binarySearch(int[] a,int key):二分法查找(注意:二分法查找是针对排序好的数组才可以使用)