Java集合框架
2021-10-29 15:25:44 0 举报
AI智能生成
加油
作者其他创作
大纲/内容
Collection接口
List接口
ArrayList(替代老Vector)
说说ArrayList的优缺点?
优点
查询修改速度快,基于动态数组,直接找下标
缺点
线程不安全
插入删除慢,需要移动后面所有元素,可能扩容复制数组
Array和ArrayList有何区别?
定义一个 Array 数组时,必须指定数组固定的数据类型及数组长度
ArrayList 是动态数组,长度可变,自动扩容。不使用泛型的时,可以添加不同类型元素。
常用方法
add、remove、get、set、size
扩容机制
扩容1.5倍,扩容带来新数组的重新拷贝
LinkedList
ArrayList 和 LinkedList 的区别是什么?
优点
插入删除快,基于双向链表,只需要修改节点指针
缺点
线程不安全
查询修改慢,要遍历所有指针
每一个元素都需要消耗存储指针节点对象的空间。
使用场景
生产者链表尾部添加消息
addLast();
消费者链表头部取出消息
removeFirst();
Vector
ArrayList 和 Vector 的区别是什么?
线程安全
加Synchronized锁,性能比ArrayList 低
扩容2倍
如何实现数组和List之间的转换?
数组转 List :Arrays 工具类的 asList 方法
List 转数组:使用 List 的 toArray 方法。传入初始化长度的数组对象
List里如何剔除相同的对象?
把List放到新的HashSet集合,因为它是不可重复的
Set接口
HashSet与HashMap的区别?
HashSet
实现Set接口
仅存储对象
调用add()方法就是调用HashMap的put()
对于 HashSet 中保存的对象,请注意正确重写其 equals 和 hashCode 方法,以保证放入对象的唯一性。
HashMap
实现Map接口
存储键值对
基于数组+链表+Hash算法+红黑树;key/value可为null;key唯一;不支持排序
调用put()向map中添加元素
LinkedHashSet
可按照添加顺序遍历
HashSet基础上加了一对指针,指向前一个和后一个元素
频繁遍历操作,效率高于HashSet
TreeSet
基于TreeMap实现;有序不可重复
添加、删除元素、判断元素是否存在,效率高,时间复杂度为0(log(N))
List 和 Set 的区别?
都继承Collection接口
List
存储特点:存储有序、可重复数据、可存多个null值
和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,会引起其他元素位置改变
Set
存储特点:存储无序、不可重复的数据、只可以存一个null值
检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
Queue
BlockingQueue
Deque
Map接口
特点
键值对映射集合,一个键值对构成一个Entry对象
key无序,不重复,使用Set存储
key所在的类要重写equals()和hashCode()
value无序,可重复,使用Collection存储
value所在的类要重写equals()
常用实现类有哪些?
Hashtable
数组+链表实现,链表解决哈希冲突;key/value不可为null
线程安全,效率低
HashTable是直接在操作方法上加synchronized关键字,锁住整个数组,粒度比较大;
Properties继承Hashtable
常用来处理配置文件,key/value都是String类型
HashMap
基于数组+链表+Hash算法+红黑树;key/value可为null;
线程不安全,效率高
常用方法
put、remove、put、get、size
遍历
foreach
iter快捷
底层实现原理
基于Hash算法实现,通过put(key,value)存储,get(key)获取value
根据key计算出 hash 值,根据 hash 值将 value 保存在 Node 对象里,Node 对象保存在数组里
hash 值相同时,称为 hash 冲突,HashMap 的解决办法是用链表和红黑树存储相同 hash 值的 value
当 hash 冲突的个数:小于等于 8 使用链表;大于 8 且 tab length 大于等于 64 时,使用红黑树解决链表查询慢的问题
为什么基本类型不能做为HashMap的键值?
Java中泛型约束key/value必须是对象Object类型的
map.put(0, "hello")中编译器已将 key 值 0 进行了自动装箱,变为了 Integer 类型
LinkedHashMap
继承HashMap,实现Map接口
内部提供了Entry
保证可以按照添加顺序实现遍历map元素
在HashMap基础上,加了一堆指针,指向前一个和后一个元素
频繁遍历,效率高于HashMap
TreeMap
按照Key的自然顺序或者Comprator的顺序进行排序,内部是通过红黑树来实现。
key所属的类实现Comparable接口
自定义一个实现了Comparator接口的比较器,传给TreeMap用于key的比较。
IdentityHashMap
ConcurrentHashMap解决了什么问题?
兼顾线程安全和运行效率,得益于使用了分段锁
实现原理
详细见 集合.md
Map的遍历方式?
- Map 的 keySet() 方法,拿到所有 key 的 Set,再遍历所有key找值(不推荐,效率低,因为多了一步)
- Map 的 values() 方法,拿到所有value的 Collection
- 迭代器遍历,键值对集合
- for 循环遍历,键值对集合
面试题
Java中已经有数组类型,为什么还要提供集合?
集合弥补了数组缺点:
无法获取实际元素个数
长度固定(初始化时);类型固定
数组是有序可重复,无法满足无序不重复需求
方法有限,集合是面向对象,实现各种复杂操作,大大提高开发效率
哪些集合类是线程安全的?
- Vector
- Stack
- Hashtable
- java.util.concurrent 包下所有的集合类ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque...
迭代器Iterator是什么?
- 迭代器模式是 Java 中常用的设计模式之一
- Iterator 可以遍历集合的对象,为各种集合提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
- 缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。
Iterator怎么使用?有什么特点?
集合.iterator() 方法返回一个 Iterator 对象
next() 方法获得集合中的下一个元素
hasNext() 检查集合中是否还有元素
remove() 方法将迭代器新返回的元素删除
forEachRemaining(Consumer<? super E> action) 方法,遍历所有元素
Iterator和 ListIterator有什么区别?
- ListIterator 继承 Iterator
- ListIterator 比 Iterator多方法
1) add(E e) 将指定的元素插入列表,插入位置为迭代器当前位置之前
2) set(E e) 迭代器返回的最后一个元素替换参数e
3) hasPrevious() 迭代器当前位置,反向遍历集合是否含有元素
4) previous() 迭代器当前位置,反向遍历集合,下一个元素
5) previousIndex() 迭代器当前位置,反向遍历集合,返回下一个元素的下标
6) nextIndex() 迭代器当前位置,返回下一个元素的下标
- 使用范围不同,Iterator可以迭代所有集合;ListIterator 只能用于List及其子类
- ListIterator 有 add 方法,可以向 List 中添加对象;Iterator 不能
- ListIterator 有 hasPrevious() 和 previous() 方法,可以实现逆向遍历;Iterator不可以
- ListIterator 有 nextIndex() 和previousIndex() 方法,可定位当前索引的位置;Iterator不可以
- ListIterator 有 set()方法,可以实现对 List 的修改;Iterator 仅能遍历,不能修改
怎么确保一个集合不能被修改?
Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。
Collections工具类
作用:操作Collection和Map的工具类
常用方法
reverse(List):反转 List 中元素的顺序
shuffle(List):对 List 集合元素进行随机排序
sort(List):根据元素的自然顺序对指定 List 集合元素升序排序
sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
使用Collections的方法修饰
synchronizedList
使用Collections集合工具的内部类
装饰器模式
通过传入Map封装出一个SynchronizedMap对象,内部定义了一个对象锁,方法内通过对象锁实现;
synchronizedMap
Collection和Collections的区别?
Collection是集合接口,包含了很多集合类的基本方法
Collections是集合框架的工具类,包含类很多静态方法,是一个包装类
0 条评论
下一页