Java面试题总结
参考的是这个
金三银四BAT及各大互联网巨头Java面试通关要点汇总集
一、基础篇
基本功
面向对象的特征
封装、继承、多态、抽象final, finally, finalize 的区别
final 是修饰符,修饰类表示某个类的是最终类,不可被继承,方法是最终方法,不可被重写。 finally 是try,catch 一块用,最后执行的代码块 , finalize object析构函数,一般垃圾回收调用。
参考final、finally、finalize区别int 和 Integer 有什么区别
int 基本数据类型, Integer包装类型重载和重写的区别
参考 重载与重写的区别
override(重写)1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载)
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
抽象类和接口有什么区别
抽象类是abstract修饰的类 ,定义方法,可以有方法体
接口interface ,声明,没有实现
第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以多继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的。说说反射的用途及实现
Java反射机制主要用于实现以下功能。
(1)在运行时判断任意一个对象所属的类型。
(2)在运行时构造任意一个类的对象。
(3)在运行时判断任意一个类所具有的成员变量和方法。
(4)在运行时调用任意一个对象的方法,甚至可以调用private方法。
说说自定义注解的场景及实现
1.声明自定义注解,并限制适用范围(因为默认是通用)
2.规定范围内使用注解
3.isAnnotationPresent(Insert.class)检查注解,getAnnotation(Insert.class).value()取得注解内容
4.根据实际场景应用HTTP 请求的 GET 与 POST 方式的区别
安全性 可见性 传输长度 语义性session 与 cookie 区别
session 分布式处理
- 前端cookie保存, 每次带给后端, 缺点是占用外网带宽
- 后端session复制, 缺点是占用内网带宽
- 固定服务器访问,haship, 缺点是水平扩展rehash 失去session
- 缓存服务器,缺点是需要编码实现, 目前采用最普遍的方式是这一种
JDBC 流程
- 注册驱动
- 获得连接
- 创建sql
- 执行sql
- 处理结果集
- 关闭连接
- MVC 设计思想
- equals 与 == 的区别
Object equals 是==, 比较的是对象内存地址,
String重写了equals, 比较的是字符串的内容
集合
List 和 Set 区别
List:
1.可以允许重复的对象。
2.可以插入多个null元素。
3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList则对于经常需要从 List 中添加或删除元素的场合更为合适。\
Set
1.不允许重复对象
2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
3. 只允许一个 null 元素
4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器List 和 Map 区别
一个是集合, 一个是键值对Arraylist 与 LinkedList 区别
一个底层数组实现,一个链表实现- ArrayList 与 Vector 区别
一个非线程安全, 一个线程安全 - HashMap 和 Hashtable 的区别
一个非线程安全, 一个线程安全 HashSet 和 HashMap 区别
一个是Set的实现,一个是Map键值实现,
HashSet 底层是用HashMap key 实现HashMap 和 ConcurrentHashMap 的区别
一个非线程安全,一个线程安全, 分段锁实现- HashMap 的工作原理及代码实现
hask(key) % length , 取得位置, 冲突进链表, 大于八转为 TreeBin, 红黑二叉树 - ConcurrentHashMap 的工作原理及代码实现
分段锁, 减小锁粒度, 在size containsKey 上才需要全局锁
注意去查看源码, 分段锁到底是如何分段加锁的
线程
- 创建线程的方式及实现
- 继承Thread , 实现Runnable接口
- 线程池 ExecuteService
sleep() 、join()、yield()有什么区别
sleep 当前线程休眠,不交锁
join 当前线程加入别的线程执行,执行完后继续再执行本线程
yield 交出锁重新竞争说说 CountDownLatch 原理
闭锁,一般用在当前线程等待其他若干线程执行完毕,再执行,在当前线程需要等待的地方调用await, 然后其他线程里执行完毕,调用 countDown(), 对计数减一操作, 当计数为0, 线程继续执行说说 CyclicBarrier 原理
栅栏, 一般用作一组线程都到达某个位置,再执行或再优先执行某个线程, 某线程运行完调用await, count++, 直到所有线程就绪- 说说 Semaphore 原理
信号量, 维护一个阻塞队列, 某线程需要执行,就去获得 许可, 得到后执行, 执行完就 release释放许可 - 说说 Exchanger 原理
- 说说 CountDownLatch 与 CyclicBarrier 区别
闭锁只能用一次, 栅栏有reset方法,可重复使用
闭锁需要手动减一操作, 栅栏自行加1
闭锁一般用于一个线程等待一组线程, , 栅栏一般用于一组县城等待另一组线程 - ThreadLocal 原理分析
线程内变量, - 讲讲线程池的实现原理
- 线程池的几种方式
几种线程池,包括构造方法, 参数列表 - 线程的生命周期
锁机制
说说线程安全问题
- volatile 实现原理
- synchronize 实现原理
- synchronized 与 lock 的区别
- CAS 乐观锁
compare and swap, 比较并交换, 如果内存位置V的变量和预期的一致,那么就把它更新了 - ABA 问题
上述解决方法存在ABA问题, - 乐观锁的业务场景及实现方式