Java集合常见面试题汇总

简介: Java集合常见面试题汇总

Java集合常见面试题汇总


1. 写出 List、Set、Map的各自特点

List接口:

存储任意类型的Object对象,有序、有下标、元素可以重复;

下标范围:0~元素个数-1 0~size()-1

Set集合:

无序、无下标、元素内容不允许重复;

Map集合:

(1) Map以键值对形式存储(key-value)。

(2) 键:无序、无下标、元素不允许重复(唯一)。

(3) 值:无序、无下标、元素内容允许重复。


2. 写出 ArrayList 和 Vector的区别

a. ArrayList:

底层以数组实现,查询效率快,增删效率慢

JDK1.2版本,线程不安全,并发效率相对高

b. Vector:

底层以数组实现,查询效率快,增删效率慢

JDK1.0 版本,线程安全,并发效率低


3. 写出 ArrayList 和 LinkedList的区别

a. ArrayList:

底层以数组实现,查询效率快,增删效率慢

JDK1.2版本,线程不安全,并发效率相对高

b LinkedList:

底层以链表实现,查询效率相对较低,增删效率相对快


   扩充:数组在内存空间连续:内存空间利用率相对不高 (寻址方便)
     链表在内存空间不连续:内存空间利用相对较高 (寻址相对麻烦)


4. 写出 HashSet如何保证元素内容不重复

I. 如果保证HashSet中存储内容不同的对象,需要做到以下两点:

a. 覆盖 hashCode方法

① 原则:必须保证内容相同的对象返回相同的哈希码值;

为了提高效率,尽可能做到内容不同的对象返回不同哈希码值

② 覆盖:将所有的属性值拼凑为一个 int 的整数作为返回值返回

b. 覆盖 equals方法

① 必须保证内容相同返回 true,拒绝添加元素

② 内容不同的对象返回值为false,则成功添加

II. 执行原理:当一个对象往 HashSet集合中存储时,先调用当前对象的

hashCode方法,获取对应存储下标(为了保证内容相同的对象不添加

到HashSet集合中,通常将 hashCode方法给与覆盖),存储下标位置

上没有任何元素,则直接将对象存储在对应下标位置上,但是如果下标

位置上已经存储了其他元素,则调用 该对象 equals方法(为了保证

内容不同通常覆盖 equals方法),equals方法返回值为true,代表

内容相同对象,则拒绝添加到集合中,如果返回值为false,则成功添

加到对应下标位置,此时采用数组+链表形式进行存储。


5. 写出 HashMap 和 Hashtable 的区别

(1) HashMap:

JDK1.2版本,线程不安全,并发效率快,允许null作为

key/value

(2) Hashtable:

JDK1.0版本,线程安全,并发效率低,不允许null作为

key/value


6. 简述 HashMap的存储原理

HashMap: 存储元素时获取key的哈希码值(通过键对应对象的hashCode方法),

获取哈希码值与底层存储时数组取余得到存储下标,第一种情况存储

下标上没有元素,则直接添加(将key和value一起存储);第二种情

况,存储下标位置上如果有元素,则调用key对应存储对象的equals

方法,判断下标冲突的对象内容是否相同,equals方法结果为true,

代表内容相同,则拒绝添加,equals方法结果为false,代表内容不

同,此时采用数组+链表形式进行存储


HashMap应用注意细节: 如果自定类型的对象作为HashMap的键进行存储,为了

保证元素内容不重复,需要覆盖 hashCode和equals方法(规则等价于

HashSet);但是实际开发应用,通常使用 Integer、String作为

HashMap的key类型


注意:HashSet底层实际封装了一个 HashMap


7. 简述 Comparator 和 Comparable的区别


Comparator是外置比较器,实现方法 compare(Tt1,T t2);

Comparable是内置比较器,实现方法 compareTo(Tt)方法;


8. 简述 Java中集合框架


3.png



目录
打赏
0
0
0
0
723
分享
相关文章
Java大厂面试高频:Collection 和 Collections 到底咋回答?
Java中的`Collection`和`Collections`是两个容易混淆的概念。`Collection`是集合框架的根接口,定义了集合的基本操作方法,如添加、删除等;而`Collections`是一个工具类,提供了操作集合的静态方法,如排序、查找、同步化等。简单来说,`Collection`关注数据结构,`Collections`则提供功能增强。通过小王的面试经历,我们可以更好地理解这两者的区别及其在实际开发中的应用。希望这篇文章能帮助你掌握这个经典面试题。
65 4
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
67 3
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
40 15
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
210 60
java常见的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口: 1. Collection接口的子接口包括:Set接口和List接口 2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等 3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
144 14
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
66 13
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
113 16
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
111 9
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
96 12

热门文章

最新文章