Java考点分析与总结
,这个不用说,是我们的主力语言,可以说是八股文各个知识中,问的最多的了,并且也是需要我们花最多时间去复习的,不过又说回来,当你掌握了之后,感觉又没那么多,,也就是那几样。
下面我先给大家分析一下 Java 各个知识点的考点以及大公司和小公司在 Java 上的考点,并且会按照出现的频率来给大家弄清楚考点,最后还有给出面试中都是怎么询问的。
希望大家可以认真看一下,看完你内心也有一个大概了。
一、考点分布
我这里把考点分为:Java多线程基础 + Java多线程进阶(JUC) + Java集合 + Java基础 + Java线程池 + 其他,一共六个模块。总的来说,绝大部分的考点都分布在集合+多线程,这两个加起来占据了 70% 吧,其次就是 Java 基础 和线程池问的比例差不多,相对比较少,一般线程池可能还会根据项目来问。
所以我们在学习时,重点是拿下集合和多线程,其他的,优先了解概念,可以不研究很深,但是多线程其实很难,就优先拿下比较简单的:多线程基础 + volatile + sychronized + cas。
二、大公司与小公司提问区别
现在的话,说实话,在大公司的话,HashMap 并没有以前问的多了,可能是大家都会了吧,总的来说就是,JUC 这块,大公司才可能问,小公司基本很少问,Java 基础小公司会问的多一些,并且小公司也会问 Java多线程基础,但是大公司多线程基础问的少一些。
而集合的话,大小公司都会问。
大公司:集合/多线程/线程池偏多
小公司:多线程基础/Java基础偏多
三、超详细考点总结(按照出现频率排序)
1.1 Java集合知识点总结
HashMap
- 底层数据结构 + 为啥选择红黑树 + put/get 到大致执行逻辑
- 线程安全角度:为啥不安全,得举例子 + 如何让 hashmap 变安全 + 有哪些线程安全的集合
- Hashcode 取模 + 扩容原理 + 为啥扩容因子选择 0.75
- 一般就这几个,带着目的去看一些文章分析,之后自己看源码,就会容易很多了
ArrayList和LinkedList:这两个经常一起出现,主要掌握他们的底层数据结构以及应用场景。
HashSet、Hashtable:掌握他们的底层数据结构,但是不用像 Hashmap 需要掌握的很细。
顶层接口:list 与 map,简单了解
counrrenthashmap:掌握原理以及它和Hashtable的区别(counrrenthashmap深入有点难,没条件的就了解下它是个线程安全的集合就可以了)
LinkedHashMap:了解下底层结构 + 应用场景
1.2 Java集合提问方式
1、HashMap的底层原理
2、HashMap底层为什么要用红黑树呢?为什么不用平衡二叉树?
3、HashMap啥时候扩容,为什么扩容
4、如果两个同样的put相同的key,会发生什么?
5、HashMap是线程安全的吗?为什么呢?
6、HashMap在遇到key冲突的时候是怎么处理的呢?
7、 hashMap put get过程
8 、取模的时候为什么用&(length-1)
9、HashMap的底层数据结构?链表长度大于8就会转化成红黑树吗,没有对数组的插入有要求吗?链表是双向链表还是单向链表?
10 、hashp什么时候退回回链表?为什么不是7
11、HashMap不是线程安全的,如果要保证线程安全怎么办呢?可以用什么?
12、有哪些线程安全的集合类,讲一讲原理(HashTable,ConcurrentHashMap,CopyOnWriteArrayList)
13、hashmap一套 put流程,1.8的改进(红黑树,头插变尾插,扩容等)
14、hashmap,counrrenthashmap的原理以及区别(要求从源码上解释)
15、concurrentHashMap如何保证线程安全?
16、ConcurrentHashMap是不是绝对并发安全的?
17、ArrayList和LinkedList区别
18、讲一讲HashSet、Hashtable
19、list和set有什么区别 只说了特性应该扩展说说
20、集合类的顶级接口
21、Map:只存60个键值对,需要设置初始化容量吗?设置的话设置多少初始化容量:需要 否则需要多次扩容 128 要考虑数组长度是2的幂次方、负载因子
22、容量不是2的整数次幂 还用&(length-1) 影响会怎样?:容量是2的整数次幂,n -1 后,高位为1后的0都变为1,如 16:10000, 16-1=15:1111, 1111 再与 hash 做 & 运算的时候,各个位置的取值取决于 hash;如果不是2的整数次幂,必然会有的0的位,0与任何数&肯定为0,会造成更多的哈希冲突
2.1 Java基础知识点总结
1、记住几个 Object 常用方法
2、equals, hashcode, = = 这两个之前的关系
3、String, StringBuilder, StringBuffer,三者区别
4、异常:异常分类 + 记住几个常见异常
5、重载于重写,抽象类和接口
6、final 和 static 关键词的作用
7、浅克隆与深克隆
2.2 Java基础提问方式
1、Object类有哪些方法?详细说明
2、Java为什么被称为平台无关性语言?
3、讲一下equals()与hashcode(),什么时候重写,为什么重写,怎么重写?
4、= =和equals有什么区别
5、用户自己写一个String类,会发生什么?
6、String、StringBuilder、StringBuffer有什么区别?
7、java的4种引用
8、重载和重写的区别;
9、抽象类和接口的区别;
10、final关键字有什么作用,会用到哪些地方。修饰类,变量,方法。变量可以改变引用值,不能改变引用地址
11、抽象方法能不能加final;
12、sleep()和wait()的区别?
13、throw和throws的区别
14、try catch会影响性能吗?为什么抛出异常的时候会影响性能?
15、说说Java多态
3.1 Java多线基础版知识点总结
1、理解什么是线程安全,能够举例来说明线程不安全
2、能够用 Java 写一个出现死锁的例子。
3、掌握 Java 进程与线程的区别
4、自己用 Thread 和 Runnable 创建下多进程,并且知道他们的区别
5、run() 方法和 start() 的区别,最好自己点进去看看远吗
6、wait,notify,sleep 之间的关系,也要自己用一用
7、掌握线程的几种状态
主要就是上面这些
3.2 Java多线基础版提问方式
1、Java多线程基础这块,就不总结了,感觉没什么好总结的,直接看下面的提问方式吧,比较杂。
2、进程和线程的区别;
3、创建线程的方式;
4、如何停止一个线程的运行
5、Runnable和Callable创建线程有什么区别?
6、Thread类和Runable接口的最大区别是什么?
7、线程的几种状态,以及状态的转换
8、线程的生命周期 感觉这个应该跟状态区分一下 生命周期说一下过程啥的
9、什么是线程安全?为什么不安全?
10、阻塞状态和等待状态的区别
11、怎么实现线程安全
12、锁怎么实现线程安全
13、 多线程什么场景下会发生死锁 , 有什么具体的办法可以避免死锁
14、wait和sleep的区别,没有说清楚,HR提醒用wait时会释放锁,sleep不会
15、多线程了解吗,为什么要多线程。如何启动一个线程,主动说了start和run的区别
16、多线程环境下为什么要引入同步的机制
17、为什么要线程安全,举例子,说了数据库脏读的例子, Java方面不清楚,面试官给了非元子性的操作 i++的例子怎么实现线程安全
18、volatile的作用和原理
19、什么是原子性
20、volatile能不能保证原子性
21、Java里面的锁有哪些?
22、java里面的线程和操作系统的线程一样吗?
23、wait-notify、线程的状态
24、notify 和 notifyAll 的区别
4.1 Java多线程进阶版知识点总结
1、轻量级锁 + 重量级锁(自旋锁 + 自适应锁)
2、Volatile 和 synchronized
3、ReentrantLock 底层
4、Lock
5、CAS原理 + 优缺点
6、AQS(比较难)
7、几种常见JUC包:CountDownLatch,Semaphore,CyclicBarrier,FutureTask,记得自己随便写个 demo 用一下
8、几个常见的原子类:AtomicBoolean、AtomicInteger、AtomicReference
9、threadLocal 应用场景 + 原理
4.2 Java多线程进阶版提问方式
1、synchronized关键字的底层实现
2、synchronized和ReentrantLock区别
3、ReentrantLock底层实现?平时怎么使用的?
4、说说可重入锁、为什么需要可重入锁?
5、ReentrantLock的实现原理?
6、ReentrantLock是怎么实现的,讲到AQS,顺便说了AQS
7、还有哪些基于AQS的同步工具
8、threadlocal是干嘛的?
9、threadLocal介绍,key是什么
10、ThreadLocal的key是哪种引用类型?为啥这么设计?
11、ThreadLocal怎么防止内存泄漏
12、那个CountDownLatch你知道吗?说一下信号量
13、一个轻量级锁怎么变成一个重量级锁的呢?
14、锁升级过程
15、自旋锁会消耗cpu吗,为啥
16、Java 中的锁,乐观锁悲观锁
17、如何实现乐观锁
18、问题一、既然CAS包含了Compare和Swap两个操作,它又如何保证原子性呢?
19、CAS是由CPU支持的原子操作,其原子性是在硬件层面进行保证的。
20、问题二、CAS有哪些缺点?
21、lock底层实现
22、synchronized底层 ,和lock比选用什么锁好?(这里答的是syn,因为1.7后面做了很多的优化,适应自旋锁,锁粗化,锁消除等………)
23、手写多线程生产者消费者(阻塞队列实现、信号量实现)
5.1 线程池知识点总结
1、线程池的优缺点
2、线程池常见参数
3、线程池的大致执行逻辑
4、几种常见的线程池工具类
5、线程池满之后的拒绝策略
6、线程池的两种关闭方式
5.2 线程池提问方式
1、线程池原理,有什么常用参数?
2、为什么要使用线程池
3、线程池运行中,突然电脑关机了,内存数据都会丢失,开机后怎么办?
4、线程池实际应用及如何设计参数
5、运行的时候,核心线程数能不能修改?(可以修改)
6、核心线程数与最大线程数之间的关系?
7、了解Java的线程池吗?里面有一个ForkJoinPool,有没有用过?说一下
8、ForkJoinPool和其他的线程池有什么不一样的地方吗?比如用到了哪些算法
9、线程池哪几种?分别说一下
10、一个任务进来后,线程池是怎么处理的?
11、线程池的拒绝策略有哪几种?
12、内存池使用过吗
6.1 其他知识总结
1、BIO + NIO + AIO + IO多路复用 + epoll + poll + select
2、零拷贝技术
3、Java8新特性(主要是lambda)
4、反射应用场景(一般反射是结合框架之类的来问)
6.2 其他知识提问方式
1、BIO和NIO区别
2、I/O多路复用讲一下,epoll优势在哪,为什么,epoll水平触发与边缘触发
3、select和epoll区别知道嘛,它们算同步还是异步io,同步异步区别在哪里
4、反射原理
5、动态代理两种实现方式
6、java8里面新出了一些时间的类,比如比如LocalDate,与Date、 Calendar等其他时间类有什么区别?
7、java你用过的jdk版本,jdk1.8,你知道jdk1.8相较于1.7有什么新特性吗,我说我只知道一些类的底层实现不一样了,lambda表达式你知道吗(随便说了下),stream了解过吗。。。这个不知道
8、在java中如果要申请一块连续的空间,但是没有申请到,怎么办
9、Lambda 表达式解决了什么问题?临时的什么对象?为什么创建了这个对象就可以解决问题?这个对象有什么特点?如果没有 Lambda 你怎么做呢?Lambda 写的那个表达式是干什么用的?Lambda 表达式真正的好处在哪?