大数据开发(Java面试真题-卷三)

1、简要介绍以下JVM有几种垃圾收集器?

  1. Serial收集器:Serial收集器是JVM中最古老的一种垃圾回收器,它以单线程方式进行垃圾收集工作,适用于小型或者单核处理器的应用场景。
  2. Parallel收集器:Parallel收集器是Serial收集器的改进版本,它使用多线程进行垃圾收集,提高了垃圾收集的效率,适用于多核处理器的应用常见。
  3. CMS收集器:CMS收集器是一种以获取最短回收停顿时间为目标的收集器,它通过并发的方式进行垃圾收集,能够在主程序运行的同时进行垃圾收集,适用于对响应时间有较高要求的应用场景
  4. G1收集器:G1收集器是一种面向服务端应用的垃圾收集器,它将堆内存划分为多个区域,并根据垃圾产生情况优先回收垃圾角度的区域,可以达到较低的停顿时间和更好的吞吐量。

2、Java中Synchronized的底层原理是什么?

Synchronized是Java中用于实现线程同步的关键字,它的底层原理是通过对象监视器(也称为内部锁或监视锁)来实现的。
当一个线程进入synchronized代码块时,它会尝试获取对应对象的监视器。如果该监视器没有被其它线程占用,则该线程获取到监视器并执行代码块中的逻辑。如果监视器已经被其它线程占用,该线程就会进入阻塞状态,等待监视器的释放
在Java虚拟机中,每个对象都有一个与之关联的监视器锁。当一个线程获取到该对象的监视器锁时,其它线程就无法同时获取该对象的监视器锁,它们会被阻塞直到锁被释放。
在方法上适用synchronized关键字时,它会对该方法的整个代码块进行加锁,以保证同一时间只有一个线程可以执行该方法。而在代码块上使用synchronized关键字时,它只会对该代码块进行加锁,其它线程仍然可以同时执行其它非同步代码块
需要注意的是,synchronized关键字会引入一定的性能开销,因为每次进入synchronized代码块或方法时,都会进行加锁或解锁的操作。因此,在使用synchronized时需要权衡线程安全和性能之间的平衡。

3、Java String为什么是不可变的?为什么要设计成不可变?

Java中的String是不可变的,这是因为String类被设计成了不可变的对象。这意味着一旦一个String对象被创建,它的值就不能被修改。

不可变有以下几个原因:

  1. 线程安全:不可变的特性使得String对象在多线程环境中是安全的。因为它的值不可变,不会被其它线程修改,所以不需要同步控制
  2. 缓存哈希值:String类将哈希值缓存在对象中,因为它是不可变的,所以哈希值只需要计算一次,而不需要每次使用时重新计算。这样可以提高性能。
  3. 字符串池:Java中的字符串池是为了节省内存而设计的。不可变的String对象可以被共享并重复使用,避免了创建多个相同值得字符串对象。这样可以减少内存占用,提高性能。
  4. 安全性:字符串作为参数传递给一些敏感得API时,不可变的特性可以确保参数的值不会被修改,从而保证数据的安全性。

综述所述,Java中的String被设计成不可变的主要是为了提高性能、确保线程安全以及节省内存

4、泛型?

泛型是Java中一种参数化类型的概念,它允许我们在编写类、接口和方法时使用未知的数据类型。通过使用泛型,我们可以创建通用的代码,可以在不同的数据类型上进行操作,提高代码的复用性和类型安全性。泛型使用尖括号<>来定义,可以用于类、接口和方法的声明和实例化中。在使用泛型时,可以指定具体的数据类型,也可以使用通配符来表示未知的数据类型

5、常用的反射方法?

常用的反射方法有:

  1. 获取Class对象:通过Class.forName(),对象.getClass()、类名.class等方式获取一个类的Class对象。
  2. 创建实例:通过Class对象的newInstance()方法创建类的实例。
  3. 获取类的成员变量:通过Class对象的getField()、getDeclaredField()等方法获取类的公共或私有成员变量。
  4. 获取类的方法:通过Class对象的getMethod()、getDeclaredMethod()等方法获取类的公共或私有方法。
  5. 调用方法:通过Method对象的invoke()方法调用方法。
  6. 修改成员变量的值:通过Field对象的set()方法修改成员变量的值。
  7. 调用构造函数:通过Class对象的getConstructor()、getDeclaredConstructor()等方法获取类的公共或私有构造函数,并通过Constructor对象的newInstance()方法创建类的实例。
    这些方法可以在运行时动态地获取和操作类的信息,使得我们可以在不知道具体类名地情况下,通过反射机制来调用类地方法、访问成员变量等

6、Java集合类型?

Java集合类型有以下几种:

  1. List(列表):List是一个有序的集合,可以包含重复元素。常见的实现类有ArrayList和LinkedList。
  2. Set(集合):Set是一个不允许重复元素的集合。常见的实现类有HashSet和TreeSet。
  3. Map(映射):Map是一种键值对的集合,每个键只能对应一个值。常见的实现类有HashMap和TreeMap。
  4. Queue(队列):Queue是一种先进先出(FIFO)的集合。常见的实现类有LinkedList和PriorityQueue。
  5. Stack(栈):Stack是一种后进先出的集合。常见的实现类有Stack。
  6. Vector(向量):Vector是一个动态数组,与ArrayList类似,但是它是线程安全的。

7、HashMap原理?转换成红黑树条件?为什么这么设计?

HashMap是Java中常见的一种数据结构,它基于哈希表实现。具体原理如下:

  1. HashMap内部由一个数组和链表(或红黑树)组成。数组是HashMap的主体,用于存储键值对。链表和红黑树用于解决哈希冲突,提高查找效率。
  2. 添加一个键值对到HashMap中时,首先根据键的hashCode()方法计算出一个哈希值,然后通过哈希值与数组长度取模,得到在数组中的位置。如果该位置上已经存在其它键值对,就发生了哈希冲突
  3. 如果发生哈希冲突,会在该位置上的链表或红黑树上顺序查找键值对。如果键已经存在,则更新对应的值。如果键不存在,则在链表或红黑树的末尾添加新的键值对
  4. 链表长度超过阈值(默认为8)时,链表会转换为红黑树

转换为红黑树的条件如下:
-当链表长度达到8时,且当前数组长度大于等于64,HashMap会将链表转换为红黑树。
-当红黑树节点数量小于等于6时,HashMap会将红黑树转换为链表

这样设计的原因是,当链表长度过长时,查找效率会降低,因为需要遍历链表进行查找。而红黑树相比链表,具有更高效的查找、插入和删除操作,能够更好地提高HashMap的性能。同时,对于较小的链表,转换为红黑树的开销反而比链表更大,所以在节点数量小于等于6时,会将红黑树转换回链表,以节省内存空间

8、Java线程安全的HashMap?ConcurrentHashMap和HashTable的区别?ConcurrentHashMap原理?

Java线程安全的HashMap可以使用ConcurrentHashMap来实现。ConcurrentHashMap是Java并发包中的一个线程安全的哈希表实现,它比传统的HashTable和同步的HashMap具有更好的并发性能
ConcurrentHashMap和HashTable的区别如下:

  1. 锁机制ConcurrentHashMap使用了分段锁(Segment),每个Segment相当于一个小的HashTable,只锁住当前操作的Segement而不是整个HashTable;而HashTable在每次操作时都锁住整个HashTable
  2. 并发性ConcurrentHashMap允许多个线程同时读取,而写操作会锁住相关的Segment,使得在并发写入时性能更好;HashTable在写操作时需要锁住整个HashTable,导致并发写入性能较差。
  3. 扩容机制ConcurrentHashMap在扩容时只需要锁住相关的Segment,不影响其它Segment的读写操作,提高了并发性能;HashTable在扩容时需要锁住整个HashTable,导致其它线程无法读写,性能较差。

ConcurrentHashMap的原理是基于分段锁(Segment)实现的。它将整个哈希表分成多个小的HashTable(Segment),每个Segment独立地进行锁定和扩容操作。这样可以提高并发性能,允许多个线程同时读取,而写操作只需要锁定相关地Segment,不影响其它Segment的读写操作。同时ConcurrentHashMap使用CAS算法来保证并发操作的一致性和线程安全性。

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Key-Key

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值