一、Java 基础
1.JDK 和 JRE 有什么区别?
https://www.cnblogs.com/yangming1996/p/8508187.html
2.== 和 equals 的区别是什么?
https://blog.youkuaiyun.com/qq_37358860/article/details/100149986
3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对,两个对象的 hashCode()相同,equals()不一定 true。
https://blog.youkuaiyun.com/qq_35771266/article/details/91345052
4.final 在 java 中有什么作用?
final作为Java中的关键字可以用于三个地方。用于修饰类、类属性和类方法。
特征:凡是引用final关键字的地方皆不可修改!
(1)修饰类:表示该类不能被继承;
(2)修饰方法:表示方法不能被重写;
(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。
5.java 中的 Math.round(-1.5) 等于多少?
Math.round(1.5)的返回值是2,Math.round(-1.5)的返回值是-1
6.String 属于基础的数据类型吗?
不属于。
Java 中 8 种基础的数据类型:byte、short、char、int、long、float、double、boolean
但是 String 类型却是最常用到的引用类型。
7.java 中操作字符串都有哪些类?它们之间有什么区别?
String、StringBuffer、StringBuilder
String : final修饰,String类的方法都是返回new String。即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。
StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。
StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用StringBuilder对象的append、replace、delete等方法修改字符串。
8.String str="i"与 String str=new String(“i”)一样吗?
String x = "张三";
String y = "张三";
String z = new String("张三");
System.out.println(x == y); // true
System.out.println(x == z); // false
为什么会输出上边的结果呢,String x = "张三" 的方式,Java 虚拟机会将其分配到常量池中,而常量池中没有重复的元素,比如当执行“张三”时,java虚拟机会先在常量池中检索是否已经有“张三”,如果有那么就将“张三”的地址赋给变量,如果没有就创建一个,然后在赋给变量;而 String z = new String(“张三”) 则会被分到堆内存中,即使内容一样还是会创建新的对象。
9.如何将字符串反转?
使用 StringBuilder 或 StringBuffer 的 reverse 方法,本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。
10.String 类的常用方法都有那些?
length():求字符串的长度
indexOf():求某个字符在字符串中的位置
charAt():求一个字符串中某个位置的值
equals():比较两个字符串是否相同
replace():将字符串中的某些字符用别的字符替换掉。形如replace(“abc”,”ddd”);字符串中的abc将会被ddd替换掉。
split():根据给定正则表达式的匹配拆分此字符串。形如 String s = "The time is going quickly!"; str1=s.split(" ");
substring():输出一个新的字符串,它是此字符串中的子串,形如substring(3,7);它将字符串中的第三个第四个第五个第六个输出,即输出开始(包括开始)到结束减一之间的字符串。
trim():将字符串开头的空白(空格)和尾部的空白去掉。
format():使用指定的语言环境、格式字符串和参数返回一个格式化字符串。
toLowerCase():将字符串中所有的大写改变成小写
toUpperCase():将字符串中所有的小写改变为大写
11.抽象类必须要有抽象方法吗?
https://blog.youkuaiyun.com/qq_35771266/article/details/96852793
12.普通类和抽象类有哪些区别?
- 抽象类不能被实例化
- 抽象类可以有抽象方法,抽象方法只需申明,无需实现
- 含有抽象方法的类必须申明为抽象类
- 抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类
- 抽象方法不能被声明为静态
- 抽象方法不能用private修饰
- 抽象方法不能用final修饰
13.接口和抽象类有什么区别?
https://blog.youkuaiyun.com/danteshenqu/article/details/93981157
14.java 中 IO 流分为几种?
https://blog.youkuaiyun.com/zhcswlp0625/article/details/93461137
15.Files的常用方法都有哪些?
Files.exists() 检测文件路径是否存在
Files.createFile()创建文件
Files.createDirectory()创建文件夹
Files.delete() 删除文件或者目录
Files.copy() 复制文件
Files.move() 移动文件
Files.size()查看文件个数
Files.read() 读取文件
Files.write()写入文件
二、容器
16.java 容器都有哪些?
数组,String,java.util下的集合容器
数组长度限制为 Integer.Integer.MAX_VALUE;
String的长度限制: 底层是char 数组 长度 Integer.MAX_VALUE 线程安全的
List:存放有序,列表存储,元素可重复
Set:无序,元素不可重复
Map:无序,元素可重复
17.Collection 和 Collections 有什么区别?
1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
List,Set,Queue接口都继承Collection。
直接实现该接口的类只有AbstractCollection类,该类也只是一个抽象类,提供了对集合类操作的一些基本实现。List和Set的具体实现类基本上都直接或间接的继承了该类。
2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等),大多数方法都是用来处理线性表的。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
18.List、Set、Map 之间的区别是什么?
https://blog.youkuaiyun.com/meism5/article/details/89730079
List:有序集合
Set:不重复集合,LinkedHashSet按照插入排序,SortedSet可排序,HashSet无序
Map:键值对集合
19.HashMap 和 Hashtable 有什么区别?
https://blog.youkuaiyun.com/SongYuxinIT/article/details/82013701
三、多线程
20.创建线程有哪几种方式?
https://www.cnblogs.com/tanyang/p/11176103.html
21.说一下 runnable 和 callable 有什么区别?
1、两者最大的不同点是:实现Callable接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果;
2、Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛;
https://blog.youkuaiyun.com/const_/article/details/88105721
22.线程有哪些状态?
新建、就绪、运行、阻塞、死亡
https://blog.youkuaiyun.com/qq_42928918/article/details/88794437
23.创建线程池有哪几种方式?
- newFixedThreadPool
定长线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程数量不再变化,当线程发生错误结束时,线程池会补充一个新的线程
- newCachedThreadPool
可缓存的线程池,如果线程池的容量超过了任务数,自动回收空闲线程,任务增加时可以自动添加新线程,线程池的容量不限制
- newScheduledThreadPool
定长线程池,可执行周期性的任务
- newSingleThreadExecutor
单线程的线程池,线程异常结束,会创建一个新的线程,能确保任务按提交顺序执行
- newSingleThreadScheduledExecutor
单线程可执行周期性任务的线程池
newWorkStealingPool
任务窃取线程池,不保证执行顺序,适合任务耗时差异较大。
线程池中有多个线程队列,有的线程队列中有大量的比较耗时的任务堆积,而有的线程队列却是空的,就存在有的线程处于饥饿状态,当一个线程处于饥饿状态时,它就会去其它的线程队列中窃取任务。解决饥饿导致的效率问题。
24.ThreadLocal 是什么?有哪些使用场景?
https://blog.youkuaiyun.com/meism5/article/details/90413860
25.说一下 synchronized 底层实现原理?
- 同步代码块是通过 monitorenter 和 monitorexit 指令获取线程的执行权
- 同步方法通过加 ACC_SYNCHRONIZED 标识实现线程的执行权的控制
https://blog.youkuaiyun.com/meism5/article/details/90413871
四、反射
26.什么是 java 序列化?什么情况下需要序列化?
https://blog.youkuaiyun.com/meism5/article/details/90413987
RabbitMQ
https://blog.youkuaiyun.com/weixin_41847891/article/details/100663850
Redis
https://blog.youkuaiyun.com/fangchao2011/article/details/89360306
https://www.cnblogs.com/jasontec/p/9699242.html
2020-04-23电话面试
1.说一下redis可存储的数据结构,redis的缓存方式;
2.说一下数据库的隔离级别;
3.说一下数据库中索引的用法;
4.说一下rabbitmq与kafka的区别;
5.说一下SpringBoot的启动过程;
6.说一下Arraylist与HashMap区别;
7.说一下linux中常用命令,nginx修改配置文件之后,哪个命令可以验证。
8.说一下java中锁机制。