本文共 4025 字,大约阅读时间需要 13 分钟。
此图只涉及基本的容器类型,有部分的容器并没有列出
方法名 | 方法返回值类型 | 方法描述 |
---|---|---|
hasNext() | boolean | hasNext()是判断目标容器是否有下一位数据,如果存在返回true反之false |
next() | E | next()可以理解为获取容器的下一位数据,其返回值类型是在Colletion的实现类实例化时确定 |
ArrayListarr = new ArrayList (); Iterator it = arr.iterator(); while(it .hasNext){ String str = it .next(); }
一般这样的方式就可以实现以Collect家族容器的遍历获取。但是这种获取无法对集合中的基本数据类型进行修改操作,想要修改数据需要对应的包装类
Collection是集合中的顶层接口,它确定了所有集合的规范。
所有它的实现类都可以使用它所定义的方法。在Collection的众多的实现类里面,存在着有序和无序的集合,可重复和不可重复的。 但是这些都是尤其子接口实现,Collection只提供普遍性的操作。Collection本身的对象是有序可重复的
方法名 | 方法返回值类型 | 方法描述 |
---|---|---|
add(E e) | boolean | 向集合中添加e元素 |
clear() | void | 把集合内部的所有的元素全部元素 |
contains(Object o) | boolean | 判断o的对象是否在集合当中 |
remove(Object o) | boolean | 移除集合中的o对象 |
size() | int | 返回集合的大小 |
toArray() | Object | 将此集合转化一个数组 |
通过Collection我们可以知道,Collection接口主要提供了一个容器的基本功能,添加、移除、清空、转换数组、返回大小、判断存在… 配合Iterabl提供的迭代遍历实现了容器的数据获取和修改。
List是Collection的有序分支,并且提供可重复元素的添加。除此之外其重写了Collection接口提供的方法,并为部分方法进行了重载,以此来展现其特性。
方法名 | 方法返回值类型 | 方法描述 |
---|---|---|
add(E e) | boolean | 向列表尾部添加e元素 |
add(int index,E e) | void | 在index位置添加e元素,原index位置元素向后移 |
get(int index) | E | 获取到index位置的元素 |
remove(int index) | E | 移除index位置的元素 |
remove(Object o) | boolean | 移除o元素 |
set(int index,E e) | E | 在index位置的元素替换为e |
在list的常见的方法中,存在几个重载的方法,而这几个新的方法都存在一个特性就是参数列表存在一个索引值。而这个索引值便是List家族的重要的标志(有序,有索引),也是因为这个索引List系列的容器可以支持指定位置的数据改变和for循环索引遍历。
List不支持在使用迭代器遍历时对容器的长度进行修改,进行修改该会报出并发修改异常
ArrayList集合其内部的存储结构是数组结构。由于数组结构对于数据的遍历和查询快,但是对容器内部数据的增删就慢。
因为ArrayList的实际本质是一个Object[]的数组,所以当向ArrayList添加的数据超过了Object[]的大小,就会进行数组的复制进行伸长,但是程序复制数据组的过程是非常消耗资源的,所以Arraylist的增删慢
LinkedList集合数据存储的结构是链表结构,类似于自行车的链条。这种结构有利于数据的增加和删除,但是查找很不友好。无论是哪一个查询方式,LinkedList往往是从头遍历。这就使linkedList查询速度慢。
但是正是因为Linkedlist可以对没有节点元素进行操作,在Linkedlist里面添加了大量首尾操作,可以作为堆栈和队列等数据使用
方法名 | 方法返回值类型 | 方法描述 |
---|---|---|
addFirst(E e) | void | 向列表首部部添加e元素 |
addLast(iE e) | void | 向列表尾部添加e元素 |
getFirst() | E | 返回此列表的第一个元素 |
getLast() | E | 返回此列表的最后一个元素 |
removeLast() | E | 移除并返回此列表的最后一个元素 |
removeFirst() | E | 移除并返回此列表的第一个元素 |
pop() | E | 从此列表所表示的堆栈处弹出一个元素 |
push(E e) | void | 将元素推入此列表所表示的堆栈 |
isEmpty | boolean | 如果列表不包含元素,则返回true |
这些都是LinkedList的特有的方法
JDK中最早的可增长的数组结构,已经被更为先进ArrayList淘汰。不用深究。不同之处在于其为线程安全,运算速度慢
set使Collection的另一大派系,其主要的于List的区别是set内部不允许存储相同的对象。
set接口没有规定太多set派系的公有方法,大部分是将collection提供的方法进行了重写,用来实现不重复元素的功能。无索引
不重复
其set所有实现都有该特性
HashSet其本质上是由一个HashMap集合提供(可以查看构造器源码)。
HashSet无法保证迭代的顺序和存储的顺序相同。 HashSet保证元素唯一性的方式依赖于: Object提供的 hashCode()和equals()两个方法HashSet的存储和取出都比较快。
HashSet是一个数组链表的结合体,可以参照下图HashCode_1 | HashCode_2 | HashCode_3 | HashCode_4 | … |
---|---|---|---|---|
H1_element1 | H2_element1 | H3_element1 | H4_element1 | … |
H1_element2 | H2_element2 | H3_element2 | H4_element2 | … |
H1_element3 | H2_element3 | H3_element3 | H4_element3 | … |
H1_element4 | H2_element4 | H3_element4 | H4_element4 | … |
… | … | … | … |
对于这张表,最上面的一排存储的是一个特定的HashCode这一排的存储方式一个数组,而每一列的元素时HashCode相同的元素,这些元素的存储方式是链表。
所以对一个元素的添加,会先判断元素的HashCode是否存在,如果存在再判断该HashCode列里面的元素是否存在equals()也相同,如果都相同则无法添加,不同就加载到这一列的最后位置上。 如图:LinkedHashSet虽然继承子HashSet但是其是有序的HashSet。
因为LinkedHashSet运行着一个双重链接列表,其定义了迭代顺序其他的使用方式于HashSet完全一致。
Map的存储方式跟Collection有着很大不同,Map中的集合里面的数据是成对存在的,这就表明往Map集合里面添加数据的时候是一次添加两个数据的。因此Collection中的集合是被称为单列集合,而Map中的集合则被称双列集合。
方法名 | 方法返回值类型 | 方法描述 |
---|---|---|
get(Object key) | V | 返回key对应的value,如果不存在key则返回null |
put(K key,V value) | V | 可以理解为添加也可以认为是修改key对应的value,并返回之前的值,新健返null |
remove(Object key) | V | 移除对应的key和value |
元素无序,并且为了要保证键的唯一,要重写作为键的对象的HashCode和equals这两个方法。而它的基本使用和Set接口定义的无区别
HashMap的子类,实现了有序
HashTable的使用特点和HashMap一样,但是它是一个线程按群的集合,运算算速度慢。已被淘汰。但是它的一个子类Properties仍然再IO里面使用
HashMap允许放置null,null但是HashTable不允许null值null键
转载地址:http://zagwi.baihongyu.com/