Java企业面试题5
1. Java 的泛型是什么?有什么好处和优点?JDK 不同版本的泛型有什么区别?(软*动力)
- 泛型是 Java 语言中引入的一种特性,允许在定义类、接口和方法时使用类型参数(Type Parameters)。它提供了编译时类型安全检查机制,允许程序员在使用集合类时不必进行显式的类型转换。
- 好处和优点:
- 类型安全:泛型增强了代码的可读性和安全性,避免了类型转换错误。
- 代码复用:泛型允许编写通用的代码,适用于多种数据类型。
- 减少强制类型转换:使用泛型后,集合操作时不需要手动转换类型。
- JDK 不同版本的泛型区别:
- JDK 5 引入了泛型,之前的版本不支持泛型。
- JDK 7 引入了菱形语法,简化了泛型实例化。
- JDK 8 引入了类型推断,进一步简化了泛型代码。
2. 说说你对泛型的了解(*软国际)
- 泛型是 Java 中用于实现类型参数化的一种机制,它允许在类、接口和方法中使用类型变量。泛型的主要目的是提供编译时的类型检查和消除类型转换。
3. 链表和数组有什么区别?(腾*)
- 数组是固定大小的数据结构,一旦创建,大小不可变。数组中的元素通过索引直接访问,访问速度快,但插入和删除操作效率较低。
- 链表是一种动态的数据结构,大小可变。链表中的元素通过指针连接,插入和删除操作效率高,但访问元素需要遍历链表,速度较慢。
4. 栈是如何运行的?(西*信息技术)
- 栈是一种后进先出(LIFO)的数据结构,只允许在一端进行插入(push)和删除(pop)操作。栈的操作类似于一叠盘子,最后放上去的盘子必须是第一个被取走的。
5. ArrayList的默认大小是多少,以及扩容机制(顺*、凡*科技)
- 默认大小为 10。
- 当 ArrayList 达到容量限制时,会自动扩容,通常是当前容量的1.5倍。
6. ArrayList的底层是怎么实现的?(腾*)
- ArrayList 底层是基于动态数组实现的,它封装了一个 Object[] 数组来存储元素。
- 数组在初始化时具有一定的容量,当容量不足以容纳更多的元素时,数组会被重新创建并复制原有的元素。
7.在ArrayList中remove后面几个元素该怎么做?(惠*、中*亿达)
- ArrayList 没有直接的方法来移除后面几个元素,但可以通过循环调用
remove(index)
方法来逐个移除。
8.ArrayList1.7和1.8的区别(拓*思)
- 主要区别在于 1.8 引入了对 Lambda 表达式和 Stream API 的支持,以及一些性能优化。
9.数组和 ArrayList 的区别(阿*、*科软)
- 数组是固定大小的,而 ArrayList 可动态调整大小。
- 数组可以是基本类型,而 ArrayList 只能存储对象。
- ArrayList 提供了更多便捷的方法,如自动扩容。
10.什么是线程安全的List?(平*金服)
- 线程安全的List是指多个线程可以并发访问而不出现数据一致性问题的List。例如,Vector和Collections.synchronizedList(new ArrayList<>())都是线程安全的实现。
11.说说HahMap底层实现(新*股份、顺*、猫*娱乐)
-
HashMap使用了数组+链表/红黑树的数据结构。每个元素的键通过哈希函数计算得到一个索引,相同索引的元素形成一个链表或者红黑树。
12.HashMap初始值16,临界值12是怎么算的(软**力)
- 初始容量为16是因为这是一个2的幂,可以优化哈希函数的性能。临界值12是基于负载因子(默认0.75)计算得出的,即16 * 0.75 = 12。
13.HashMap长度为什么是2的幂次方(国*时代)
- 当HashMap的容量是2的幂次方时,可以通过位运算来计算索引,这比使用取模运算更快。
14.HashMap怎么计算哈希值和索引?扩容机制?怎么解决hash冲突?(*软国际、中软*腾)
- 哈希值由键对象的hashCode()方法返回,索引通过哈希值与数组长度的掩码计算得出。当达到阈值时,HashMap会自动扩容,通常是原容量的两倍,并且重新计算每个键的哈希值。解决hash冲突的方法包括链地址法(使用链表或红黑树存储相同索引的键值对)。
15.HashMap底层是数组+链表,有数组很快了,为什么加链表?(润*软件)
- 使用链表是为了处理哈希冲突的情况,当多个键映射到同一个索引时,链表可以保存这些键值对。
16.HashMap为什么长度达到一定的长度要转化为红黑树(*度)
- 当链表过长时,搜索效率降低,因此当链表达到一定长度时,为了提高查找速度,会转换成红黑树。
17.HashMap什么时候扩充为红黑树,什么时候又返回到链表?(汉*)
- 当链表长度小于阈值(6)时,红黑树会退化为链表。
18.在 JDK1.8中,HashMap的数据结构与1.7相比有什么变化,这些变化的好处在哪里?(海*科)
- 引入了红黑树来优化高冲突情况下的性能。
- 改进的扩容机制和链表与红黑树的转换机制提高了性能。
19.HashMap的get()方法的原理?(顺*)
- 根据 key 的哈希值计算索引,然后在对应的链表或红黑树中查找元素。
20.hashcode和equals区别?(海*供应链管理)
hashCode()
返回对象的哈希码,用于快速查找。equals()
方法用于比较两个对象的内容是否相等。
21.hashCode() 与 equals() 生成算法、方法怎么重写?(阿*校招)
- 重写时应保证相等的对象返回相同的哈希码,并且在 equals() 中比较所有关键字段。
22.说一下equals和==的区别,然后问equals相等hash值一定相等吗?hash值相等equals一定相等吗?(南*电网、上海*智网络)
- ==用来比较两个对象的引用是否指向同一个内存地址,而equals()比较的是两个对象的内容是否相等。equals()相等时hashCode()应该相等,但hashCode()相等时equals()不一定相等。
23.HashSet存放数据的方式?(拓*软件)
- HashSet内部使用HashMap来存储元素,元素作为键(key),值(value)是一个常量。
24.Set是如何实现元素的唯一性?(湖**利软件)
- Set接口要求所有实现类保证元素的唯一性。通过重写equals()和hashCode()方法来确保没有重复元素。
25.用哪两种方式来实现集合的排序(凡*科技)
- 可以通过实现Comparable接口来定义自然顺序,或者使用Comparator接口来定义外部排序规则。