Java Collections框架是Java编程语言的核心API之一。

这是Java面试问题的重要主题之一。在这里,我列出了一些重要的Java集合面试问题和解答,以帮助您进行面试。这直接来自我14年以上的Java编程经验。

1、Java 8中与Collections相关的功能是什么?

Java 8对 Collection API 进行了重大更改。一些更改是:

  1. Java Stream API 用于集合类,以支持顺序处理和并行处理
  2. Iterable 接口中的默认方法forEach(),可用于迭代集合。与 lambda 表达式一起使用时,它非常有用,因为其参数 Consumer 是函数接口。
  3. Collections API 改进,如在Iterator接口中的forEachRemaining(Consumer action),MapreplaceAll()compute()merge()方法。

2、什么是 Java Collections Framework?列出 Collections 框架的一些好处?

每个编程语言都使用集合,和最初的Java版本包含几个集合类:VectorStackHashtableArray。但是从较高的范围和用法来看,Java 1.2提出了Collections Framework,该框架将所有collections接口,实现和算法分组。

Java的集合通过使用泛型和并发集合类进行线程安全操作已经走了很长一段路。它还包括在Java的并发包中的阻塞接口及其实现。

Collections 框架的一些好处是;

  • 通过使用核心集合类而不是实现我们自己的集合类来减少开发工作。
  • 通过使用通过良好测试的集合框架类,可以提高代码质量。
  • 通过使用JDK附带的集合类,减少了代码维护工作。
  • 可重用性和互操作性

3、集合框架中泛型的好处是什么?

Java 1.5带有泛型,所有集合接口和实现都大量使用它。泛型允许我们提供集合可以包含的Object的类型,因此,如果您尝试添加其他类型的任何元素,则引发编译时错误。

这样可以避免在运行时发生ClassCastException,因为您将在编译时收到错误。由于我们不需要使用强制转换和_实例化_运算符,因此泛型也使代码更干净。

4、Java Collections Framework的基本接口是什么?

Collection 表示集合层次结构的根。Collection表示一组元素的对象。Java平台不提供此接口的任何直接实现。

Set是一个不能包含重复元素的集合。此接口对数学集合的抽象进行建模,并表示集合,例如纸牌集合。

List是一个有序的集合,可以包含重复的元素。您可以从其索引访问任何元素。该列表更像是具有动态长度的数组。

一个Map是键映射到值的对象。映射不能包含重复的键:每个键最多可以映射到一个值。

其他一些接口QueueDequeueIteratorSortedSetSortedMapListIterator

5、为什么Collection不实现Cloneable和Serializable接口?

Collection接口指定为一组元素对象。元素的维护方式取决于Collection的具体实现。例如,某些Collection实现(例如List)允许重复元素,而其他实现(例如Set)则不允许重复元素。

许多Collection实现都有Cloneable方法。但是,将其包含在Collection的所有实现中没有意义。这是因为Collection是抽象表示。重要的是。

在处理实际实现时,克隆或序列化的语义及其含义都会发挥作用。因此具体的实现应决定如何克隆或序列化它,甚至可以对其进行克隆或序列化。

因此,在所有实现中强制进行克隆和序列化的灵活性较差,限制也更大。具体实现应决定是否可以克隆或序列化。

6、为什么Map接口没有实现Collection接口?

尽管Map接口及其实现是Collections Framework的一部分,但Map不是集合,集合也不是Map。因此,Map扩展Collection是没有意义的,反之亦然。

如果Map扩展了Collection接口,那么元素在哪里?该映射包含key-value对,并且提供了一些方法来检索键或值的列表作为Collection,但它不适合“元素组”范式。

7、什么是迭代器?

迭代器接口提供了对任何Collection进行迭代的方法。我们可以使用_iterator()_方法从Collection中获取迭代器实例。在Java Collections Framework中,迭代器代替了枚举。迭代器允许调用者在迭代过程中从基础集合中删除元素。Java Collection迭代器提供了遍历集合元素的通用方法,并实现了Iterator Design Pattern

8、Enumeration和Iterator接口之间有什么区别?

枚举的速度是Iterator的两倍,并且使用的内存更少。枚举是非常基本的,适合基本需求。但是,与Enumeration相比,Iterator安全得多,因为它始终拒绝其他线程修改被其迭代的集合对象。

在Java Collections Framework中,迭代器代替了枚举。迭代器允许调用者从基础集合中删除Enumeration无法实现的元素。迭代器方法名称已得到改进,以使其功能更清晰。

9、为什么没有像Iterator.add()这样的方法将元素添加到集合中?

考虑到Iterator的约定不保证迭代顺序,原因尚不清楚。但是请注意,ListIterator确实提供了add操作,因为它确实保证了迭代的顺序。

10、为什么Iterator没有不移动光标就直接获取下一个元素的方法?

可以在当前Iterator接口的顶部实现它,但是由于很少使用它,因此将它包含在每个人都必须实现的接口中没有意义。

11、Iterator和ListIterator有什么区别?

  • 我们可以使用Iterator遍历Set和List集合,而ListIterator只能与Lists一起使用。
  • Iterator只能向前移动,而ListIterator可以用于两个方向。
  • ListIterator继承自Iterator接口,并具有其他功能,例如添加元素,替换元素,获取上一个和下一个元素的索引位置。

12、有哪些不同的方法可以遍历列表?

我们可以通过两种不同的方式遍历列表-使用迭代器和使用for-each循环。

List <String> strList = new ArrayList<>();

for(String obj:strList){
System.out.println(obj);
} Iterator<String> it= strList.iterator();
while(it.hasNext()){
String obj = it.next();
System.out.println(obj);
}

使用迭代器更加线程安全,因为它可以确保如果基础列表元素被修改,它将抛出异常ConcurrentModificationException

13、您对Iterator fail-fast属性有什么了解?

每当我们尝试获取下一个元素时,迭代器fail-fast属性都会检查基础集合的结构是否有任何修改。如果找到任何修改,则抛出ConcurrentModificationException。除了并行并发类(例如ConcurrentHashMap和CopyOnWriteArrayList)之外,Collection类中Iterator的所有实现在设计上都是fail-fast的。

14、fail-fast和fail-safe之间有何区别?

Iterato fail-safe属性可与基础集合的克隆一起使用,因此不受集合中任何修改的影响。按照设计,java.util包中的所有集合类都是fail-fast的,而其中的集合类java.util.concurrent是fail-safe的。

fail-fast迭代器会抛出ConcurrentModificationException,而fail-safe迭代器绝不会抛出ConcurrentModificationException。

15、如何在迭代集合时避免ConcurrentModificationException?

我们可以使用并发集合类来避免ConcurrentModificationException在集合上进行迭代,例如使用CopyOnWriteArrayList而不是ArrayList。

16、为什么没有Iterator接口的具体实现?

Iterator接口声明了用于迭代集合的方法,但是其实现是Collection实现类的责任。每个返回迭代器以进行遍历的集合类都有其自己的Iterator实现嵌套类。

这使集合类可以选择迭代器是fail-fast还是fail-safe的。例如,ArrayList迭代器是fail-fast的,而CopyOnWriteArrayList迭代器是fail-safe的。

17、什么是UnsupportedOperationException?

UnsupportedOperationException是用于指示不支持该操作的异常。它广泛用于在JDK类,在集合框架java.util.Collections.UnmodifiableCollection抛出该异常所有addremove操作。

18、HashMap如何在Java中工作?

HashMap在Map.Entry静态嵌套类实现中存储键值对。HashMap使用哈希算法,并在putget方法中使用hashCode()和equals()方法。

当我们put通过传递键值对来调用方法时,HashMap使用带有哈希值的Key hashCode()来查找存储键值对的索引。该条目存储在LinkedList中,因此,如果已经存在一个条目,则使用equals()方法检查传递的键是否已存在,如果是,它将覆盖该值,否则它将创建一个新条目并存储此键值条目。

当我们get通过传递Key来调用method时,它再次使用hashCode()在数组中找到索引,然后使用equals()方法找到正确的Entry并返回其值。下图将清楚地解释这些细节。

有关HashMap的其他重要信息是容量,负载因子,阈值大小调整。HashMap的初始默认容量为16,负载系数为0.75。阈值是容量乘以负载因子,并且如果Map大小大于阈值,则每当我们尝试添加条目时,HashMap都会将Map的内容重新映射为容量更大的新数组。容量始终是2的乘方,因此,如果您知道需要存储大量的键值对,例如在缓存数据库中的数据时,最好使用正确的容量和负载因子来初始化HashMap。 。

19、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

20、我们可以使用任何类作为Map键吗?

我们可以将任何类用作Map Key,但是在使用它们之前应考虑以下几点。

  • 如果该类重写equals()方法,则它也应该重写hashCode()方法。

  • 对于所有实例,该类应遵循与equals()和hashCode()关联的规则。这些规则请参考前面的问题。

  • 如果equals()中未使用类字段,则不应在hashCode()方法中使用它。

  • 用户定义的键类的最佳实践是使其不可变,以便可以将hashCode()值缓存起来以提高性能。不可变的类还确保hashCode()和equals()将来不会更改,这将解决任何可变性问题。

    例如,假设我有一个MyKey用于HashMap键的类。

    //传递的mykey name参数用于equals()和hashcode()
    MyKey key = new MyKey("Pankaj"); //假定hashCode=1234
    myHashMap.put(key, "Value"); // 下面的代码将更改equals()和hashcode()的key
    // 但是它的位置不会改变
    key.setName("Amit"); //假定新的hashCode=7890 //下面将返回null,因为HashMap将尝试查找键
    //与存储在同一索引中,但由于密钥发生了变化,
    //不匹配,返回空。
    myHashMap.get(new MyKey("Pankaj"));

    这就是为什么String和Integer大多用作HashMap键的原因。

21、Map接口提供哪些不同的Collection视图?

Map接口提供了三个集合视图:

  1. Set keySet():返回此映射中包含的键的Set视图。该集合由Map支持,因此对Map的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器的remove操作除外),则迭代的结果不确定。该集合支持元素删除,该元素通过迭代器remove,Set.remove,removeAll,retainAll和clear操作从映射中删除相应的映射。它不支持add或addAll操作。
  2. Collection values():返回此映射中包含的值的Collection视图。集合由Map支持,因此对Map的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器的remove操作除外),则迭代结果不确定。集合支持元素删除,该元素通过迭代器remove,Collection.remove,removeAll,retainAll和clear操作从映射中删除相应的映射。它不支持add或addAll操作。
  3. Set <Map.Entry <K,V >> entrySet():返回此映射中包含的映射的Set视图。该集合由Map支持,因此对Map的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器的remove操作或迭代器返回的映射条目上的setValue操作除外),则迭代的结果不确定。该集合支持元素删除,该元素通过迭代器remove,Set.remove,removeAll,retainAll和clear操作从映射中删除相应的映射。它不支持add或addAll操作。

“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!

关注公众号:「Java 知己」,每天更新Java知识哦,期待你的到来!

  • 发送「Group」,与 10 万程序员一起进步。
  • 发送「面试」,领取BATJ面试资料、面试视频攻略。
  • 发送「玩转算法」,领取《玩转算法》系列视频教程。
  • 千万不要发送「1024」...

21个Java Collections面试问答的更多相关文章

  1. Java多线程面试问答

    今天,我们将讨论Java 多线程面试问答. 线程是Java面试问题中的热门话题之一.在这里,我从面试的角度列出了大多数重要的Java多线程面试问题,但是您应该对Java线程有足够的知识来处理后续问题. ...

  2. Java字符串面试问答

    字符串是使用最广泛的Java的类之一.在这里,我列出了一些重要的Java的字符串面试问答. 这将有助于您全面了解String并解决面试中与String有关的任何问题. Java基础面试问题 Java中 ...

  3. Java最新面试问答整理

    Q:JDK和JRE区别? JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基 础的类库.通过JDK开发人员将源码文件(java文件)编译成字节码文件(class文 ...

  4. Java多线程并发面试问答

    Java并发面试问答 什么是原子操作?Java并发API中的原子类是什么? 原子操作在单个任务单元中执行,而不受其他操作的干扰.在多线程环境中,原子操作是必需的,以避免数据不一致. int++不是原子 ...

  5. java异常面试常见题目

    在Java核心知识的面试中,你总能碰到关于 处理Exception和Error的面试题.Exception处理是Java应用开发中一个非常重要的方面,也是编写强健而稳定的Java程序的关键,这自然使它 ...

  6. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  7. [转] JAVA多线程和并发基础面试问答

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  8. JAVA多线程和并发基础面试问答

    转载: JAVA多线程和并发基础面试问答 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对 ...

  9. 【多线程】JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

随机推荐

  1. django 做 migrate 时 表已存在的处理

    在开发web的时候,如果是以前已存在的项目,项目下载下来后,为了使用测试库的数据,会直接将整个测试库(如sqlite3)拿到本机来.这种情况下,如果执行的顺序不对,很容易在执行migrate的时候出现 ...

  2. 11.2 Data Guard Physical Standby Switchover Best Practices using SQL*Plus (Doc ID 1304939.1)

    11.2 Data Guard Physical Standby Switchover Best Practices using SQL*Plus (Doc ID 1304939.1) APPLIES ...

  3. Tornado—添加请求头允许跨域请求访问

    跨域请求访问 如果是前后端分离,那就肯定会遇到cros跨域请求难题,可以设置一个BaseHandler,然后继承即可. class BaseHandler(tornado.web.RequestHan ...

  4. 几种常见的css布局_l流体布局、圣杯布局、双飞翼布局

    1.流体布局: <!DOCTYPE html><html> <head> <meta charset="utf-8"> <ti ...

  5. 如何获得大学教材的PDF版本?

    最近急需一本算法书的配套答案,这本配套单独出售,好像在市面上还买不到,在淘宝上搜索也只是上一个版本,并没有最新版本,让我很无奈.加上平时肯定会有这么一种情况,想看一些书,但买回来也看不了几次,加上计算 ...

  6. 谁说程序员不浪漫?Python导出微信聊天记录生成爱的词云图

    明天又双叒叕是一年一度的七夕恋爱节了! 又是一波绝好的机会!恩爱秀起来! 购物车清空!礼物送起来!朋友圈晒起来!   等等! 什么?! 你还没准备好七夕礼物么? 但其实你不知道要送啥? 原来又双叒叕要 ...

  7. 原生PHP网页导出和导入excel文件实例

    原生PHP实现的网页导出和导入excel文件实例,包括上传也是用的原生.还可在exportExcel方法里设置字体等表格样式. 导出和导入表单代码: <p style="margin: ...

  8. IOS-dequeueReusableCellWithIdentifier的应用

    这是个uitableviewcell重用的函数.当一个列表中的布局相同只是数据不同时,我们可以重用我们的cell,不需要再重复创建.上面代码的意思是,先根据identifier去重用列表中找有没有可以 ...

  9. Android6.0 源码修改之Setting列表配置项动态添加和静态添加

    写在前面 最近客户有个需求,要求增加操作Setting列表配置项的功能,是不是一脸懵,没关系,一图胜千言,接下来就上图.诺,就是这么个意思.   原来的列表配置项     增加了单个配置项     增 ...

  10. 如何实现Web页面录屏?

    摘要: 很有意思的操作... 原文:web页面录屏实现 译者:frontdog Fundebug经授权转载,版权归原作者所有. 写在前面的话 在看到评论后,突然意识到自己没有提前说明,本文可以说是一篇 ...