20个Java集合面试问题和答案(建议收藏)
前言:
Java集合框架是Java编程语言的基本方面。这是java面试问题的重要主题之一。在这里,我列出了一些关于java集合框架的重要问题和答案。
1。什么是Java集合框架?列出Collections框架的一些好处?
集合用于每种编程语言,最初的Java版本包含几个集合类:Vector、Stack、Hashtable、Array。但是从更大的范围和使用情况来看,Java1。2提出了集合框架,它将所有集合接口、实现和算法分组。Java集合在使用泛型和并发集合类进行线程安全操作方面取得了长足的进步。它还包括阻塞接口及其在java并发包中的实现。集合框架的一些好处是:
通过使用核心集合类而不是实现我们自己的集合类来减少开发工作。
使用经过良好测试的集合框架类可以提高代码质量。
通过使用JDK附带的集合类来减少代码维护工作。
可重用性和互操作性
2。集合框架中的泛型有什么好处?
Java1。5带有泛型,所有集合接口和实现都大量使用它。泛型允许我们提供集合可以包含的Object类型,因此如果您尝试添加任何其他类型的元素,则会引发编译时错误。这避免了运行时的ClassCastException,因为您将在编译时收到错误。由于我们不需要使用强制转换和instanceof运算符,泛型也使代码更干净。它还增加了运行时的好处,因为不会生成进行类型检查的字节码指令。
3。JavaCollectionsFramework的基本接口是什么?
集合是集合层次结构的根。集合表示一组称为元素的对象。Java平台不提供此接口的任何直接实现。
Set是一个不能包含重复元素的集合。该接口对数学集合抽象进行建模,并用于表示集合,例如一副纸牌。
List是一个有序的集合,可以包含重复的元素。您可以从它的索引访问任何元素。List更像是具有动态长度的数组。
Map是将键映射到值的对象。映射不能包含重复的键:每个键最多可以映射到一个值。
其他一些接口是Queue、Dequeue、Iterator、SortedSet和。SortedMapListIterator
4。为什么Collection不扩展Cloneable和Serializable接口?
集合接口指定一组称为元素的对象。如何维护元素取决于Collection的具体实现。例如,某些Collection实现(如List)允许重复元素,而其他实现(如Set)则不允许。许多Collection实现都有一个公共的克隆方法。但是,将它包含在Collection的所有实现中并没有真正的意义。这是因为Collection是一种抽象表示。重要的是执行。
在处理实际实现时,克隆或序列化的语义和含义会发挥作用;所以具体的实现应该决定它应该如何被克隆或序列化,或者即使它可以被克隆或序列化。
因此,在所有实现中强制克隆和序列化实际上不太灵活且限制性更强。具体的实现应该决定它是否可以被克隆或序列化。
5。为什么Map接口不扩展Collection接口?
尽管Map接口及其实现是CollectionsFramework的一部分,但Map不是集合,集合也不是Map。因此Map扩展Collection没有意义,反之亦然。
如果Map扩展了Collection接口,那么元素在哪里?Map包含键值对,它提供了检索键或值列表作为集合的方法,但它不适合元素组范式。
6。什么是迭代器?
Iterator接口提供了迭代任何Collection的方法。我们可以使用迭代器方法从集合中获取迭代器实例。迭代器在Java集合框架中取代了枚举。迭代器允许调用者在迭代期间从底层集合中移除元素。
7。枚举和迭代器接口有什么区别?
枚举的速度是迭代器的两倍,并且使用的内存非常少。枚举是非常基础的,适合基本需求。但是Iterator比Enumeration更安全,因为它总是拒绝其他线程修改它正在迭代的集合对象。
迭代器在Java集合框架中取代了枚举。迭代器允许调用者从底层集合中删除元素,而枚举是不可能的。迭代器方法名称已得到改进,使其功能清晰。
8。为什么没有像Iterator。add()这样的方法来向集合中添加元素?
语义尚不清楚,因为Iterator的合同不保证迭代的顺序。但是请注意,ListIterator确实提供了添加操作,因为它确实保证了迭代的顺序。
9。为什么迭代器没有直接获取下一个元素而不移动光标的方法?
它可以在当前的Iterator接口之上实现,但由于它很少使用,因此将它包含在每个人都必须实现的接口中是没有意义的。
10。Iterator和ListIterator有什么区别?
我们可以使用Iterator遍历Set和List集合,而ListIterator只能与List一起使用。Iterator只能向前遍历,而ListIterator可用于双向遍历。ListIterator继承自Iterator接口,并带有额外的功能,例如添加元素、替换元素、获取上一个和下一个元素的索引位置。
11。迭代列表有哪些不同的方法?
我们可以用两种不同的方式迭代一个列表使用迭代器和使用foreach循环。fontstyleverticalalign:inherit;fontstyleverticalalign:inherit;列表StringstrListnewArrayList();fontfontfontfontfontstyleverticalalign:inherit;fontstyleverticalalign:inherit;使用foreach循环fontfontfontfontfontstyleverticalalign:inherit;fontstyleverticalalign:inherit;对于(字符串对象:strList){fontfontfontfontfontstyleverticalalign:inherit;fontstyleverticalalign:inherit;System。out。println(obj);fontfontfontfontfontstyleverticalalign:inherit;fontstyleverticalalign:inherit;}fontfontfontfontfontstyleverticalalign:inherit;fontstyleverticalalign:inherit;使用迭代器fontfontfontfontfontstyleverticalalign:inherit;fontstyleverticalalign:inherit;迭代器StringitstrList。iterator();fontfontfontfontfontstyleverticalalign:inherit;fontstyleverticalalign:inherit;而(it。hasNext()){fontfontfontfontfontstyleverticalalign:inherit;fontstyleverticalalign:inherit;字符串objit。next();fontfontfontfontfontstyleverticalalign:inherit;fontstyleverticalalign:inherit;System。out。println(obj);fontfontfontfontfontstyleverticalalign:inherit;fontstyleverticalalign:inherit;}fontfont
使用迭代器更加线程安全,因为它确保如果底层列表元素被修改,它将抛出ConcurrentModificationException。
12。您对迭代器快速失败属性有何理解?
每次我们尝试获取下一个元素时,迭代器快速失败的属性都会检查底层集合结构中的任何修改。如果发现任何修改,它会抛出ConcurrentModificationException。除了ConcurrentHashMap和CopyOnWriteArrayList等并发集合类之外,Collection类中的所有Iterator实现都是设计为快速失败的。
13。快速故障和故障安全之间有什么区别?
迭代器故障安全属性与基础集合的克隆一起使用,因此它不受集合中任何修改的影响。按照设计,java。util包中的所有集合类都是快速故障的,而其中的集合类java。util。concurrent是故障安全的。快速失败的迭代器抛出ConcurrentModificationException,而故障安全迭代器从不抛出ConcurrentModificationException。检查此帖子以获取CopyOnWriteArrayList示例。
14。迭代集合时如何避免ConcurrentModificationException?
ConcurrentModificationException我们可以在迭代集合时使用并发集合类来避免,例如CopyOnWriteArrayList而不是ArrayList。
检查这篇文章的ConcurrentHashMap示例。
15。为什么没有Iterator接口的具体实现?
Iterator接口声明了用于迭代集合的方法,但它的实现由Collection实现类负责。每个返回迭代器进行遍历的集合类都有自己的迭代器实现嵌套类。
这允许集合类选择迭代器是快速故障还是故障安全。例如ArrayList迭代器是故障快速的,而CopyOnWriteArrayList迭代器是故障安全的。
16。什么是UnsupportedOperationException?
UnsupportedOperationException是用于指示不支持该操作的异常。它在JDK类中广泛使用,在集合框架中为所有操作java。util。Collections。UnmodifiableCollection抛出此异常。addremove
17。HashMap在Java中是如何工作的?
Map。EntryHashMap在静态嵌套类实现中存储键值对。HashMap做散列算法,在putandget方法中使用hashCode()和equals()方法。当我们通过传递键值对调用put方法时,HashMap使用KeyhashCode()和散列来找出索引来存储键值对。条目存储在LinkedList中,因此如果已经存在条目,则使用equals()方法检查传递的键是否已存在,如果存在则覆盖值,否则创建新条目并存储此键值条目。当我们通过传递Key调用get方法时,它再次使用hashCode()来查找数组中的索引,然后使用equals()方法找到正确的Entry并返回它的值。下图将清楚地解释这些细节。
关于HashMap需要了解的其他重要事项是容量、负载因子、阈值调整大小。HashMap初始默认容量为32,加载因子为0。75。阈值是容量乘以负载因子,每当我们尝试添加条目时,如果映射大小大于阈值,HashMap会将映射的内容重新散列到具有更大容量的新数组中。容量始终是2的幂,因此如果您知道需要存储大量键值对,例如在缓存数据库中的数据时,最好使用正确的容量和负载因子初始化HashMap。
18。hashCode()和equals()方法的重要性是什么?
HashMap使用Key对象hashCode()和equals()方法来确定放置键值对的索引。当我们尝试从HashMap中获取值时,也会使用这些方法。如果这些方法没有正确实现,两个不同的Key可能会产生相同的hashCode()和equals()输出,在这种情况下,HashMap不会将其存储在不同的位置,而是将它们视为相同并覆盖它们。类似地,所有不存在的集合类不存储重复数据使用hashCode()和equals()来查找重复数据,因此正确实现它们非常重要。equals()和hashCode()的实现应该遵循这些规则。
如果o1。equals(o2),那么o1。hashCode()o2。hashCode()应该总是true。
如果o1。hashCode()o2。hashCode是真的,那并不意味着o1。equals(o2)会是true。
19。我们可以使用任何类作为Map键吗?我们可以使用任何类作为MapKey,但是在使用它们之前应该考虑以下几点。
如果类重写了equals()方法,它也应该重写hashCode()方法。
对于所有实例,该类应遵循与equals()和hashCode()相关的规则。有关这些规则,请参阅前面的问题。
如果在equals()中未使用类字段,则不应在hashCode()方法中使用它。
用户定义键类的最佳实践是使其不可变,以便可以缓存hashCode()值以获得快速性能。不可变类也确保hashCode()和equals()将来不会改变,这将解决可变性的任何问题。
例如,假设我有一个MyKey用于HashMap键的类。MyKeynameargumentpassedisusedforequals()andhashCode()fontfontMyKeykeynewMyKey(Pankaj);assumehashCode1234fontfontmyHashMap。put(key,Value);fontfontfontfontBelowcodewillchangethekeyhashCode()andequals()fontfontbutitslocationisnotchanged。fontfontkey。setName(Amit);assumenewhashCode7890fontfontfontfontbelowwillreturnnull,becauseHashMapwilltrytolookforkeyfontfontinthesameindexasitwasstoredbutsincekeyismutated,fontfonttherewillbenomatchanditwillreturnnull。fontfontmyHashMap。get(newMyKey(Pankaj));
这就是为什么String和Integer主要用作HashMap键的原因。
20。Map接口提供了哪些不同的Collection视图?
Map接口提供了三个集合视图:
SetkeySet():返回此映射中包含的键的Set视图。集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。该集合支持元素移除,即通过Iterator。remove、Set。remove、removeAll、retainAll和clear操作从映射中移除相应的映射。它不支持add或addAll操作。
集合值():返回此映射中包含的值的集合视图。集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。该集合支持元素移除,即通过Iterator。remove、Collection。remove、removeAll、retainAll和clear操作从映射中移除相应的映射。它不支持add或addAll操作。
SetMap。EntryK,VentrySet():返回此映射中包含的映射的Set视图。集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作或通过迭代器返回的映射条目上的setValue操作除外),则迭代的结果是未定义的。该集合支持元素移除,即通过Iterator。remove、Set。remove、removeAll、retainAll和clear操作从映射中移除相应的映射。它不支持add或addAll操作。
总结:
不积跬步,无以至千里,希望未来的你能成为:有梦为马随处可栖!加油,为大家收集了更多最新的面试资料,有文档、有攻略、有视频。有需要的同学可以关注点赞私信博主免费领取
人类到底是从哪里来的?在地球上生存着众多的生物,除了那些已经被列入生物学名单的生物之外,还有大量的生物,到目前为止没有被我们发现。自生物学诞生以来,人类从未停止过对物种起源的探索。抬头仰望星空……
惊呆了我的大唐美人!到底有多少美妆造型俗话说:三分人材,七分妆饰。这点唐人比我们重视多了。对于长安城的爱美人士来说,化妆甚至比门面还要重要。唐代是一个开放浪漫的朝代,在唐代,不仅化妆品的品目繁多,在护肤品的运……
让一个妈妈疯魔的,不是二胎,不是穷,而是孩子上了小学文叶听枫马上要开学了,水深火热中的老母亲忍耐力也快到达顶点了:娃子天天在家,真的太费妈了。都说距离产生美,我和娃已经相看两相厌了:一周都打了三架了!……
南宫普彤塔游记佛门中人是讲究缘分的。我虽然不信佛,但家中多是信佛人,二姑皈依佛门多年,还兴建了一座万佛寺,因此这注定我多多少少是和佛门有机缘的。其实,我每到一个地方,总是要先了解……
360工具单文件提取版合集,无捆绑免安装,解决各种电脑问题关于360软件,网上有句话是这样说的:电脑上遇到的80的问题、都可以通过安装360解决,剩下的20,则可以通过卸载360来解决。360功能确实非常强大,一般的电脑问题,通……
广汽集团7月产销解析广汽本田持续增长,广汽丰田环比大跌纵观近期广汽集团各合资公司的综合表现,就没有一个让人省心的。8月4日,在《汽车K线》关注的18家乘用车整车上市公司中,广汽集团仅次于比亚迪,第二个发布了7月产销快报。……
337!进攻端完爆东契奇!年薪只有500万啊近日,斯洛文尼亚和土耳其就进行了一场精彩的热身赛,最后依靠德拉季奇的准绝杀三分,斯洛文尼亚1分险胜。在这场比赛中,东契奇和德拉季奇固然表现出色,一个拿到23分10板5助攻……
我国商业化最弱的五大古镇,被游客零差评,你去过几个呢随着旅游业发展趋势越来越好,很多景区为了吸引游客到来,大量地建造仿古建筑。所以我们去到很多景区都能看到这样的一个现象,景区里面有着很多仿古建筑,而且商业化特别严重,都是在仿古建……
而我们必将成为王格罗姆地狱咆哮不论是魔兽玩家还是炉石玩家,对吼爹应该都不陌生,他那一句经典的兽人永不为奴深入玩家内心,让我们领略一下吼爹的风采。格罗姆(格罗玛什),地狱咆哮,高傲的战歌氏族酋长,手中的……
卢伟冰放狠话,网友他不怕得罪友商吗?安卓阵营与苹果最大的不同在于,新机发布速度和频率甩苹果N条街。每年发布的新机数都数不过来,只有这样才能与苹果相抗衡否则安卓阵营的销量根本上不去。全球排名第一的三星就是靠机海战术……
四场比赛共伤10人,8个违体将4人打进医院,广东晋升为新武术广东和青岛相遇,虽然广东最终拿到了比赛的胜利,但是也再一次站在了风口浪尖上。本场比赛青岛队付出了三位伤员的带代价依然没有能够带走比赛,而在和青岛队的比赛结束以后,广东队在……
为打压国乒连续改规则,顶级国手因他退役,沙拉拉下场如何?提起阿达姆沙拉拉这个名字,或许很多人都会觉得陌生,但要是说起那个屡次针对我国进行不公平改革,间接导致刘国梁、孔令辉退役的国际乒联主席,大家想必就十分熟悉了。可就在沙拉拉为……