Java面试题总结

123 阅读3分钟

一、java 中操作字符串都有哪些类?它们之间有什么区别? 1、String

String是不可变对象,每次对String类型的改变时都会生成一个新的对象。

2、StringBuilder

线程不安全,效率高,多用于单线程。

3、StringBuffer

线程安全,由于加锁的原因,效率不如StringBuilder,多用于多线程。

不频繁的字符串操作使用String,操作频繁的情况不建议使用String。

StringBuilder > StringBuffer > String。

二、说一下 HashMap 的实现原理? 1、简介 HashMap基于map接口,元素以键值对方式存储,允许有null值,HashMap是线程不安全的。

2、基本属性 初始化大小,默认16,2倍扩容; 负载因子0.75; 初始化的默认数组; size threshold。判断是否需要调整hashmap容量 3、HashMap的存储结构 JDK1.7中采用数组+链表的存储形式。

HashMap采取Entry数组来存储key-value,每一个键值对组成了一个Entry实体,Entry类时机上是一个单向的链表结构,它具有next指针,指向下一个Entry实体,以此来解决Hash冲突的问题。

HashMap实现一个内部类Entry,重要的属性有hash、key、value、next。

JDK1.8中采用数据+链表+红黑树的存储形式。当链表长度超过阈值(8)时,将链表转换为红黑树。在性能上进一步得到提升。

三、set有哪些实现类? 1、HashSet HashSet是set接口的实现类,set下面最主要的实现类就是HashSet(也就是用的最多的),此外还有LinkedHashSet和TreeSet。 HashSet是无序的、不可重复的。通过对象的hashCode和equals方法保证对象的唯一性。 HashSet内部的存储结构是哈希表,是线程不安全的。 2、TreeSet TreeSet对元素进行排序的方式:

元素自身具备比较功能,需要实现Comparable接口,并覆盖compareTo方法。 元素自身不具备比较功能,需要实现Comparator接口,并覆盖compare方法。 3、LinkedHashSet LinkedHashSet是一种有序的Set集合,即其元素的存入和输出的顺序是相同的。

四、说一下 HashSet 的实现原理? HashSet实际上是一个HashMap实例,数据存储结构都是数组+链表。

HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value都是一个统一的对象PRESENT。

private static final Object PRESENT = new Object(); HashSet中add方法调用的是底层HashMap中的put方法,put方法要判断插入值是否存在,而HashSet的add方法,首先判断元素是否存在,如果存在则插入,如果不存在则不插入,这样就保证了HashSet中不存在重复值。

通过对象的hashCode和equals方法保证对象的唯一性。

五、请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性? volatile只能作用于变量,保证了操作可见性和有序性,不保证原子性。

在Java的内存模型中分为主内存和工作内存,Java内存模型规定所有的变量存储在主内存中,每条线程都有自己的工作内存。

主内存和工作内存之间的交互分为8个原子操作:

lock unlock read load assign use store write volatile修饰的变量,只有对volatile进行assign操作,才可以load,只有load才可以use,,这样就保证了在工作内存操作volatile变量,都会同步到主内存中。

www.bilibili.com/video/BV1qL…