addAll()合并列表
要获取 List 中指定元素的索引,可使用indexOf()
方法,如果元素不存在返回-1。
简述 ArrayList 和 LinkedList 的底层数据结构以及它们在不同操作下的性能差异。
ArrayList底层是动态数组,插入删除移动数组元素效率慢,随机访问效率高
LinkedList底层是双向链表,插入删除快,随机访问需从头遍历频繁访问慢
说明在多线程环境下使用 List 可能遇到的问题以及常见的解决方法。
如果一个线程正在遍历 List,而另一个线程修改了 List(如添加或删除元素),则可能会抛出 ConcurrentModificationException。
解决方法:可以使用 CopyOnWriteArrayList(适用于读多写少的情况),或者使用 synchronized 关键字保证线程安全,或者使用 Iterator 的 remove() 方法来避免并发修改的问题。
entrySet()
返回这个map中键值对表示的set集合。可以理解成将一个map转化成一个set。set中的每一个元素都是Entry数据类型,这个数据类型其实就是一组键值对,有两个属性,分别是键和值,来存放键值对
迭代器Iterator为实现集合遍历,该接口有三个方法
分别是hasNext() next()__、remove()。
hasNext():判断是否有下一个元素。
next():返回下一个元素。
remove():移除迭代器的最后一个元素。
Vector
线程安全:Vector 是一个 线程安全 的集合类。
数据结构:Vector 使用的是动态数组结构,而不是哈希表。
ArrayList
非线程安全:ArrayList 是一个 非线程安全 的集合类。
数据结构:ArrayList 使用的是动态数组结构,而不是哈希表。
HashMap
非线程安全:HashMap 是一个 非线程安全 的集合类。它
数据结构:HashMap 使用的是 哈希表 作为底层数据结构,它通过哈希函数来将键映射到桶中,从而实现快速的键值查找。
Hashtable
线程安全:Hashtable 是一个 线程安全 的集合类,
数据结构:Hashtable 使用的也是 哈希表 作为底层数据结构,
LinkedHashMap
是一种有序的HashMap,查询速度快,便于添加删除操作
集合与数组
数组固定大小,集合动态扩展;数组可存基本类型,集合存对象;集合提供丰富操作方法。
List、Set、Collection、Map
List有序可重复,Set无序唯一,Collection是根接口,Map键值对独立体系。
ArrayList vs LinkedList
ArrayList数组实现,随机访问快;LinkedList链表实现,增删快。
HashSet原理
哈希表通过hashCode()计算桶位置,equals()解决冲突,保证元素唯一性。
HashMap vs Hashtable
HashMap线程不安全,允许null键值;Hashtable线程安全,不允许null。
泛型示例
List<String> list = new ArrayList<>();
Set<Integer> set = new HashSet<>();
Map<String, Object> map = new HashMap<>();
泛型优点
类型安全,避免强制转换,代码复用。
哈希码
每个对象有哈希码,默认根据内存地址生成,可能重复(哈希碰撞)。