网站首页 > java教程 正文
Arraylist 与 LinkedList 区别?
底层数据结构: Arraylist 底层使?的是 Object 数组; LinkedList 底层使?的是双向链表数据结构(JDK1.6 之前为循环链表,JDK1.7 取消了循环。)
是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,不保证线程安全;
插?和删除是否受元素位置的影响:
① ArrayList 采?数组存储,所以插?和删除元素的时间复杂度受元素位置的影响。 执? add(E e) ?法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是 O(1),但是可能会产生扩容。但是如果要在指定位置 i插?和删除元素的话时间复杂度就为 O(n-i)。因为在进?上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执?向后位/向前移?位的操作。
②LinkedList 采?链表存储,所以对于 add(E e) ?法的插?,删除元素时间复杂度不受元素位置的影响,近似 O(1),如果是要在指定位置 i 插?和删除元素的话时间复杂度近似为 O(n) 因为需要先移动到指定位置再插?。
随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
内存空间占?:LinkedList 的每一个节点要比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储了前后引用。而 ArrayList 的空间浪费主要体现在在 list 列表的结尾会预留?定的容量空间。
在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。
ArrayList的扩容机制:
以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。 之后在进行扩容时,每次扩容为原来的 1.5 倍。
多线程场景下如何使用 ArrayList?
ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用。例如像下面这样:
List<String> synchronizedList = Collections.synchronizedList(list);
synchronizedList.add("aaa");
synchronizedList.add("bbb");
for (int i = 0; i < synchronizedList.size(); i++) {
System.out.println(synchronizedList.get(i)); }
也可以使用线程安全的CopyOnWriteArrayList,其底层也是对增删改方法进行加锁:final ReentrantLock lock = this.lock;
HashMap 和 Hashtable 有什么区别?
线程是否安全:HashMap是线程不安全的,HashTable是线程安全的(内部的?法基本都经过 synchronized 修饰);
效率: 因为线程安全的问题, HashMap 要? HashTable 效率??点
是否支持键值为null:HashMap中允许键和值为null,但是null作为键只能有一个,HashTable不支持;
扩容机制:HashMap的默认容器是16,为2倍扩容,HashTable默认是11,为2倍+1扩容;
底层数据结构: JDK1.8 以后的 HashMap 当链表?度?于阈值(默认为 8)(将链表转换成红?树前会判断,如果当前数组的?度?于 64,那么会选择先进?数组扩容,?不是转换为红?树)时,将链表转化为红?树,以减少搜索时间。Hashtable 没有这样的机制。
猜你喜欢
- 2024-12-01 Java面试问题(二)—— java 集合
- 2024-12-01 2021年Java集合面试Top问题 - 第二部分
- 2024-12-01 面试终结之史上最全的Java&Android面试题搜集整理
- 2024-12-01 10 道关于 Java 泛型的面试题
- 2024-12-01 每天分享几道Java面试题(Java集合之1)
- 2024-12-01 这是我见过最有用的Java面试题,面试了无数公司总结的(含答案)
- 2024-12-01 《面试知识,工作可待:集合篇》-java集合面试知识点大全
- 2024-12-01 面试必备技能!关于Java集合框架面试题+答案
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)