响应式网站和展示式区别,h5页面 个人网站,西安招聘网站,彩票网站开发制作平台软件大数据开发#xff08;Java面试真题#xff09; 1、简要介绍以下JVM有几种垃圾收集器#xff1f;2、Java中Synchronized的底层原理是什么#xff1f;3、Java String为什么是不可变的#xff1f;为什么要设计成不可变#xff1f;4、泛型#xff1f;5、常用的反射方法Java面试真题 1、简要介绍以下JVM有几种垃圾收集器2、Java中Synchronized的底层原理是什么3、Java String为什么是不可变的为什么要设计成不可变4、泛型5、常用的反射方法6、Java集合类型7、HashMap原理转换成红黑树条件为什么这么设计8、Java线程安全的HashMapConcurrentHashMap和HashTable的区别ConcurrentHashMap原理 1、简要介绍以下JVM有几种垃圾收集器
Serial收集器Serial收集器是JVM中最古老的一种垃圾回收器它以单线程方式进行垃圾收集工作适用于小型或者单核处理器的应用场景。Parallel收集器Parallel收集器是Serial收集器的改进版本它使用多线程进行垃圾收集提高了垃圾收集的效率适用于多核处理器的应用常见。CMS收集器CMS收集器是一种以获取最短回收停顿时间为目标的收集器它通过并发的方式进行垃圾收集能够在主程序运行的同时进行垃圾收集适用于对响应时间有较高要求的应用场景。G1收集器G1收集器是一种面向服务端应用的垃圾收集器它将堆内存划分为多个区域并根据垃圾产生情况优先回收垃圾角度的区域可以达到较低的停顿时间和更好的吞吐量。
2、Java中Synchronized的底层原理是什么
Synchronized是Java中用于实现线程同步的关键字它的底层原理是通过对象监视器也称为内部锁或监视锁来实现的。 当一个线程进入synchronized代码块时它会尝试获取对应对象的监视器。如果该监视器没有被其它线程占用则该线程获取到监视器并执行代码块中的逻辑。如果监视器已经被其它线程占用该线程就会进入阻塞状态等待监视器的释放。 在Java虚拟机中每个对象都有一个与之关联的监视器锁。当一个线程获取到该对象的监视器锁时其它线程就无法同时获取该对象的监视器锁它们会被阻塞直到锁被释放。 在方法上适用synchronized关键字时它会对该方法的整个代码块进行加锁以保证同一时间只有一个线程可以执行该方法。而在代码块上使用synchronized关键字时它只会对该代码块进行加锁其它线程仍然可以同时执行其它非同步代码块。 需要注意的是synchronized关键字会引入一定的性能开销因为每次进入synchronized代码块或方法时都会进行加锁或解锁的操作。因此在使用synchronized时需要权衡线程安全和性能之间的平衡。
3、Java String为什么是不可变的为什么要设计成不可变
Java中的String是不可变的这是因为String类被设计成了不可变的对象。这意味着一旦一个String对象被创建它的值就不能被修改。
不可变有以下几个原因
线程安全不可变的特性使得String对象在多线程环境中是安全的。因为它的值不可变不会被其它线程修改所以不需要同步控制。缓存哈希值String类将哈希值缓存在对象中因为它是不可变的所以哈希值只需要计算一次而不需要每次使用时重新计算。这样可以提高性能。字符串池Java中的字符串池是为了节省内存而设计的。不可变的String对象可以被共享并重复使用避免了创建多个相同值得字符串对象。这样可以减少内存占用提高性能。安全性字符串作为参数传递给一些敏感得API时不可变的特性可以确保参数的值不会被修改从而保证数据的安全性。
综述所述Java中的String被设计成不可变的主要是为了提高性能、确保线程安全以及节省内存。
4、泛型
泛型是Java中一种参数化类型的概念它允许我们在编写类、接口和方法时使用未知的数据类型。通过使用泛型我们可以创建通用的代码可以在不同的数据类型上进行操作提高代码的复用性和类型安全性。泛型使用尖括号来定义可以用于类、接口和方法的声明和实例化中。在使用泛型时可以指定具体的数据类型也可以使用通配符来表示未知的数据类型。
5、常用的反射方法
常用的反射方法有
获取Class对象通过Class.forName()对象.getClass()、类名.class等方式获取一个类的Class对象。创建实例通过Class对象的newInstance()方法创建类的实例。获取类的成员变量通过Class对象的getField()、getDeclaredField()等方法获取类的公共或私有成员变量。获取类的方法通过Class对象的getMethod()、getDeclaredMethod()等方法获取类的公共或私有方法。调用方法通过Method对象的invoke()方法调用方法。修改成员变量的值通过Field对象的set()方法修改成员变量的值。调用构造函数通过Class对象的getConstructor()、getDeclaredConstructor()等方法获取类的公共或私有构造函数并通过Constructor对象的newInstance()方法创建类的实例。 这些方法可以在运行时动态地获取和操作类的信息使得我们可以在不知道具体类名地情况下通过反射机制来调用类地方法、访问成员变量等。
6、Java集合类型
Java集合类型有以下几种
List列表List是一个有序的集合可以包含重复元素。常见的实现类有ArrayList和LinkedList。Set集合Set是一个不允许重复元素的集合。常见的实现类有HashSet和TreeSet。Map映射Map是一种键值对的集合每个键只能对应一个值。常见的实现类有HashMap和TreeMap。Queue队列Queue是一种先进先出FIFO的集合。常见的实现类有LinkedList和PriorityQueue。Stack栈Stack是一种后进先出的集合。常见的实现类有Stack。Vector向量Vector是一个动态数组与ArrayList类似但是它是线程安全的。
7、HashMap原理转换成红黑树条件为什么这么设计
HashMap是Java中常见的一种数据结构它基于哈希表实现。具体原理如下
HashMap内部由一个数组和链表或红黑树组成。数组是HashMap的主体用于存储键值对。链表和红黑树用于解决哈希冲突提高查找效率。当添加一个键值对到HashMap中时首先根据键的hashCode()方法计算出一个哈希值然后通过哈希值与数组长度取模得到在数组中的位置。如果该位置上已经存在其它键值对就发生了哈希冲突。如果发生哈希冲突会在该位置上的链表或红黑树上顺序查找键值对。如果键已经存在则更新对应的值。如果键不存在则在链表或红黑树的末尾添加新的键值对。当链表长度超过阈值默认为8时链表会转换为红黑树。
转换为红黑树的条件如下 -当链表长度达到8时且当前数组长度大于等于64HashMap会将链表转换为红黑树。 -当红黑树节点数量小于等于6时HashMap会将红黑树转换为链表。
这样设计的原因是当链表长度过长时查找效率会降低因为需要遍历链表进行查找。而红黑树相比链表具有更高效的查找、插入和删除操作能够更好地提高HashMap的性能。同时对于较小的链表转换为红黑树的开销反而比链表更大所以在节点数量小于等于6时会将红黑树转换回链表以节省内存空间。
8、Java线程安全的HashMapConcurrentHashMap和HashTable的区别ConcurrentHashMap原理
Java线程安全的HashMap可以使用ConcurrentHashMap来实现。ConcurrentHashMap是Java并发包中的一个线程安全的哈希表实现它比传统的HashTable和同步的HashMap具有更好的并发性能。 ConcurrentHashMap和HashTable的区别如下
锁机制ConcurrentHashMap使用了分段锁Segment每个Segment相当于一个小的HashTable只锁住当前操作的Segement而不是整个HashTable而HashTable在每次操作时都锁住整个HashTable。并发性ConcurrentHashMap允许多个线程同时读取而写操作会锁住相关的Segment使得在并发写入时性能更好HashTable在写操作时需要锁住整个HashTable导致并发写入性能较差。扩容机制ConcurrentHashMap在扩容时只需要锁住相关的Segment不影响其它Segment的读写操作提高了并发性能HashTable在扩容时需要锁住整个HashTable导致其它线程无法读写性能较差。
ConcurrentHashMap的原理是基于分段锁Segment实现的。它将整个哈希表分成多个小的HashTableSegment每个Segment独立地进行锁定和扩容操作。这样可以提高并发性能允许多个线程同时读取而写操作只需要锁定相关地Segment不影响其它Segment的读写操作。同时ConcurrentHashMap使用CAS算法来保证并发操作的一致性和线程安全性。