关于Java集合最被关注的10 个问题
2023-09-14 09:03:13 时间
ArrayList:内部实现是个数组,其中的元素可以通过index获取。但是,如果一个数组满了的话,我们就必须重新分配一个更大的数组然后把所有元素移动到这个新数组,其时间复杂度为O(n)。添加或删除一个元素时也需要移动数组中的其它元素。这就是ArrayList的缺点。
LinkedList:是一个双向链表。因此如果我们要获取中间元素的话,我们就需要从头开始遍历;另一方面,添加或删除一个元素就变得很简单,因为只需要对这个链表本身操作即可。
总的来说,最坏的情况下两者时间复杂度的对比如下:
LinkList:每个节点还需要额外的两个指针,分别指向前一个节点和下一个节点 ArrayList:只需要一个数组 更多比较信息...
2.最有效移除集合元素的方式 唯一正确的移除集合元素的方式就是使用Iterator.remove()方法:
Java集合的常见面试题(全) 这里写目录标题前言常用的集合类有哪些集合底层数据结构ArrayList 和 LinkedList 的区别HashSet 如何检查重复HashSet与HashMap的区别HashMap 和 Hashtable 的区别HashMap 的底层实现HashMap 的长度为什么是 2 的幂次方ConcurrentHashMap 和 Hashtable 的区别Array 和 ArrayList 的区别Collection 和 Collections的区别 关于java集合的一些知识点可看我之前的文章进行预习
List,Set,Map三者的区别?List、Set、Map 是否继承自 Collection 接口?List、Map、Set 三个接口存取元素时,各有什么特点? 集合框架底层数据结构 Java集合的快速失败机制 “fail-fast”? 怎么确保一个集合不能被修改? Collection接口 ==List接口===迭代器 Iterator 是什么? Iterator 和 Lis
List,Set,Map三者的区别?List、Set、Map 是否继承自 Collection 接口?List、Map、Set 三个接口存取元素时,各有什么特点? 集合框架底层数据结构 Java集合的快速失败机制 “fail-fast”? 怎么确保一个集合不能被修改? Collection接口 ==List接口===迭代器 Iterator 是什么? Iterator 和 Lis
入职大厂,齐姐精选的 9 道 Java 集合面试题 Java 集合框架其实都讲过了,有一篇讲 Collection 的,有一篇讲 HashMap 的,那没有看过的小伙伴快去补下啦,文末也都有链接;看过的小伙伴,那本文就是检测学习成果的时候啦 今天这篇文章是单纯的从面试的角度出发,以回答面试题为线索,再把整个 Java 集合框架复习一遍,希望能帮助大家拿下面试。
10 个经典的 Java 集合面试题,看你能否答得上来? 这里有10个经典的Java面试题,也为大家列出了答案。这是Java开发人员面试经常容易遇到的问题,相信你了解和掌握之后一定会有所提高。
| Arraylist | LinkedList ------------------------------------------ get(index) | O(1) | O(n) add(E) | O(n) | O(1) add(E, index) | O(n) | O(n) remove(index) | O(n) | O(n) Iterator.remove() | O(n) | O(1) Iterator.add(E) | O(n) | O(1)除了考虑时间复杂度之外,当List比较大时,空间复杂度也不可忽略:
LinkList:每个节点还需要额外的两个指针,分别指向前一个节点和下一个节点 ArrayList:只需要一个数组 更多比较信息...
2.最有效移除集合元素的方式 唯一正确的移除集合元素的方式就是使用Iterator.remove()方法:
Iterator Integer itr = list.iterator(); while(itr.hasNext()) { // do something itr.remove(); }
下面这种处理方式是错误的,会报出这么一个异常:ConcurrentModificationException
for(Integer i: list) { list.remove(i); }3.如何将一个List转换成一个int[] 数组?
最简单的方式就是使用Apache Commons Lang工具包下的ArrayUtils:
int[] array = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));如果用jdk的话是没有捷径的,注意我们不能使用List.toArray()方法,因为这样得到的是Integer[],正确的方法应该是:
int[] array = new int[list.size()]; for(int i=0; i list.size(); i++) { array[i] = list.get(i); }
4.如何将int[] 转换成List?
和上面类似,我们可以使用ArrayUtils工具类:
List list = Arrays.asList(ArrayUtils.toObject(array));或者依然没有捷径:
int[] array = {1,2,3,4,5}; List Integer list = new ArrayList Integer for(int i: array) { list.add(i); }5.最好的过滤集合的方法?
当然,最方便最好的方式就是使用第三方jar包,比如 Guava or Apache Commons Lang ,这两者都提供了filter()方法。在jdk中,事情就变得没那么简单了(不过Java8已经支持Predicate了),但是在Java8之前,比较通常的方式是我们必须遍历集合中的所有元素:
Iterator Integer itr = list.iterator(); while(itr.hasNext()) { int i = itr.next(); if (i 5) { // filter all ints bigger than 5 itr.remove(); }但是我们可以模拟Guava 和Apache Commons Lang,通过引入一个新的Predicate接口,这是很多高级工程师的方法:
public interface Predicate T { boolean test(T o); public static T void filter(Collection T collection, Predicate T predicate) { if ((collection != null) (predicate != null)) { Iterator T itr = collection.iterator(); while(itr.hasNext()) { T obj = itr.next(); if (!predicate.test(obj)) { itr.remove(); }
filter(list, new Predicate Integer () { public boolean test(Integer i) { return i });6.把List转换成Set的最简单的方式有两种方式:
Set Integer set = new HashSet Integer (list);
Set Integer set = new TreeSet Integer (aComparator); set.addAll(list);7.如何移除ArrayList中的重复元素
和上面方法类似,如果不关心顺序的话:
ArrayList** list = ... // initial a list with duplicate elements Set Integer set = new HashSet Integer (list); list.clear(); list.addAll(set);如果关心顺序,把上面那个HashSet换成LinkedHashSet即可。
8.给集合排序
给集合排序的实现方法有很多种
1.Collections.sort():进行一次排序
2.PriorityQueue :始终保持队列的顺序,但是只能从队列的头获取元素
3.TreeSet:始终保持队列的顺序,元素不重复,你可以从最顶端或最低端获取元素,但也不能随机获取元素
9.Collections.emptyList() vs new Instance
上面两个方法都会返回空的List,但是Collections.emptyList()返回的List是不可变的,每次方法调用不会重新创建一个实例,而是复用原来的实例(即单例模式),所以这样效率会高些。
10.Collections.copy
有两种方式复制一个List,第一种:
ArrayList Integer dstList = new ArrayList Integer (srcList);第二种是利用Collections.copy()方法:
ArrayList Integer dstList = new ArrayList Integer (srcList.size()); Collections.copy(dstList, srcList);那两者有何区别呢?
如果目标集合(dstList)小于源集合,使用Collections.copy()会抛出IndexOutOfBoundsException,那它有什么好处呢?首先它保证运行效率和集合大小线性相关,第二就是可以实现集合的重用。
Java集合的常见面试题(全) 这里写目录标题前言常用的集合类有哪些集合底层数据结构ArrayList 和 LinkedList 的区别HashSet 如何检查重复HashSet与HashMap的区别HashMap 和 Hashtable 的区别HashMap 的底层实现HashMap 的长度为什么是 2 的幂次方ConcurrentHashMap 和 Hashtable 的区别Array 和 ArrayList 的区别Collection 和 Collections的区别 关于java集合的一些知识点可看我之前的文章进行预习
List,Set,Map三者的区别?List、Set、Map 是否继承自 Collection 接口?List、Map、Set 三个接口存取元素时,各有什么特点? 集合框架底层数据结构 Java集合的快速失败机制 “fail-fast”? 怎么确保一个集合不能被修改? Collection接口 ==List接口===迭代器 Iterator 是什么? Iterator 和 Lis
List,Set,Map三者的区别?List、Set、Map 是否继承自 Collection 接口?List、Map、Set 三个接口存取元素时,各有什么特点? 集合框架底层数据结构 Java集合的快速失败机制 “fail-fast”? 怎么确保一个集合不能被修改? Collection接口 ==List接口===迭代器 Iterator 是什么? Iterator 和 Lis
入职大厂,齐姐精选的 9 道 Java 集合面试题 Java 集合框架其实都讲过了,有一篇讲 Collection 的,有一篇讲 HashMap 的,那没有看过的小伙伴快去补下啦,文末也都有链接;看过的小伙伴,那本文就是检测学习成果的时候啦 今天这篇文章是单纯的从面试的角度出发,以回答面试题为线索,再把整个 Java 集合框架复习一遍,希望能帮助大家拿下面试。
10 个经典的 Java 集合面试题,看你能否答得上来? 这里有10个经典的Java面试题,也为大家列出了答案。这是Java开发人员面试经常容易遇到的问题,相信你了解和掌握之后一定会有所提高。
相关文章
- java启动器_JAVA基础:Java 启动器如何查找类
- java山寨qq账号密码验证_Java实战-山寨QQ
- 用java实现笛卡尔积_Java实现笛卡尔积
- Java如何不用“return”返回数据
- JAVA入门学习八
- Java cast_java concat方法
- Java多态理解_什么是java多态
- java使用xquery_如何使用Java XQuery
- java解释器虚拟机-Java代码如何运行在Java虚拟机中
- 【Java 虚拟机原理】Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )
- java的泛型(三)
- Java基础学习笔记五 Java基础语法之面向对象详解编程语言
- java代码实现访问网络外部接口并获取数据的工具类详解编程语言
- java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类详解编程语言
- Java Map.keySet()方法:获取Map集合的所有键名
- Java Set.contains()方法:判断Set集合是否包含指定的对象
- Linux下部署Java项目实践(linux部署java项目)
- 实现Java实现Redis集合的技术研究(redis集合java)
- Java轻松使用Redis实现数据高效存储(java使用redis)
- 失效Redis Java数据过期失效管理(redisjava过期)
- Java开发与Linux运维的高效协作(java与linux运维)
- Linux 下安装Java:快速从零开始(linux 下载java)
- Linux上善用Java:实现智能开发(linux 运行java)
- Linux下快速配置Java环境变量(linux设置java环境变量)
- 堆栈探索Java构建Oracle堆栈的可能性(java建oracle)
- Java技术将数据写入Oracle数据库(java写入oracle)