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 表达式真正的好处在哪?

发表评论

后才能评论