一.java中的集合
一般同学都是从c语言起步的,刚开始使用java时,会对集合这个概念比较陌生,在c语言中我们表示数据的集合往往使用数组,在编写c程序时觉得数组完全可以满足我们的基本需要。而到了java出现了集合的概念,我们应该考虑一下为什么java不也用数组去存储数据集呢,而是引出了集合的概念。
1.java集合的出现
1)java作为面向对象的编程语言,普通的数组由于单一的数据结构无法处理对象或者数据十分庞大的数据集,而且面向api,java的集合向比于普通的数组,可以集成更多的关于数据集的方法,而我们在外部只需要直到集合的概念并且会使用方法即可,既解决了数据庞大的问题,也解决了数据处理的问题。
2)在java语言的特性里面,我们会使用到对多个集合的操作。
2.java常用集合的分类
下面这张图可以给出常用的集合类与接口的继承实现关系。
其中Collection是集合类的根接口,具体的集合分类都要以Collection为根,其中以Collection接口为根集合的根本特点是单列的,也就是一次存一个对象进入。而与之相对的是Map接口,双列(K-V),一次存入一个键值对。Map的一个继承实现关系如下:
3.Collection下常用的集合
3.1List集合
List集合的主要特点是取出与存入是有序的,并且元素可以重复,这些从底层实现的数据结构就能看出。
3.1.1 ArrayList
1)底层维护Object数组,可自动扩容,查找快,但是插入较慢
2)线程不安全,效率较高
3.1.2 LinkedList
1)底层维护双向链表,查找慢,但是插入快
2)线程不安全,效率较高
3.1.3 Vector
1)底层维护Object数组,可自动扩容,查找速度快,但是插入较慢
2)线程安全,效率较低
3.2 Set集合
Set与List最大不同就是Set取出与存入是无序的,并且元素不可重复,这都是由于HashMap的缘故,学过数据结构的同学应该清楚,以hash实现的存储结构无法做到取出与存入的顺序记录,同时Hash的特点也要求其不可重复。
3.2.1HashSet
1)底层使用HashMap,查看源码可以得知,这里只使用HashMap的Key进行类似单列的存储,而把Value设为null。
3.2.2 TreeSet
1)与HashSet一样TreeSet也使用了TreeMap
2)这里与HashSet的不同就是TreeSet提供排序的方法可以进行排序操作。
4.Map下常用的集合
4.1HashMap
1)底层维护哈希表+链表+红黑树,可以说HashMap是整个集合中最为复杂的集合,简单来说就是当HashMap元素较少是就是哈希表+链表,当元素比较多时,转换成哈希表+红黑树的存储结构。这里同学们可以结合源码慢慢分析。
2)HashMap线程不安全,效率较高
3)有一个子类LindedHashMap在链表中加入特殊指向保存存入元素的顺序
4.2HashTable
1)HashTable底层与HashMap类似
2)HashTable是线程安全的
3)有一个子类Properties用于读取配置文件
4.3TreeMap
1)底层维护的是黑红树,由于特殊的数据结构使得TreeMap再传入特定的比较器的条件下,可以实现按所需的顺序存储数据
2)线程不安全
5.集合的遍历
5.1Collection
对于Collection集合的遍历可以使用迭代器或者增强for循环,这里相对简答,不做过说说明
5.2Map
Map的遍历主要有两种方法,一种是取出Key集合然后遍历找出对应的Value,或者可以直接取出Value的集合。
二.java中集合的选择
首先判断存储的数据的类型是什么?(单列还是双列)
单列:Collection接口
判断允许重复么?
允许重复:List接口
增删多:LinkedList
改查多:ArrayList
不允许重复:Set接口
无序:HashSet
需要排序:TreeSet
双列:Map接口
键无序:HashMap
键需要排序:TreeMap
键值插入与取出顺序一致:LinkedHashMap
读取配置文件:Properties