集合(List,Set,Map)
目录
1.13- Iterator 和 ListIterator 的区别
1.1-List
List下有ArrayList,Vector,LinkedList,List是有序的可以重复的
1:ArrayList
- 底层使用的是数组,所以查询特定的元素特别快,插入删除慢,线程不安全
- 初始化容量:10
2:Vector
- 底层使用的是数组,线程安全的
- 初始化容量:10
3:LinkedList
- 底层使用的是链表,所以插入和删除特别快,查询慢
1.2-Set
无序的,不可以重复的,根据equals和hashCode判断,就是如果一个对象要 存储在set中,必须重写equals和hashCode方法
1:HashSet
- 底层是HashMap
- 向HashSet添加元素就是把元素作为键添加到底层的HashMap中
2:TreeSet
- TreeSet实现了SortedSet接口,可以根据元素自然排序,要求集合中的元素必须是可比较的(Comparator与Comparable)
- TreeSet底层是TreeMap
- 向TreeSet添加元素就是把元素作为键添加到底层的TreeMap中
1.3-Map
Map
是按key-value对的形式存储数据,Map
的key
不允许重复
1:HashMap
- 底层是数组+链表,键与值都可以为null,线程不安全
2:CurrentHashMap(jdk1.5后推出的)
3:HashTable
- 底层数组+链表,无论key还是value都不能为null,线程安全,效率低
1.4-HashMap遍历怎么遍历?
两种方式遍历:使用EntrySet
遍历;使用KeySet
遍历
1.5-HashMap使用场景
比如说读取参数,在服务之间传递一些键值对时使用。
下面内容借鉴于:https://blog.csdn.net/qq_41701956/article/details/103253168
1.6- HashMap 还是 TreeMap选择
对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。
1.7-HashMap 的实现原理
HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。
需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)
1.8-HashSet 的实现原理
-
HashSet底层由HashMap实现
-
HashSet的值存放于HashMap的key上
-
HashMap的value统一为PRESENT
1.9-实现数组和 List 之间的转换
- List转换成为数组:调用ArrayList的toArray方法。
- 数组转换成为List:调用Arrays的asList方法。
1.10-Array 和 ArrayList 的区别
-
Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
-
Array是指定大小的,而ArrayList大小是固定的。
-
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。
1.11-迭代器 Iterator
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
1.12-Iterator的使用和特点
Java中的Iterator功能比较简单,并且只能单向移动:
-
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
-
(2) 使用next()获得序列中的下一个元素。
-
(3) 使用hasNext()检查序列中是否还有元素。
-
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
1.13- Iterator 和 ListIterator 的区别
- Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
- Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
- ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。