Java容器
一、容器概述
-
为了保存不确定的数据,以及具有映射关系的数据,Java提供了集合类。集合类也被称为容器类,所有的集合类都位于
java.util包下,集合里只能保存对象的引用变量 -
Java集合可分为
Collection、Map两种体系-
Collection接口:单列数据-
List接口:有序、可重复的集合 -
Set接口:无序、不可重复的集合
-
-
Map接口:双列数据,保存具有映射关系的集合
-
-
Collection接口继承树: -
Map接口继承树:
二、Collection接口
-
Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可以用于操作Set集合,又可以操作List和Queue集合
三、Iterator接口
-
Iterator对象被称为迭代器,主要用于遍历Collection集合中的元素,不具有盛装对象的能力 -
Iterator必须依附于Collection对象,若有一个Iterator对象,则必然有一个与之关联的Collection对象 -
Collection继承了java.lang.Iterable接口,该接口有一个iterator()方法,所有实现了Cllection接口的集合类都有一个iterator()方法,用来返回一个Iterator接口的对象 -
Iterator接口里定义了四个方法:boolean hasNext()Object next()void remove()void forEachRemaining(Consumer action)
四、Set集合
- Set是无序不可重复的集合
- 无序:Set中的元素没有索引,只能遍历查找元素
- 不可重复:Set中不能存在重复的元素,具体来说,同一个Set中不能同时存在两个通过
equals()方法比较为true的方法
1.HashSet
-
HashSet使用Hash算法来存储集合中的元素,因此具有很好的存取、查找、删除性能 -
HashSet具有以下特点:- 不能保证元素的排列顺序
- 不是线程安全的
- 集合元素可以是
null
-
HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置- 若两个对象通过
equals()方法比较返回为true,但它们的hashCode值不相等,HashSet会将它们保存在Hash表的不同位置 - 若两个对象通过
equals()方法比较返回为false,但它们的hashCode值相等,HashSet会在Hash表的对应位置用链式结构来保存多个对象 - 如果要把某个类的对象保存到
HashSet集合中,应该重写这个类的equals()方法和hashCode()方法,且保证equals()方法返回true时,hashCode()方法返回值也相等
- 若两个对象通过
2.LinkedHashSet
-
LinkedHashSet是HashSet的子类,也是根据元素的hashCode值来决定元素的存储位置,但它同时使用双向链表维护元素的插入次序,当遍历LinkedHashSet集合里的元素时,将会按元素的添加顺序来访问集合里的元素 -
LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时将具有很好的性能
3.TreeSet
-
TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序的状态 -
TreeSet并不是根据元素的插入顺序进行排序的,而是根据元素的实际值大小来进行排序的。TreeSet支持两种排序算法,且TreeSet中只能添加同一种类型的对象- 自然排序:默认为自然排序,升序排序。集合元素必须实现
Comparable接口,当把一个对象加入到TreeSet集合中时,TreeSet调用该对象的comparaTo(Object obj)方法于容器中的其他对象比较大小,然后根据红黑树找到它的存储位置,如果相等,新对象将无法添加到TreeSet集合中 - 定制排序:在创建
TreeSet集合对象时,需要将一个Comparator对象传递给TreeSet构造器,由该Comparator对象负责元素的排序逻辑,Comparator是一个函数式接口,可以使用Lambda表达式来代替Comparator对象
- 自然排序:默认为自然排序,升序排序。集合元素必须实现
-
HashSet、LinkedHashSet采用hash算法来存储集合中的元素,而TreeSet采用红黑树来存储集合中的元素
五、List集合
- List是有序可重复的容器
- 有序:List中的元素都有索引标记,可以根据元素的索引标记访问元素,从而精确控制这些元素
- 可重复:List允许加入重复的元素,具体来说,List允许满足
e1.equals(e2)的元素重复加入容器 List判断两个元素相等的方法是通过equals()方法比较返回true- 与
Set只提供一个iterator方法不同,List还额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,提供了专门操作List的方法:boolean hasPrevious()Object previous()void add(Object o)
1.ArrayList
-
ArrayList是基于数组实现的List类,所以ArrayList封装了一个动态的、允许再分配的Object[]数组,ArrayList对象使用initialCapacity参数来设置数组的长度,当向ArrayList添加元素超出了该数组的长度时,它们的initialCapacity会自动增加,默认的数组长度为10
2.LinkedList
-
LinkedList时基于双向链表实现的List类,内部没有声明数组,而是定义了一个Node类型的first和last用于记录首末元素,同时,定义内部类Node,作为LinkedList保存数据的基本结构。Node除了保存数据,还定义了两个变量:-
prev:记录前一个元素的位置 -
next:记录下一个元素的位置
-
3.Vector
- 与
ArrayList类似,唯一的区别在于Vector是线程安全的 - 默认情况下,选择使用
ArrayList,当插入、删除操作频繁时,使用LinkedList,Vector总比ArrayList慢,应尽量避免使用
4.固定长度的List
- 操作数组的工具类
Arrays提供了asList(Object... a)方法,该方法可以把一个数组或指定个数的对象转换成一个List集合,这个List集合既不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类ArrayList的实例。 -
ArrayList是一个固定长度的List集合,程序只能遍历访问集合里的元素,不能增加、删除集合里的元素
六、Map集合
-
Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组用于保存Map里的key,另一组用于保存Map里的value,key和value都可以是任何引用类型的数据 -
Map中的key用Set来存放,不允许重复 -
key和value之间存在单向一对一的关系,即通过指定的key,总能找到唯一确定的value Map提供了一个Entry内部类来封装key-value对,而计算Entry存储时只考虑Entry封装的key。Java先实现了Map,然后通过包装一个所有value都为null的Map就实现了Set集合
1.HashMap与Hashtable
-
HashMap和Hashtable都是Map接口的实现类,它们十分类似,区别在于:-
HashMap是线程不安全的,Hashtable是线程安全的,所以HashMap比Hashtable的性能高一点,不推荐使用Hashtable -
Hashtable不允许使用null作为key和value,但HashMap允许使用null作为key和value
-
- 在
HashMap、Hashtable中,用作key的对象必须实现hashCode()和equals()方法;HashMap、Hashtable判断两个key相等的标准是两个key通过equals()方法比较相等,并且它们的hashCode()方法返回值也相等;HashMap、Hashtable判断两个value相等的标准是通过equals()方法比较返回true;HashMap、Hashtable不能保证元素的顺序 - 与
HashSet类似的是,尽量不要使用可变对象作为HashMap、Hashtable的key,如果确实需要使用可变对象,则尽量不要在程序中修改作为key的可变对象
2.LinkedHashMap
-
LinkedHashMap是HashMap的子类,LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序一致 -
LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能,但在迭代访问Map里的全部元素时将有较好的性能
3.TreeMap
-
TreeMap也是一个红黑树数据结构,每个key-value对作为红黑树的一个节点,TreeMap存储key-value对时,需要根据key对节点进行排序。TreeMap可以保证所有的key-value对处于有序状态。TreeMap也有两种排序方式- 自然排序:
TreeMap的所有key必须实现comparable接口,且所有的key应该是同一个类型的对象 - 定制排序:创建
TreeMap对象时传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序,采用定制排序时不要求Map的key实现Comparable接口
- 自然排序:
4.Properties
-
Properties是Hashtable类的子类,用于处理属性文件 - 由于属性文件里的
key、value都是字符串类型,所以Properties里的key和value都是字符串类型
七、Collections
-
Collections是一个操作Set、List、Map等集合的工具类 -
Collections中提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法