Java面试核心技术精讲
2021-03-25 17:34:20 18 举报
AI智能生成
Java面试核心技术精讲
作者其他创作
大纲/内容
Java平台
Java平台语言特点
书写一次,到处运行
垃圾收集
解释执行,也存在部分热点代码的编译执行(JIT)
C1 对应前面说的 client 模式
C2 对应 server 模式
参数
指定“-Xint”,就
是告诉 JVM 只进行解释执行,不对代码进行编译
是告诉 JVM 只进行解释执行,不对代码进行编译
还有一
个“-Xcomp”参数,这是告诉 JVM 关闭解释器,不要进行解释执行,或者叫作最大优化
级别
个“-Xcomp”参数,这是告诉 JVM 关闭解释器,不要进行解释执行,或者叫作最大优化
级别
-Xmixed
Java虚拟机
Oracle JDK 提供的 Hotspot JVM
Java工具
诊断工具
jmap
jstack
jconsole
jhsdb
jcmd
Java类库
泛型
Lambda
基础类库
集合
IO/NIO
网络
并发
Java基础
Java异常
Exception 是程序正
常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理
常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理
可检查
不检查
NullPointerException
ArrayIndexOutOfBoundsException
Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如
JVM 自身)处于非正常的、不可恢复状态
JVM 自身)处于非正常的、不可恢复状态
OutOfMemoryError
谈谈final、finally、 finalize
Immutable
引用
强引用
软引用
只有当GC认为内存不足时才会回收
弱引用
提供了一种访问弱引用的途径,并不能豁免对象回收
幻象引用
有时候也翻译成虚引用,你不能通过它访问对象。幻象引用仅仅是提供了一
种确保对象被 finalize 以后,做某些事情的机制
String、StringBuffer、StringBuilder
String
不可变对象,拼接时会创建新对象
StringBuffer
线程安全
StringBuilder
非线程安全
动态代理
反射实现
字节码操作机制
Sprig aop
JDK Proxy(针对接口)
cglib(可以是接口也可以是类)
应用场景
子主题
Java基本数据类型
自动装箱
自动拆箱
缓存值
Java集合类型
Vector
线程安全的动态数组
1倍扩容
中间插入元素性能比较差
ArrayList
应用更加广泛的动态数组实现,它本身不是线程安全的
扩容0.5b倍
中间插入元素性能比较差
LinkedList
双向链表,所以它不需要像上面两种那样调整容量,它
也不是线程安全的。
也不是线程安全的。
中间插入元素性能比较好
SET
TreeSet
自然顺序访问
底层是Map实现
HashSet
不保证有序
底层是Map实现
LinkedHashSet
不保证有序
基本算法
归并排序
交换排序(冒泡、快排)
选择排序
插入排序
Map
Hashtable
线程安全
不支撑key和value为null
HashMap
非线程安全
支持 null 键和值等
数据存储
数组+链表
TreeMap
数据存储
红黑树
数据是有序存放的
get/put/remove复杂度是O(log(n))
ConcurrentHashMap
并发实现
分段锁机制
concurrentcyLevel默认是16
Segment锁实现是基于ReentrantLock
jdk1.8
数据存储利用 volatile 来保证可见性。
使用 CAS 等操作,在特定场景进行无锁并发操作
使用 Unsafe、LongAdder 之类底层手段,进行极端情况的优化。
IO操作
java.io 包
java.net
java.nio 包
Channel
Channel,类似在 Linux 之类操作系统上看到的文件描述符,是 NIO 中被用来支持批量
式 IO 操作的一种抽象。
Selector
是 NIO 实现多路复用的基础,它提供了一种高效的机制,可以检测到注册在
Selector 上的多个 Channel 中,是否有 Channel 处于就绪状态,进而实现了单线程对
多 Channel 的高效管理。
Buffer
Buffer,高效的数据容器,除了布尔类型,所有原始数据类型都有相应的 Buffer 实现
Asynchronous IO
基础知识
synchronous/asynchronous
blocking/non-blocking
多路复用
利用了单线程轮询事件的机制,通过高效地定位就绪的 Channel,来决定
做什么,仅仅 select 阶段是阻塞的,可以有效避免大量客户端连接时,频繁线程切换带来
的问题,应用的扩展能力有了非常大的提高。
做什么,仅仅 select 阶段是阻塞的,可以有效避免大量客户端连接时,频繁线程切换带来
的问题,应用的扩展能力有了非常大的提高。
图解
子主题
同步阻塞模式
所以需要多线程以实现多任务处理
图解
Direct Buffer
减少了堆内对象存储的可能额外维护工作,所以访问效率可能有所提高
Direct Buffer 创建和销毁过程中,都会比一般的堆内 Buffer 增加部分开销,
所以通常都建议用于长期使用、数据较大的场景。
大多数垃圾收集过程中,都不会主动收集 Direct Buffer
它的垃圾回收往往要拖到 full GC
跟踪和诊断 Direct Buffer 内存占用
Native
Memory Tracking
Memory Tracking
Reactor模式
图解
三种版本
Thread per connection
子主题
多线程模式
子主题
单线程模式
子主题
主从多线程模式
Netty实现
netty
netty内存使用技巧
能使用基本类型就不使用包装类型
可以定义成类成员变量,就不要定义成类的实例
减少对象自身的大小
提前预知集合的容量,避免扩容
使用对象池化技术
使用堆外内存
接口与抽象
接口
接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目
的
的
不能实例化
不能包含任何非常量成员,任何 field 都是隐含着 public static
final 的意义
final 的意义
没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法
抽象类大多用于抽取相关 Java 类的共用方法实现或者是共同成员变量
设计模式
创建型模式
工厂模式
单例模式
构建器模式
原型模式
结构型模式
桥接模式
适配器模式
装饰者模式
代理模式
组合模式
外观模式
享元模式
行为型模式
策略模式
解释器模式
命令模式
迭代器模式
模板方法模式
访问者模式
Java进阶
Synchronized 和 ReentrantLock 有什么区别
Synchronized
是 Java 内建的同步机制
ReentrantLock
重入锁
可以比较对锁的作用进行细粒度控制
线程安全几个问题
原子性
可见性
有序性
线程状态
新建
就绪
等待
终止
阻塞
锁死
子主题
调查锁死
利用 jstack 等工具获取线程栈
超时释放
子主题
Java并发包
CountDownLatch
允许一个或多个线程等待某些操作完成
CyclicBarrier
一种辅助性的同步结构,允许多个线程等待到达某个屏障
Semaphore
Java 版本的信号量实现
各种线程安全的容器
各种并发队列实现
强大的 Executor 框架
三种并容器
Concurrent
基于 CAS 的无锁技术
弱一致
当利用迭代器遍历时,如果容器发生修改,迭代器仍然可以继续
进行遍历
size 等操作准确性是有限的,未必是 100% 准确
读取的性能具有一定的不确定性。
CopyOnWrite
Blocking
Blocking*开头:使用的内部锁机制
Java并发类库提供的线程池
Executors 目前提供了 5 种不同的线程池创建配置
newCachedThreadPool
newFixedThreadPool
newSingleThreadExecutor
结构
子主题
线程池大小的选择
CPU 核的数目 N 或者 N+1
AtomicInteger
Java虚拟机
程序计数器
Java 虚拟机栈
当前帧
堆
方法区
这也是所有线程共享的一块内存区域,用于存储所谓的
元(Meta)数据,例如类结构信息,以及对应的运行时常量池、字段、方法代码等
元(Meta)数据,例如类结构信息,以及对应的运行时常量池、字段、方法代码等
运行时常量池
本地方法栈
图解
垃圾回收的算法
引用计数算法
优化思路
运行时(runtime)优化
即时编译器(JIT)优化
Java应用安全
SQL 注入攻击
操作系统命令注入
XML 注入攻击
Java应用开发扩展
MySQL支持的事务隔离级别,以及悲观锁和乐观锁
ACID
子主题
锁
Spring bean
生命周期
作用域
Singleton
这是 Spring 的默认作用域,也就是为每个 IOC 容器创建唯一的一个 Bean
实例。
实例。
Prototype
针对每个 getBean 请求,容器都会单独创建一个 Bean 实例
web容器下的作用域
Request,为每个 HTTP 请求创建单独的 Bean 实例
Session,很显然 Bean 实例的作用域是 Session 范
0 条评论
下一页