Java一些高频面试题


一、字符串

1、为什么重写equals方法时还要重写hashCode方法?

1)equals方法判断两个对象是相等的,那这两个对象的hashCode值也要相等。
2)两个对象有相同的hashCode值,他们也不一定是相等的(哈希碰撞)。

2、StringBuilder、StringBuffer类和String类区别

1)线程安全性:

1、StringBuffer 是线程安全的,适合在多线程环境中使用。
2、StringBuilder 是非线程安全的,在单线程环境中性能更好。
3、String 对象是不可变的,其操作本身不存在线程安全问题。

2)性能:

由于 StringBuffer 为线程安全增加了同步机制,所以在单线程环境下,StringBuilder的性能通常比StringBuffer 更好。

3)可变性:

1、 String 对象一旦创建,其内容不可改变。如果对 String 进行操作,会创建新的 String 对象。
2、 StringBuilder 和StringBuffer 的对象内容是可以改变的,可以通过其提供的方法直接修改对象的内容。
3、 在大多数单线程场景下,如果需要频繁修改字符串内容,建议使用 StringBuilder ;在多线程环境中,需要保证线程安全时则使用StringBuffer 。而 String 适用于不需要修改内容的场景。

二、集合

3、ArrayList与LinkedList的区别

1)ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构。
2)当对数据进行查询操作时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
3)当对数据进行增加和删除的操作时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。

4、set集合为什么是无序的

HashSet
是基于哈希表实现的集合,其元素的存储位置是根据元素的哈希值计算得出的。哈希值的计算是一种随机的过程,不保证元素存储的顺序与添加的顺序一致

5、我们常见的ArrayList,HashSet, HashMap 的默认长度是多少,每次扩容多少

1)ArrayList:初始容量默认为10 扩容的策略通常是将当前容量增加 50%
2)HashSet:初始容量默认为16 当元素数量达到当前容量乘以负载因子(默认负载因子是 0.75 )时,就会进行扩容,例如,初始容量为 16,负载因子为0.75,那么当元素数量达到16 * 0.75 =12时,就会触发扩容操作。(扩容时,新的容量通常是原容量的两倍)
3)HashMap:同HashSet一样 因为HashSet底层是基于HashMap实现的

三、多线程

6、我们常见的集合ArrayList,HashSet, HashMap 他们是线程安全的吗?如果不安全,如何解决?

ArrayList,HashSet, HashMap都不是线程安全的
如果多个线程同时对这些集合进行操作,可能会导致数据不一致、丢失更新等问题 要解决这些集合的线程安全问题,可以采取以下几种常见的方法:
1)使用线程安全的集合类:ArrayList 替代类 Vector,HashMap 替代类 HashTable(这两个都是线程安全的,但效率不高)
2)通过 Collections 类的同步包装方法: 可以使用 Collections.synchronizedList(new ArrayList<>()) 来获取线程安全的 ArrayList
对于HashSet和HashMap,也有相应的同步包装方法(但是效率也不高)
3)使用并发集合类:List 替代类 CopyOnWriteArrayList,Set 替代类 CopyOnWriteArraySet,Map 替代类 ConcurrentHashMap(这都是线程安全的,而且效率也高)

7、创建多线程的4种方案分别是什么?

第一种方法:继承Thread类
第二种方法:实现Runnable接口
第三种方法:实现Callable接口,结合 FutureTask
第四种方法:使用线程池 ExecutorService

8、什么是多线程的虚假唤醒,虚假唤醒如何解决?

通常,线程在未满足某个条件时会进入等待状态,比如通过 Object 的 wait 方法。正常情况下,线程应该在其他线程调用 notify 或 notifyAll方法并且等待条件满足时才被唤醒。然而,由于一些不可预见的原因或错误的逻辑,线程可能会在不应该被唤醒的时候被唤醒,这就是虚假唤醒
为了解决虚假唤醒问题,通常的做法是在 wait方法所在的循环中,使用while循环始终检查等待的条件是否真正满足

9、单例模式中懒汉模式和饿汉模式的区别。

懒汉模式:在第一次使用实例时才创建实例,由于不是在类加载时创建实例,存在线程安全问题
饿汉模式:在类加载时就创建实例,因为实例在类加载时就已经创建好,所以线程安全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值