Java面试题及解答

Java面试题整理

下面一起来看 208 道面试题,具体的内容。

参考答案地址:https://www.javanav.com/interview/93b0069472fd479393006c0e73043fc4.html

一、Java 基础
0.Java的三大特性

封装、继承、多态

1.JDK 和 JRE 有什么区别?

JDK,Java Development Kit,Java开发工具包,主要面向开发人员,包含了JRE,同时包含Java源码的编译器javac,Java程序调试分析工具:jconsole,jvisualvm等。还包含了Java程序编写所需要的文档,demo例子程序。lib中包含Java的类库文件。
JRE,Java Runtime Envrionment,Java运行环境,面向Java程序的使用者,包含jvm,核心类库和支持文件。

2.== 和 equals 的区别是什么?

I、==是判断两个变量或者实例是不是指向同一个内存空间,而equals是判断两个变量或者实例所指向内存空间的值是否相等。
II、==是指对内存地址的比较,而equals是对字符串(对象)的内容的比较。
III、==是指引用是否相同,equals是指值是否相同。
img

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

首先,hashCode()是Object类的一个方法,使用native关键字修饰的,native说明该方法是原生函数,使用C/C++实现的,并且被编译成了DLL(动态链接库),由Java调用。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。
JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。

回到问题,不一定。因为类的hashCode()和equals()方法都可以重写,返回值可以自己定,也就是说两个不同的对象,经过重写hashCode()方法后,可以有一样的hashCode值,但equals()比较的结果是false;

4.final 在 java 中有什么作用?

final关键字可以用来修饰引用,类,方法。

  • 修饰引用:如果引用为基本数据类型,int,long,boolean等,则该引用为常量,该值无法修改;如果为引用数据类型,如对象,数组,则对象、数组本山可以修改,但其地址的引用不能被修改。
    如果是类的成员变量,必须当场赋值,否则编译会报错

  • 修饰方法:该方法为最终方法,无法被子类重写,但仍可以被继承

  • 修饰类:当修饰类时,该类为最终类,不能被继承,戏称为“断子绝孙”类。

5.java 中的 Math.round(-1.5) 等于多少?

java.lang.Math类中大方法

  • round 返回四舍五入的值
  • ceil 向上取整
  • floor 向下取整
6.String 属于基础的数据类型吗?

不属于。
Java中有8种基础数据类型,分别是byte,short,char,int,long,float,double,boolean
String类型是最常用到的引用类型

7.java 中操作字符串都有哪些类?它们之间有什么区别?

常用的对字符串操作的类有String,StringBuffer,StringBuilder;这三个类都是以char[]数组的形式保存字符串的,但是String类的字符串是不可变的,对String类型的字符串作修改后,相当于重新创建了新的对象。而对StringBuffer和StringBuilder进行增删操作都是对同一个对象的操作。
StringBuffer中的方法大部分是用synchronized关键字修饰的,所以StringBuffer是线程安全的,StringBuilder则没有,所以StringBuilder是线程不安全的。线程安全是通过对线程进行管理控制来实现的,所以会损失一顶的性能。(线程安全:线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全:就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。)

参考文章 Java线程安全和非线程安全<-※很通俗易懂的讲解。

扩展:ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题。面对这样的问题,回答是:ArrayList是非线程安全的,Vector是线程安全的;HashMap是非线程安全的,HashTable是线程安全的;StringBuilder是非线程安全的,StringBuffer是线程安全的。

8.String str="i"与 String str=new String(“i”)一样吗?

不一样。
首先明白Java存在一个常量值。

  • String str=“i”:在编译的时候,JVM首先会去常量池检查是否存在"i",如果不存在,则在常量池中开辟一个空间来存储"i",如果存在就不用开辟新空间,而是栈内存中开辟一个名为"str"的空间,来存储"i"在常量池中的地址;所以如果 String s1=“aaa”;String s2=“aaa”,那么s1和s2的hashCode()值是一样的;
  • String str=new String(“i”):通过new来创建String,在编译时,JVM先去常量池检查是否存在"i",不存在则在常量池中开辟空间存储"i";运行时,通过String的构造器在堆内存中new一个空间,然后将String池中的“i”复制一份存放到该堆空间中,在栈中开辟名字为str的空间,存放堆中new出来的这个String对象的地址值。
    也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象都没有创建;后者因为时new关键字,至少在内存中创建了一个对象,也有可能是两个对象。
9.如何将字符串反转?
  • 使用StringBuilder和StringBuffer的reverse()方法,本质上都调用了它们的父类AbstrctStringBuilderreverse方法
  • 自己实现
    public static String reverseString(String str) {
    	if (str != null && str.length() > 0) {
    		int len = str.length();
    		char[] chars = new char[len];
    		for (int i = len - 1; i >= 0; i--) {
    			chars[len - 1 - i] = str.charAt(i);
    		}
    		return new String(chars);
    	}
    	return str;
    }
    
10.String 类的常用方法都有那些?
  • equals:字符串的内容是否相等;
  • equalsIgnoreCase: 忽略字母大小后字符串是否相同
  • compareTo: 比较字符串Unicode字典顺序。从第一个字符比较起,若相同,则接着比较后面一个字符,以此类推
  • compareToIgnoreCase:根据字符串中每个字符的Unicode编码进行忽略大小写比较
  • indexOf: 目标字符或者字符串在源字符串中出现的下标位置,若有相同的字符或者字符串,只返回第一个出现的字符的下标,没有的话,返回-1
  • lastIndexOf: 目标字符在源字符串中最后一次出现的位置
  • valueOf: 其他类型转字符串 静态方法 String.valueOf(12)
  • charAt: 返回指定下标的字符
  • codePointAt:指定下标的字符的Unicode编码
  • concat:追加字符串到当前字符串
  • isEmpty:字符串长度是否为0
  • contains:是否包含目标字符串
  • startsWith:是否以目标字符串开头
  • endsWith:是否以目标字符串结束
  • format:格式化字符串
  • getBytes:获取字符串的字节数组
  • getChars:获取字符串的指定长度字符数组
  • toCharArray:获取字符串的字符数组
  • join:以某字符串,连接某字符串数组
  • length:字符串字符数
  • matches:字符串是否匹配正则表达式 正则表达式介绍
  • replace:字符串替换
  • replaceAll:带正则字符串替换
  • replaceFirst:替换第一个出现的目标字符串
  • split:以某正则表达式分割字符串,返回一个字符串数组
  • substring:截取字符串
  • toLowerCase:字符串转小写
  • toUpperCase:字符串转大写
  • trim:去字符串首尾空格
11.抽象类必须要有抽象方法吗?

不一定。如:

public abstract class TestAbstractClass {
	public static void notAbstractMethod() {
		System.out.println("I am not a abstract method.");
	}
}
12.普通类和抽象类有哪些区别?
  • 抽象类不能被实例化,可以用抽象方法,抽象方法只需声明,无需实现,含有抽象方法的类必须用关键字abstract声明为抽象类
  • 抽象类的子类必须实现抽象类中的所有抽象方法,否则这个子类也是抽象类
  • 抽象方法不能声明为静态,不能用private修饰,不能用final修饰
13.抽象类能使用 final 修饰吗?

不能。抽象类本身就是用来继承的,用final修饰的类不能被继承,不可修改

14.接口和抽象类有什么区别?
  • 抽象类可以有构造方法;接口中不能有构造方法;
  • 抽象类中可以有普通成员变量;接口中没有普通成员变量
  • 抽象类中可以包含非抽象普通方法;接口中的方法必须是抽象的
  • 抽象类中的抽象方法的访问权限可以是public,protected,default;接口中打抽象方法只能是public类型的,并且默认为public abstract;
  • jdk1.8以后,抽象类中可以有已实现的静态方法
  • 都可以包含静态成员变量,但抽象类中的静态成员变量可以是任意访问权限;接口中变量默认且只能是public static final
  • 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类
  • 接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开
15.java 中 IO 流分为几种?

按流格式,可以分为字符流,字节流;

  • 字节流 InputStream,OutputSream。This abstract class is the superclass of all classes representing an input /output stream of bytes(字节,就是什么类型的文件都可以读取或者写入).
  • 字符流 Reader Writer 处理字符或者字符串
  • 字节流可以用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
16.BIO、NIO、AIO 有什么区别?
  • BIO: Block IO, 同步阻塞式IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
  • NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
  • Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
  • BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
  • NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
  • AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
17.Files的常用方法都有哪些?

isExecutable:文件是否可以执行
isSameFile:是否同一个文件或目录
isReadable:是否可读
isDirectory:是否为目录
isHidden:是否隐藏
isWritable:是否可写
isRegularFile:是否为普通文件
getPosixFilePermissions:获取POSIX文件权限,windows系统调用此方法会报错
setPosixFilePermissions:设置POSIX文件权限
getOwner:获取文件所属人
setOwner:设置文件所属人
createFile:创建文件
newInputStream:打开新的输入流
newOutputStream:打开新的输出流
createDirectory:创建目录,当父目录不存在会报错
createDirectories:创建目录,当父目录不存在会自动创建
createTempFile:创建临时文件
newBufferedReader:打开或创建一个带缓存的字符输入流
probeContentType:探测文件的内容类型
list:目录中的文件、文件夹列表
find:查找文件
size:文件字节数
copy:文件复制
lines:读出文件中的所有行
move:移动文件位置
exists:文件是否存在
walk:遍历所有目录和文件
write:向一个文件写入字节
delete:删除文件
getFileStore:返回文件存储区
newByteChannel:打开或创建文件,返回一个字节通道来访问文件
readAllLines:从一个文件读取所有行字符串
setAttribute:设置文件属性的值
getAttribute:获取文件属性的值
newBufferedWriter:打开或创建一个带缓存的字符输出流
readAllBytes:从一个文件中读取所有字节
createTempDirectory:在特殊的目录中创建临时目录
deleteIfExists:如果文件存在删除文件
notExists:判断文件不存在
getLastModifiedTime:获取文件最后修改时间属性
setLastModifiedTime:更新文件最后修改时间属性
newDirectoryStream:打开目录,返回可迭代该目录下的目录流
walkFileTree:遍历文件树,可用来递归删除文件等操作

二、容器
18.java 容器都有哪些?

参考文章Java容器有哪些
img
Java容器分为Map和Collection两大类。

  • Collection又主要分为Set和List;Set分为HashSet( 基于hash实现的不重复集合,无序),LinkedHashSet( 基于hash实现的不重复集合,有序 ),和TreeSet(基于红黑树实现的可排序不重复集合);List分为ArrayList(基于数组实现的有序集合),LinkedList(基于链表实现的有序集合),Vector(矢量队列);
  • Map分为HashMap(类似Hashtable,但方法不同步,key、value可为null)和HashTable(基于哈希表实现的键值映射集合,key、value均不可为null),TreeMap;HashMap分为LinkedHashMap;
    *
19.Collection 和 Collections 有什么区别?

Collection是JDK集合层次中最根本的接口,定义了集合类的基本方法;
Collections是一个包装类,仅包含各种集合有关操作的静态方法,不能实例化;

20.List、Set、Map 之间的区别是什么?
  • List:有序集合,元素可以重复
  • Set:不重复集合,LinkedHashSet按照插入排序,SortedSet 可排序,HashSet无序;
  • Map:键值对集合,存储键、值之间的映射;Key无序,唯一;Value不要求有序,也允许重复;
21.HashMap 和 Hashtable 有什么区别?

详细区别参考文章
HashMap和Hashtable理解与对比
HashTable和HashMap的区别详解

JDK1.8中两者的主要区别是:

  • 线程安全性不同。HashMap线程不安全(我们使用线程安全的ConcurrentHashMap。ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。);HashTable中方法使用synchronized关键字修饰的,是线程安全的;
  • Key,Value是否允许空值不同。HashMap的key和value都允许为空,key只允许一个为空,HashTable的key和value都不允许为空(null);
  • 迭代器(Iterator)不同。HashMap的Iterator是fail-fast迭代器,HashTable还使用了enumerator迭代器;
  • hash值得计算方式不同。
  • 默认初始大小和扩容方式不同。HashMap默认初始大小16,容量必须是2的整数次幂,扩容时将容量变为原来的2倍;Hashtable默认初始大小11,扩容时将容量变为原来的2倍加1。
  • 是否有contains方法。HashMap没有contains方法;Hashtable包含contains方法,类似于containsValue。
  • 父类不同。HashMap继承自AbstractMap;Hashtable继承自Dictionary。
22.如何决定使用 HashMap 还是 TreeMap?

参考文章HashMap和TreeMap区别详解以及底层实现

HashMap和TreeMap区别详解以及底层实现
原创徐刘根 最后发布于2015-08-23 18:23:12 阅读数 23154  收藏
展开
前言
首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对。

HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。

HashMap 代码分析
HashMap 是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

官方文档如下:
此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。

HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。

通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。

如果很多映射关系要存储在 HashMap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。

注意,此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。(结构上的修改是指添加或删除一个或多个映射关系的任何操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:

Map m = Collections.synchronizedMap(new HashMap(…));
由所有此类的“collection 视图方法”所返回的迭代器都是快速失败 的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器本身的 remove 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒在将来不确定的时间发生任意不确定行为的风险。

Map.put()的时候,需要将key值映射为相应的hash值,key的值是以char数组的形式存放的,value对应的值也是有char数组存放的





在进行存放的时候,首先检查table是否为空,如果为空使用inflateTable方法进行初始化操作。

这里用到的hash方法如下:


Map.get()的时候,是根据hash值进行查找的:




然后就是调用hash方法,找到具体的key所对应的hash,然后再到entry中去找value

TreeMap代码分析


看到上边,可知TreeMap并不是基于hash实现的,据说是红黑树,红黑树这块几乎空白,不敢多说:

TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
  (1)TreeMap():构建一个空的映像树
  (2)TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素
  (3)TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序
  (4)TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序。

官方文档:
基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

此实现为 containsKey、get、put 和 remove 操作提供受保证的 log(n) 时间开销。这些算法是 Cormen、Leiserson 和 Rivest 的 Introduction to Algorithms 中的算法的改编。

注意,如果要正确实现 Map 接口,则有序映射所保持的顺序(无论是否明确提供了比较器)都必须与 equals 一致。(关于与 equals 一致 的精确定义,请参阅 Comparable 或 Comparator)。这是因为 Map 接口是按照 equals 操作定义的,但有序映射使用它的 compareTo(或 compare)方法对所有键进行比较,因此从有序映射的观点来看,此方法认为相等的两个键就是相等的。即使排序与 equals 不一致,有序映射的行为仍然是 定义良好的,只不过没有遵守 Map 接口的常规协定。

注意,此实现不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。(结构上的修改是指添加或删除一个或多个映射关系的操作;仅改变与现有键关联的值不是结构上的修改。)这一般是通过对自然封装该映射的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSortedMap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的不同步访问,如下所示:

SortedMap m = Collections.synchronizedSortedMap(new TreeMap(…));
collection(由此类所有的“collection 视图方法”返回)的 iterator 方法返回的迭代器都是快速失败 的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器自身的 remove 方法,否则在其他任何时间以任何方式进行修改都将导致迭代器抛出 ConcurrentModificationException。因此,对于并发的修改,迭代器很快就完全失败,而不会冒着在将来不确定的时间发生不确定行为的风险。

HashMap和TreeMap比较
(1)HashMap:适用于在Map中插入、删除和定位元素。
(2)Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
(3)HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap.
(4)HashMap 非线程安全 TreeMap 非线程安全
(5)HashMap的结果是没有排序的,而TreeMap输出的结果是排好序的。

 在HashMap中通过get()来获取value,通过put()来插入value,ContainsKey()则用来检验对象是否已经存在。可以看出,和ArrayList的操作相比,HashMap除了通过key索引其内容之外,别的方面差异并不大。
————————————————
版权声明:本文为CSDN博主「徐刘根」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xlgen157387/article/details/47907721
23.说一下 HashMap 的实现原理?

文章hashmap
HashMap 基于 Hash 算法实现,通过 put(key,value) 存储,get(key) 来获取 value
当传入 key 时,HashMap 会根据 key,调用 hash(Object key) 方法,计算出 hash 值,根据 hash 值将 value 保存在 Node 对象里,Node 对象保存在数组里
当计算出的 hash 值相同时,称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value
当 hash 冲突的个数:小于等于 8 使用链表;大于 8 时,使用红黑树解决链表查询慢的问题

ps:

上述是 JDK 1.8 HashMap 的实现原理,并不是每个版本都相同,比如 JDK 1.7 的 HashMap 是基于数组 + 链表实现,所以 hash 冲突时链表的查询效率低
hash(Object key) 方法的具体算法是 (h = key.hashCode()) ^ (h >>> 16),经过这样的运算,让计算的 hash 值分布更均匀

24.说一下 HashSet 的实现原理?

HashSet实际上是一个HashMap实例,都是一个存放链表的数组。它不保证存储元素的迭代顺序;此类允许使用null元素。HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个固定对象private static final Object PRESENT = new Object();
HashSet中add方法调用的是底层HashMap中的put()方法,而如果是在HashMap中调用put,首先会判断key是否存在,如果key存在则修改value值,如果key不存在这插入这个key-value。而在set中,因为value值没有用,也就不存在修改value值的说法,因此往HashSet中添加元素,首先判断元素(也就是key)是否存在,如果不存在这插入,如果存在着不插入,这样HashSet中就不存在重复值。
所以判断key是否存在就要重写元素的类的equals()和hashCode()方法,当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算次对象的哈希值,此哈希值决定了此对象在Set中存放的位置;若此位置没有被存储对象则直接存储,若已有对象则通过对象所在类的equals()比较两个对象是否相同,相同则不能被添加。

JAVA集合Set之HashSet详解

25.ArrayList 和 LinkedList 的区别是什么?

• 数据结构实现:
ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
• 随机访问效率:
ArrayList 比 LinkedList 在随机访问的时候效率要高,
因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
• 增加和删除效率:
在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,
因为 ArrayList 增删操作要影响数组内的其他数据的下标。
• 综合来说:
在需要频繁读取集合中的元素时,更推荐使用 ArrayList,
而在插入和删除操作较多时,更推荐使用 LinkedList。

Hashmap 和CocurrentHashMap详解

HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!

26.如何实现数组和 List 之间的转换?
27.ArrayList 和 Vector 的区别是什么?
28.Array 和 ArrayList 有何区别?
29.在 Queue 中 poll()和 remove()有什么区别?
30.哪些集合类是线程安全的?
31.迭代器 Iterator 是什么?
32.Iterator 怎么使用?有什么特点?
33.Iterator 和 ListIterator 有什么区别?
34.怎么确保一个集合不能被修改?

三、多线程

35.并行和并发有什么区别?

36.线程和进程的区别?

37.守护线程是什么?

38.创建线程有哪几种方式?

39.说一下 runnable 和 callable 有什么区别?

40.线程有哪些状态?

41.sleep() 和 wait() 有什么区别?

42.notify()和 notifyAll()有什么区别?

43.线程的 run()和 start()有什么区别?

44.创建线程池有哪几种方式?

45.线程池都有哪些状态?

46.线程池中 submit()和 execute()方法有什么区别?

47.在 java 程序中怎么保证多线程的运行安全?

48.多线程锁的升级原理是什么?

49.什么是死锁?

50.怎么防止死锁?

51.ThreadLocal 是什么?有哪些使用场景?

52.说一下 synchronized 底层实现原理?

53.synchronized 和 volatile 的区别是什么?

54.synchronized 和 Lock 有什么区别?

55.synchronized 和 ReentrantLock 区别是什么?

56.说一下 atomic 的原理?

四、反射

57.什么是反射?

58.什么是 java 序列化?什么情况下需要序列化?

59.动态代理是什么?有哪些应用?

60.怎么实现动态代理?

五、对象拷贝

61.为什么要使用克隆?

62.如何实现对象克隆?

63.深拷贝和浅拷贝区别是什么?

六、Java Web

64.jsp 和 servlet 有什么区别?

65.jsp 有哪些内置对象?作用分别是什么?

66.说一下 jsp 的 4 种作用域?

67.session 和 cookie 有什么区别?

68.说一下 session 的工作原理?

69.如果客户端禁止 cookie 能实现 session 还能用吗?

70.spring mvc 和 struts 的区别是什么?

71.如何避免 sql 注入?

72.什么是 XSS 攻击,如何避免?

73.什么是 CSRF 攻击,如何避免?

七、异常

74.throw 和 throws 的区别?

75.final、finally、finalize 有什么区别?

76.try-catch-finally 中哪个部分可以省略?

77.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

78.常见的异常类有哪些?

八、网络

79.http 响应码 301 和 302 代表的是什么?有什么区别?

80.forward 和 redirect 的区别?

81.简述 tcp 和 udp的区别?

82.tcp 为什么要三次握手,两次不行吗?为什么?

83.说一下 tcp 粘包是怎么产生的?

84.OSI 的七层模型都有哪些?

85.get 和 post 请求有哪些区别?

86.如何实现跨域?

87.说一下 JSONP 实现原理?

九、设计模式

88.说一下你熟悉的设计模式?
设计模式详解
JAVA设计模式总结之23种设计模式

89.简单工厂和抽象工厂有什么区别?

十、Spring/Spring MVC

90.为什么要使用 spring?

91.解释一下什么是 aop?

92.解释一下什么是 ioc?

93.spring 有哪些主要模块?

94.spring 常用的注入方式有哪些?

95.spring 中的 bean 是线程安全的吗?

96.spring 支持几种 bean 的作用域?

97.spring 自动装配 bean 有哪些方式?

98.spring 事务实现方式有哪些?

99.说一下 spring 的事务隔离?

100.说一下 spring mvc 运行流程?

101.spring mvc 有哪些组件?

102.@RequestMapping 的作用是什么?

103.@Autowired 的作用是什么?

十一、Spring Boot/Spring Cloud

104.什么是 spring boot?

105.为什么要用 spring boot?

106.spring boot 核心配置文件是什么?

107.spring boot 配置文件有哪几种类型?它们有什么区别?

108.spring boot 有哪些方式可以实现热部署?

109.jpa 和 hibernate 有什么区别?

110.什么是 spring cloud?

111.spring cloud 断路器的作用是什么?

112.spring cloud 的核心组件有哪些?

十二、Hibernate

113.为什么要使用 hibernate?

114.什么是 ORM 框架?

115.hibernate 中如何在控制台查看打印的 sql 语句?

116.hibernate 有几种查询方式?

117.hibernate 实体类可以被定义为 final 吗?

118.在 hibernate 中使用 Integer 和 int 做映射有什么区别?

119.hibernate 是如何工作的?

120.get()和 load()的区别?

121.说一下 hibernate 的缓存机制?

122.hibernate 对象有哪些状态?

123.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?

124.hibernate 实体类必须要有无参构造函数吗?为什么?

十三、Mybatis

125.mybatis 中 #{}和 ${}的区别是什么?

126.mybatis 有几种分页方式?

127.RowBounds 是一次性查询全部结果吗?为什么?

128.mybatis 逻辑分页和物理分页的区别是什么?

129.mybatis 是否支持延迟加载?延迟加载的原理是什么?

130.说一下 mybatis 的一级缓存和二级缓存?

131.mybatis 和 hibernate 的区别有哪些?

132.mybatis 有哪些执行器(Executor)?

133.mybatis 分页插件的实现原理是什么?

134.mybatis 如何编写一个自定义插件?

十四、RabbitMQ

135.rabbitmq 的使用场景有哪些?

136.rabbitmq 有哪些重要的角色?

137.rabbitmq 有哪些重要的组件?

138.rabbitmq 中 vhost 的作用是什么?

139.rabbitmq 的消息是怎么发送的?

140.rabbitmq 怎么保证消息的稳定性?

141.rabbitmq 怎么避免消息丢失?

142.要保证消息持久化成功的条件有哪些?

143.rabbitmq 持久化有什么缺点?

144.rabbitmq 有几种广播类型?

145.rabbitmq 怎么实现延迟消息队列?

146.rabbitmq 集群有什么用?

147.rabbitmq 节点的类型有哪些?

148.rabbitmq 集群搭建需要注意哪些问题?

149.rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?

150.rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况?

151.rabbitmq 对集群节点停止顺序有要求吗?

十五、Kafka

152.kafka 可以脱离 zookeeper 单独使用吗?为什么?

153.kafka 有几种数据保留的策略?

154.kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?

155.什么情况会导致 kafka 运行变慢?

156.使用 kafka 集群需要注意什么?

十六、Zookeeper

157.zookeeper 是什么?

158.zookeeper 都有哪些功能?

159.zookeeper 有几种部署模式?

160.zookeeper 怎么保证主从节点的状态同步?

161.集群中为什么要有主节点?

162.集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?

163.说一下 zookeeper 的通知机制?

十七、MySql

164.数据库的三范式是什么?

165.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

166.如何获取当前数据库版本?

167.说一下 ACID 是什么?

168.char 和 varchar 的区别是什么?

169.float 和 double 的区别是什么?

170.mysql 的内连接、左连接、右连接有什么区别?

171.mysql 索引是怎么实现的?

172.怎么验证 mysql 的索引是否满足需求?

173.说一下数据库的事务隔离?

174.说一下 mysql 常用的引擎?

175.说一下 mysql 的行锁和表锁?

176.说一下乐观锁和悲观锁?

177.mysql 问题排查都有哪些手段?

178.如何做 mysql 的性能优化?

十八、Redis

179.redis 是什么?都有哪些使用场景?

180.redis 有哪些功能?

181.redis 和 memecache 有什么区别?

182.redis 为什么是单线程的?

183.什么是缓存穿透?怎么解决?

184.redis 支持的数据类型有哪些?

185.redis 支持的 java 客户端都有哪些?

186.jedis 和 redisson 有哪些区别?

187.怎么保证缓存和数据库数据的一致性?

188.redis 持久化有几种方式?

189.redis 怎么实现分布式锁?

190.redis 分布式锁有什么缺陷?

191.redis 如何做内存优化?

192.redis 淘汰策略有哪些?

193.redis 常见的性能问题有哪些?该如何解决?

十九、JVM

194.说一下 jvm 的主要组成部分?及其作用?

195.说一下 jvm 运行时数据区?

196.说一下堆栈的区别?

197.队列和栈是什么?有什么区别?

198.什么是双亲委派模型?

199.说一下类加载的执行过程?

200.怎么判断对象是否可以被回收?

201.java 中都有哪些引用类型?

202.说一下 jvm 有哪些垃圾回收算法?

203.说一下 jvm 有哪些垃圾回收器?

204.详细介绍一下 CMS 垃圾回收器?

205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

206.简述分代垃圾回收器是怎么工作的?

207.说一下 jvm 调优的工具?

208.常用的 jvm 调优的参数都有哪些?

————————————————
版权声明:本文为CSDN博主「王磊的博客」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sufu1065/article/details/88051083

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值