1、引言
java 集合类是java攻城狮必备的一样技能,不管是日常的工作,还是面试,几乎是无所不在。不仅仅是java语言,别的语言C++、Python也提供类似的集合类。集合类理解的是否深入,一定程度上也体现了攻城狮的技能水准。
2、java 集合类
java中主要有三种集合类,List,Set,Map。几乎所有的集合类都是直接或间接继承于List,Set,Map。下面的一张图能大致概括java集合类的一个轮廓:
iterator 迭代器接口,Collection类的父接口。实现这个Iterable接口的对象允许使用foreach进行遍历,也就是常用设计模式之一的迭代器模式。iterator有个方法iterator(),它返回集合的迭代器,用于遍历对象。
Collection是最基本的集合接口,一个Collection是Obejcet数据类型的容器,接口定义了增删改查等操作,所有实现该接口的集合类都有该功能。此外jdk还提供一个Collections类,该类可实现批量插入、删掉等操作。
2.1、 LIst
List表示的是一个有序的、可重复的数据集合,可根据索引来访问数据。
ArrayList的底层实现是一个数组,适合查询比删除多的应用场景,线程不安全
LinkedList能对它进行队列操作,即可以根据索引来随机访问集合中的元素。但效率比较差,时间复杂度为O(N),适合删除比查询多的应用场景。同时它还实现Deque接口,即能将LinkedList当作双端队列使用。自然也可以被当作栈来使用
Vector是一个很古老的集合,在JDK1.2后,一般都是用的新的集合框架。
2.2 、Set
Set表示的是一个无序的、不可重复的数据结合,不可根据索引来访问数据。
HashSet使用对象的hashCode方法生成的对象的hashCode值来存储集合中的元素,因此具有良好的存取和查找性能。需注意的是自定义对象要重写hashCode和equals方法。
TreeSet可以确保集合元素处于排序状态,其实现原理是二叉树,需要主要的是自定义对象放进TreeSet集合的对象需实现Comparable接口。
EnumSet是一个专门为枚举类设计的集合类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式、或隐式地指定。EnumSet的集合元素也是有序的,它们以枚举值在Enum类内的定义顺序来决定集合元素的顺序
2.3 、Map
Map适合用于保存具有映射关系的数据,key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较结果总是返回false。
与HashSet集合不能保证元素的顺序一样,HashMap也不能保证key-value对的顺序。并且类似于HashSet判断两个key是否相等的标准也是: 两个key通过equals()方法比较返回true,同时两个key的hashCode值也必须相等。需要注意的是改Map是线程不安全的,与之对应的线程安全的是Hashtable,此外JDK1.5以后提供的Concurrent包下线程安全的ConcurrentHashMap。下次单独写一篇详细介绍。
LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致(注意和TreeMap对所有的key-value进行排序进行区分)
TreeMap就是一个红黑树数据结构,每个key-value对即作为红黑树的一个节点。TreeMap存储key-value对(节点)时,需要根据key对节点进行排序。TreeMap可以保证所有的 key-value对处于有序状态。
3、实例
3.1、LIst
运行结果
3.2、Set
运行结果
3.3、Map
运行结果
今天就到此结束,后续详细介绍java集合类的实现原理和容易采坑的地方。如果喜欢,欢迎大家转载。