一、Java基础 44 道
1. 解释下什么是面向对象?面向对象和面向过程的区别?
面向对象是一种基于面向过程的编程思想,是向现实世界模型的自然延伸,在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例
区别:
1、编程思路不同:面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、执行方法来完成功能。
2、封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。
3、面向对象具有继承性和多态性,而面向过程没有继承性和多态性,所以面向对象优势很明显。
2. 面向对象的三大特性?分别解释下?
封装
保护信息,聚合内容
类的创建就是封装的体现
属性的封装:私有属性,公有方法
继承
把多个类相同的内容抽取到父类中,形成继承关系
能不用就不用
单继承
多态
一种名称具备多种形态
3. JDK、JRE、JVM 三者之间的关系?
JVM(Java Virtual Machine)虚拟机:使用软件在不同操作系统中,模拟相同的环境。
JRE(Java Runtime Environment)运行环境:包含JVM和解释器,完整的Java运行环境。
JDK(Java Development Kit)开发环境:包含JRE + 类库 + 开发工具包(编译器+调试工具)。
JDK(开发环境)--->JRE(运行环境)--->JVM(虚拟机)
4. 重载和重写的区别?
重载:同一个类中,方法名相同,形式参数不同
重写:在子类中,可以对父类的方法进行重写,不能比父类的更严格
5. Java 中是否可以重写一个 private 或者 static 方法?
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法类的任何实例都不相关,所以概念上不适用。
Java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖
6. 构造方法有哪些特性?
- 名字与类名相同。
- 没有返回值,但不能用 void 声明构造函数。
- 生成类的对象时自动执行,无需调用。
7. 在 Java 中定义一个不做事且没有参数的构造方法有什么作用?
Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定 的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定 义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类 中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没 有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数 的构造方法。
8. Java 中创建对象的几种方式?
使用new关键字
使用Class类的newInstance方法
使用Constructor类的newInstance方法
使用clone方法
使用反序列化
9. 抽象类和接口有什么区别?
- 从方法上来说,抽象类中的方法可以为抽象方法也可以是非抽象方法,接口中的方法只能够是抽象方法,抽象类的抽象方法没有方法体,接口的抽象方法在jdk1.8中是可以有方法体的。
- 抽象类的变量没有final修饰,接口中的变量都被public static final修饰。
- 抽象类只能够单继承,他的子类不用重写其全部方法,接口能够实现多实现,他的实现类必须重写其全部方法。
10. 静态变量和实例变量的区别?
静态变量前面需要加 static 关键字,而实例变量不需要
实例变量属于某一个类的属性,如果要使用必须创建该类的实例来引用,而静态变量属于整个类,只要程序加载了该类的字节码,就可直接使用。
11. short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?
s1是short类型的,s1+1是int类型的,int类型转化为short需要强制转换
没有,根据查找的java规范,a+=b 实际上是 (T1) a=(T1)(a+b), 那么short s1 = 1; s1 += 1; 实际上是 s1 = (short) (s1 + 1),java 编译器对它特殊处理了
12. Integer 和 int 的区别?
Integer是int的包装类,int则是java的一种基本数据类型
Integer变量必须实例化后才能使用,而int变量不需要
Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
Integer的默认值是null,int的默认值是0
13. 装箱和拆箱的区别
装箱是将值类型装换成引用类型的过程;拆箱就是将引用类型转换成值类型的过程;
14. switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
switch可作用于char byte short int
switch可作用于char byte short int对应的包装类
switch不可作用于long double float boolean,包括他们的包装类
switch中可以是字符串类型,String(jdk1.7之后才可以作用在string上)
switch中可以是枚举类型
15. final、finally、finalize 的区别
final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
16. == 和 equals 的区别?
==比较基本数据类型 比较的是值
==比较引用数据类型 比较的是地址
equals本身也比较地址
但是我们可以重写按照我们自己的比较规则来比较内容
17. 两个对象的 hashCode() 相同,则 equals() 也一定为 true 吗?
18. 为什么重写 equals() 就一定要重写 hashCode() 方法?
19. & 和 && 的区别?
&---与 要求多个表达式同时都成立,结果才为真,唯独没有短路的效果,不管第一个表达式结果如何,都将执行完所有的表达式
&&---短路与 要求多个表达式同时都成立,结果才为真,有短路的效果,如果第一个表达式不成立,后续的表达式将不再执行
20. Java 中的参数传递时传值呢?还是传引用?
当基本数据类型作为参数传递时,传的是值的拷贝,对形参的操作并不会影响原来的数据
当引用数据类型作为参数传递时,传的是地址,所以会影响原来的内容,因为相当于两个或者多个变量中保存的是相同的地址(可以理解为形参和实参指向了相同的地址)
21. Java 中的 Math.round(-1.5) 等于多少?
Math.round(-1.5)的值为-1,round()是四舍五入;Math.round(1.5)的值是2,Math.round(-1.5)的值是-1
22. 如何实现对象的克隆?
、、、
23. 深克隆和浅克隆的区别?
、、
24. 什么是 Java 的序列化,如何实现 Java 的序列化?
、、
25. 什么情况下需要序列化?
、、、
26. Java 的泛型是如何工作的 ? 什么是类型擦除 ?
、、、、
27. 什么是泛型中的限定通配符和非限定通配符 ?
、、、、
28. List 和 Set 之间有什么区别 ?
、、、、
29. Java 中的反射是什么意思?有哪些应用场景?
、、、、
30. 反射的优缺点?
、、、、
31. Java 中的动态代理是什么?有哪些应用?
、、、、
32. 怎么实现动态代理?
、、、、
33. static 关键字的作用?
、、、、
34. super 关键字的作用?
、、、、
35. 字节和字符的区别?
、、、、
36. String 为什么要设计为不可变类?
、、、、
37. String、StringBuilder、StringBuffer 的区别?
、、、、
38. String 字符串修改实现的原理?
、、、、
39. String str = "i" 与 String str = new String("i") 一样吗?
、、、、
40. String 类的常用方法都有那些?
、、、、
41. final 修饰 StringBuffer 后还可以 append 吗?
、、、、
42. Java 中的 IO 流的分类?说出几个你熟悉的实现类?
、、、、
43. 字节流和字符流有什么区别?
、、、、
44. BIO、NIO、AIO 有什么区别?
/、、、、
二、Java异常 9 道
1. finally 块中的代码什么时候被执行?
finally代码在return前执行
2. finally 是不是一定会被执行到?
有两种情况下finally语句是不会被执行:
1.try语句没有被执行到,如在try语句之前return就返回了,这样finally语句就不会执行。这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
2.在try块|catch块中有System.exit(0);这样的语句。System.exit(0)是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。
3. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会执行,在return 前执行
4. try-catch-finally 中那个部分可以省略?
/、、
5. Error 和 Exception 的区别?
111
6. 运行时异常与受检异常有何异同?
111
7. throw 和 throws 的区别?
111
8. 常见的异常类有哪些?
111
9. 主线程可以捕获到子线程的异常吗?
111
三、Java集合 24 道
1. Java 中常用的容器有哪些?
Java 容器分为 Collection 和 Map 两大类,各自都有很多子类
2. ArrayList 和 LinkedList 的区别?
第一版:ArrayList 以动态数组的方式存储,LinkedList基于双向链表的方式存储;
ArrayList查询,修改快,插入元素,删除元素慢,因为要移动元素;
LinkedList增删快,因为不需要移动元素,查询慢,因为数据结构为双向链表不能直接根据序号获取某一个元素,必须从前往后或者从后往前;
3. ArrayList 实现 RandomAccess 接口有何作用?为何 LinkedList 却没实现这个接口?
RandomAccess接口是一个标志接口(Marker),只要List集合实现这个接口,就能支持快速随机访问;
实现RandomAccess接口的List集合采用一般的for循环遍历,而未实现这接口则采用迭代器;
ArrayList用for循环遍历比iterator迭代器遍历快,LinkedList用iterator迭代器遍历比for循环遍历快;
4. ArrayList 的扩容机制?
jdk1.7:
jdk1.8:当我们访问无参构造,ArrayList类帮我们维护一个空的数组,当我们第一次赋值,数组长度改为10,当我们添加第11个元素,扩容1.5倍,通过复制数组实现,需要移动元素
5. Array(数组) 和 ArrayList 有何区别?什么时候更适合用 Array?
Array 数组可以包含基本类型和对象类型,ArrayList 却只能包含对象类型;Array 数组在存放的时候一定是同种类型的元素,ArrayList 就不一定了。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList 方法上比 Array 更多样化,比如添加全部 addAll()、删除全部 removeAll()、返回迭代器 iterator() 等。
6. HashMap 的实现原理/底层数据结构?JDK1.7 和 JDK1.8
7..HashMap 的 put 方法的执行过程?
8. HashMap 的 get 方法的执行过程?
9. HashMap 的 resize 方法的执行过程?
10. HashMap 的 size 为什么必须是 2 的整数次方?
11. HashMap 多线程死循环问题?
12. HashMap 的 get 方法能否判断某个元素是否在 map 中?
13. HashMap 与 HashTable 的区别是什么?
14. HashMap 与 ConcurrentHashMap 的区别是什么?
15. HashTable 和 ConcurrentHashMap 的区别?
16. ConcurrentHashMap 的实现原理是什么?
17. HashSet 的实现原理?
18. HashSet 怎么保证元素不重复的?
19. LinkedHashMap 的实现原理?
20. Iterator 怎么使用?有什么特点?
21. Iterator 和 ListIterator 有什么区别?
22. Iterator 和 Enumeration 接口的区别?
23. fail-fast 与 fail-safe 有什么区别?
24. Collection 和 Collections 有什么区别?
四、Java并发 42 道
1. 并行和并发有什么区别?
并行:多个CPU同时执行多个任务
并发:一个CPU执行多个任务,不同时
2. 线程和进程的区别?
线程:CPU进行运算调度的最小单位
进程:CPU分配资源的最小单位
3. 守护线程是什么?
守护线程是程序运行的时候在后台提供一种通用服务的线程。
Java中把线程设置为守护线程的方法:在 start 线程之前调用线程的 setDaemon(true) 方法。
4. 创建线程的几种方式?
继承Thread类
实现Runnable接口
实现Callable接口
线程池
5. Runnable 和 Callable 有什么区别?
相同点:都是接口、都可以编写多线程程序、都采用Thread.start()启动线程
不同点:Runnable没有返回值;Callable可以返回执行结果,是个泛型,和Future、FutureTask配合可以用来获取异步执行的结果
Callable接口的call()方法允许抛出异常;Runnable的run()方法异常只能在内部消化,不能往上继续抛
6. 线程状态及转换?
状态:创建、就绪、运行、阻塞、死亡
转换:
- 当一个线程执行了start方法后,不代表这个线程就会立即被执行,只代表这个线程处于可运行的状态,最终由OS的线程调度来决定哪个可运行状态下的线程被执行。
- 一个线程一次被选中执行是有时间限制的,这个时间段叫做CPU的时间片,当时间片用完但线程还没有结束时,这个线程又会变为可运行状态,等待OS的再次调度;在运行的线程里执行Thread.yeild()方法同样可以使当前线程变为可运行状态。
- 在一个运行中的线程等待用户输入、调用Thread.sleep()、调用了其他线程的join()方法,则当前线程变为阻塞状态。
- 阻塞状态的线程用户输入完毕、sleep时间到、join的线程结束,则当前线程由阻塞状态变为可运行状态。
- 运行中的线程调用wait方法,此线程进入等待队列。
- 运行中的线程遇到synchronized同时没有拿到对象的锁标记、等待队列的线程wait时间到、等待队列的线程被notify方法唤醒、有其他线程调用notifyAll方法,则线程变成锁池状态。
- 锁池状态的线程获得对象锁标记,则线程变成可运行状态。
- 运行中的线程run方法执行完毕或main线程结束,则线程运行结束。
7. sleep() 和 wait() 的区别?
1.sleep() 方法是线程类(Thread)的静态方法,wait()是Object类的方法。
2.在调用sleep()方法的过程中,线程不会释放对象锁。
在调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
3.sleep可以在任何地方使用,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用
4.sleep使用的时候不需要自己使用nofity方法唤醒,超时自动唤醒,wait方法需要自己使用nofity和nofityAll方法去唤醒
8. 线程的 run() 和 start() 有什么区别?
start()方法是Thread类的一个方法,通过调用start()方法可以启动一个线程,这时被启动的线程就会进入就绪状态,等分配到CPU时间片后就会执行线程里的run()方法
run()只是线程中的一个执行方法,如果不用start()启动该线程,run方法就不会执行
9. 在 Java 程序中怎么保证多线程的运行安全?
并发操作中的3大问题:原子性问题,可见性问题,有序性问题
方法一:使用安全类,比如 Java. util. concurrent 下的类。
方法二:使用自动锁 synchronized。
方法三:使用手动锁 Lock。
10. Java 线程同步的几种方法?
同步方法
同步代码块
wait与notify
使用特殊域变量(volatile)实现线程同步
使用重入锁实现线程同步
使用局部变量实现线程同步
使用阻塞队列实现线程同步
11. Thread.interrupt() 方法的工作原理是什么?
12. 谈谈对 ThreadLocal 的理解?
13. 在哪些场景下会使用到 ThreadLocal?
14. 说一说自己对于 synchronized 关键字的了解?
15. 如何在项目中使用 synchronized 的?
16. 说说 JDK1.6 之后的 synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗?
17. 谈谈 synchronized 和 ReenTrantLock 的区别?
18. synchronized 和 volatile 的区别是什么?
19. 谈一下你对 volatile 关键字的理解?
20. 说下对 ReentrantReadWriteLock 的理解?
21. 说下对悲观锁和乐观锁的理解?
22. 乐观锁常见的两种实现方式是什么?
23. 乐观锁的缺点有哪些?
24. CAS 和 synchronized 的使用场景?
25. 简单说下对 Java 中的原子类的理解?
26. atomic 的原理是什么?
27. 说下对同步器 AQS 的理解?
28. AQS 的原理是什么?
29. AQS 对资源的共享模式有哪些?
30. AQS 底层使用了模板方法模式,你能说出几个需要重写的方法吗?
31. 说下对信号量 Semaphore 的理解?
32. CountDownLatch 和 CyclicBarrier 有什么区别?
33. 说下对线程池的理解?为什么要使用线程池?
34. 创建线程池的参数有哪些?
35. 如何创建线程池?
36. 线程池中的的线程数一般怎么设置?需要考虑哪些问题?
37. 执行 execute() 方法和 submit() 方法的区别是什么呢?
38. 说下对 Fork和Join 并行计算框架的理解?
39. JDK 中提供了哪些并发容器?
40. 谈谈对 CopyOnWriteArrayList 的理解?
41. 谈谈对 BlockingQueue 的理解?分别有哪些实现类?
42. 谈谈对 ConcurrentSkipListMap 的理解?
五、Java JVM 42 道
1. 说一下 Jvm 的主要组成部分?及其作用?
线程私有的运行时数据区: 程序计数器、Java 虚拟机栈、本地方法栈。
线程共享的运行时数据区:Java 堆、方法区。
程序计数器:
Java 虚拟机栈:
本地方法栈:
Java 堆:
方法区(元空间):
2. 谈谈对运行时数据区的理解?
3. 堆和栈的区别是什么?
4. 堆中存什么?栈中存什么?
5. 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?
6. Java 中的参数传递时传值呢?还是传引用?
7. Java 对象的大小是怎么计算的?
8. 对象的访问定位的两种方式?
9. 判断垃圾可以回收的方法有哪些?
10. 垃圾回收是从哪里开始的呢?
11. 被标记为垃圾的对象一定会被回收吗?
12. 谈谈对 Java 中引用的了解?
13. 谈谈对内存泄漏的理解?
14. 内存泄露的根本原因是什么?
15. 举几个可能发生内存泄漏的情况?
16. 尽量避免内存泄漏的方法?
17. 常用的垃圾收集算法有哪些?
18. 为什么要采用分代收集算法?
19. 分代收集下的年轻代和老年代应该采用什么样的垃圾回收算法?
20. 什么是浮动垃圾?
21. 什么是内存碎片?如何解决?
22. 常用的垃圾收集器有哪些?
23. 谈谈你对 CMS 垃圾收集器的理解?
24. 谈谈你对 G1 收集器的理解?
25. 说下你对垃圾回收策略的理解/垃圾回收时机?
26. 谈谈你对内存分配的理解?大对象怎么分配?空间分配担保?
27. 说下你用过的 JVM 监控工具?
28. 如何利用监控工具调优?
29. JVM 的一些参数?
30. 谈谈你对类文件结构的理解?有哪些部分组成?
31. 谈谈你对类加载机制的了解?
32. 类加载各阶段的作用分别是什么?
33. 有哪些类加载器?分别有什么作用?
34. 类与类加载器的关系?
35. 谈谈你对双亲委派模型的理解?工作过程?为什么要使用
36. 怎么实现一个自定义的类加载器?需要注意什么?
37. 怎么打破双亲委派模型?
38. 有哪些实际场景是需要打破双亲委派模型的?
39. 谈谈你对编译期优化和运行期优化的理解?
40. 为何 HotSpot 虚拟机要使用解释器与编译器并存的架构?
41. 说下你对 Java 内存模型的理解?
42. 内存间的交互操作有哪些?需要满足什么规则?