语言基础

面向对象

数据类型

基本类型

数据类型 字节 默认值 数据范围
Byte 1
-2^7(-128) ~ 2^7-1(127)
Boolean 1
ture or false
Char 2
0 ~ 65536
Short 2
-2^15 ~ 2^15-1
Int 4
-2^31 ~ 2^31-1
Float 4
-3.4E38(-3.4x10^38) ~ 3.4E38(3.4x10^38)
Double 8
-1.7E308(-1.7x10^308) ~ 1.7E308(1.7x10^308)
Long 8
-2^63 ~ 2^63-1

浮点型与整型之间的运算

当除法运算中,除数和或者被除数为浮点数,且除以 0 的时候,结果为 Infinity(无穷大)或者 NaN(Not a Number),当整数除以 0 的时候(1 / 0),则会抛出异常

  1. System.out.println(1.0/0);//Infinity
  2. System.out.println(1.0/0.0);//Infinity
  3. System.out.println(0/0);//java.lang.ArithmeticException: / by zero
  4. System.out.println(0/0.0);//NaN
  5. System.out.println(0.0/0);//NaN
  6. System.out.println(0.0/0.0);//NaN
  7. System.out.println(1/0.0);//Infinity
  8. System.out.println(1/0);//java.lang.ArithmeticException: / by zero


整型之间的除法结果会自动向下取整,浮点和整型之间相加,整型会隐式转为浮点型

int a = 1;
int b = 2;
float f = (a + b)/2;
System.out.println(f); //结果是1.0

int a = 1;
int b = 2;
float f = ((float) a + (float)b)/2;
System.out.println(f); //结果是1.5

int a = 1;
float b = 2;
float f = (a + b)/2;
System.out.println(f); //结果是1.5

接口

泛型

反射

注解

元注解

所谓元注解,其主要作⽤就是负责注解其他注解,为其他注解提供了相关的解释说明,比如Override这个注解,就不是一个元注解。而是通过元注解定义出来的,这里面的 @Target @Retention 就是元注解。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

元注解有六个:
@Target(⽤于指定注解的使⽤范围)
@Retention(⽤于指定注解的保留策略)
@Documented(用于是否将此注解包含在javadoc中)
@Inherited(允许子类继承父类中的注解)
@Repeatable(1.8新增,允许一个注解在一个元素上使用多次)
@Native(1.8新增,修饰成员变量,表示这个变量可以被本地代码引用,常常被代码生成工具使用)
afs
@Target指定注解的使⽤范围如下:

范围 说明
ElementType.CONSTRUCTOR 用于构造⽅法
ElementType.FIELD 用于成员变量、枚举常量
ElementType.LOCAL_VARIABLE 用于局部变量
ElementType.METHOD 用于⽅法
ElementType.PACKAGE 用于包
ElementType.PARAMETER 用于形式参数(1.8新增)
ElementType.TYPE 用于类、接⼝、注解、枚举

@Retention指定注解的保留策略如下:

策略 说明
RetentionPolicy.SOURCE 注解只保留在源码中,在编译时会被编译器丢弃
RetentionPolicy.CLASS (默认的保留策略) 注解会被保留在Class⽂件中,但不会被加载到虚拟机中,运⾏时⽆法获得
RetentionPolicy.RUNTIME 注解会被保留在Class⽂件中,且会被加载到虚拟机中,可以在运⾏时获得

生命周期大小排序为 SOURCE < CLASS < RUNTIME,前者能使用的地方后者一定也能使用。如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解;如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS 注解;如果只是做一些检查性的操作,比如 @Override 和@SuppressWarnings,则可选用 SOURCE 注解。

Spring常用注解

I/O

字节流&字符流

字节与字符

Bit最小的二进制单位 ,是计算机的操作部分。取值0或者1
Byte(字节)是计算机操作数据的最小单位由8位bit组成 取值(-128-127)
Char(字符)是用户的可读写的最小单位,在Java里面由16位bit组成 取值(0-65535)

字节流

操作byte类型数据,主要操作类是OutputStream、InputStream的子类;不用缓冲区,直接对文件本身操作。

字符流

操作字符类型数据,主要操作类是Reader、Writer的子类;使用缓冲区缓冲字符,不关闭流就不会输出任何内容。

互相转换

想要实现字符流和字节流之间的相互转换需要用到两个类:
OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象。
InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即将一个字节流的输入对象变为字符流的输入对象。

  • 字符流转成字节流 ```java public static void main(String[] args) throws IOException { File f = new File(“test.txt”);

    // OutputStreamWriter 是字符流通向字节流的桥梁,创建了一个字符流通向字节流的对象 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(f),”UTF-8”);

    osw.write(“我是字符流转换成字节流输出的”); osw.close();

}


- 字节流转成字符流
```java
  public static void main(String[] args) throws IOException {

        File f = new File("test.txt");

        InputStreamReader inr = new InputStreamReader(new FileInputStream(f),"UTF-8");

        char[] buf = new char[1024];

        int len = inr.read(buf);
        System.out.println(new String(buf,0,len));

        inr.close();

    }

序列化

集合

集合大纲

完整版:
实线表示继承关系,虚线表示实现关系

JAVA面试八股文 - 图1

精简版:
JAVA面试八股文 - 图2
大纲导图:
JAVA面试八股文 - 图3

集合与数组区别

List/Set/Queue

适用场景分析

JAVA面试八股文 - 图4

ArrayList

  • ArrayList继承关系

JAVA面试八股文 - 图5

  • 优缺点以及适用场景

ArrayList是实现了基于动态数组的数据结构,查询快,增删慢,线程不安全,可以存储重复元素。
因为地址连续,在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动 ,所以插入和删除操作效率比较低。
适用于在一列数据的后面添加或删除数据而不是在前面或中间,并且需要随机地访问其中的元素的情况

  • 扩容机制

JDK 1.8之前:ArrayList类似饿汉式,直接创建一个初始容量为10的数组
JDK 1.8之后:ArrayList类似懒汉式,一开始创建一个长度为0的数组,当添加第一个元素时再创建一个始容量为10的数组,采用右移运算,扩容后容量=当前容量+当前容量/2,整数除法会向下取整,所以当容量为奇数时,并非扩容为原来的1.5倍。

    private void grow(int var1) {
        int var2 = this.elementData.length;
        int var3 = var2 + (var2 >> 1);
        if (var3 - var1 < 0) {
            var3 = var1;
        }

        if (var3 - 2147483639 > 0) {
            var3 = hugeCapacity(var1);
        }

        this.elementData = Arrays.copyOf(this.elementData, var3);
    }
  • 常用方法
  1. add(Object element): 向列表的尾部添加指定的元素。
  2. size(): 返回列表中的元素个数。
  3. get(int index): 返回列表中指定位置的元素,index从0开始。
  4. add(int index, Object element): 在列表的指定位置插入指定元素。
  5. set(int i, Object element): 将索引i位置元素替换为元素element并返回被替换的元素。
  6. clear(): 从列表中移除所有元素。
  7. isEmpty(): 判断列表是否包含元素,不包含元素则返回 true,否则返回false。
  8. contains(Object o): 如果列表包含指定的元素,则返回 true。
  9. remove(int index): 移除列表中指定位置的元素,并返回被删元素。
  10. remove(Object o): 移除集合中第一次出现的指定元素,移除成功返回true,否则返回false。
  11. iterator(): 返回按适当顺序在列表的元素上进行迭代的迭代器。

在线API:
https://www.runoob.com/manual/jdk11api/java.base/java/util/ArrayList.html#%3Cinit%3E())

CopyOnWriteArrayList

  • CopyOnWriteArrayList继承关系

JAVA面试八股文 - 图6

  • 优缺点以及适用场景

CopyOnWriteArrayList是一个典型的读写分离的动态数组操作类,线程安全。
在写入数据的时候,将旧数组内容复制一份出来,然后向新的数组写入数据,最后将新的数组内存地址返回给数组变量;移除操作也类似;ReentrantLock独占锁对象用来保证同时只有一个线程对array进行修改,而查询方法,因为不涉及线程操作,所以并没有加锁。
另外CopyOnWriteArrayList提供了弱一致性的迭代器,从而保证在获取迭代器后,其他线程对List的修改是不可见的,迭代器遍历的数组是一个快照,只能保证数据的最终一致性,不能保证数据的实时一致性,对于边读边写的情况,不一定能实时的读到最新的数据。
适用于读多写少的场景,例如白名单,黑名单。

  • 扩容机制
  • 常用方法

在线API:
https://www.runoob.com/manual/jdk11api/java.base/java/util/concurrent/CopyOnWriteArrayList.html

LinkedList

  • LinkedList继承关系

JAVA面试八股文 - 图7

  • 优缺点以及适用场景

LinkedList是双向链表的数据结构,查询慢,增删快,线程不安全,可以存储重复元素。
底层是用链表实现,是由相互引用的节点组成的双向链表,改变链表中对应的两个节点的引用关系就可以完成增删操作,而查询操作需要逐一遍历,效率较低。
适用于需要对数据进行多次增加删除修改的情况。

  • 扩容机制

  • 常用方法
  1. add(E e):在链表后添加一个元素。
  2. add(int index, E element):在指定位置插入一个元素。(重载)
  3. push(E e):与addFirst方法的效果一样。
  4. addFirst(E e):在链表头部插入一个元素。
  5. offerFirst(E e):在链表头部插入一个元素。
  6. addLast(E e):在链表尾部添加一个元素。
  7. offer(E e):在链表尾部插入一个元素。
  8. offerLast(E e):在链表尾部插入一个元素。
  9. remove() :除链表中第一个元素。
  10. pop():删除头。
  11. poll():查询并移除第一个元素。
  12. remove(E e):移除指定元素。
  13. removeFirst(E e):删除头。
  14. pollFirst():删除头。
  15. pollLast():删除尾。
  16. removeLast(E e):删除尾。
  17. get(int index):按照下标获取元素。
  18. getFirst():获取第一个元素。
  19. getLast():获取最后一个元素。
  20. peek():获取第一个元素,但是不移除。
  21. peekFirst():获取第一个元素,但是不移除。
  22. peekLast():获取最后一个元素,但是不移除。

在线API:
https://www.runoob.com/manual/jdk11api/java.base/java/util/LinkedList.html

Vector

  • Vector继承关系

JAVA面试八股文 - 图8

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    Stack

  • Stack继承关系

JAVA面试八股文 - 图9

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    HashSet

  • HashSet继承关系

JAVA面试八股文 - 图10

  • 优缺点以及适用场景

HashSet 基于 HashMap 来实现的,插入无序,存储的元素不能重复可以存储null,线程不安全。常用于需要去重,对存储顺序无要求的情况。

  • 扩容机制
  • 常用方法

在线API:
https://www.runoob.com/manual/jdk11api/java.base/java/util/HashSet.html

LinkedHashSet

  • LinkedHashSet继承关系

JAVA面试八股文 - 图11

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    CopyOnWriteArraySet

  • CopyOnWriteArraySet继承关系

JAVA面试八股文 - 图12

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    TreeSet

  • TreeSet继承关系

JAVA面试八股文 - 图13

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    SortedSet

  • SortedSet继承关系

JAVA面试八股文 - 图14

  • 优缺点以及适用场景

ConcurrentSkipListSet相当于对ConcurrentSkipListMap的包装,ConcurrentSkipListSet的内部具有一个ConcurrentSkipListMap的实例,通过ConcurrentSkipListMap的方法来完成ConcurrentSkipListSet的功能,不允许 null 元素,

  • 扩容机制
  • 常用方法

    ConcurrentSkipListSet

  • ConcurrentSkipListSet继承关系

JAVA面试八股文 - 图15

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    EnumSet

  • EnumSet继承关系

JAVA面试八股文 - 图16

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    PriorityQueue

  • PriorityQueue继承关系

JAVA面试八股文 - 图17

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    ArrayDeque

  • ArrayDeque继承关系

JAVA面试八股文 - 图18

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    Map

    HashMap

  • HashMap继承关系

JAVA面试八股文 - 图19

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    Hashtable

  • Hashtable继承关系

JAVA面试八股文 - 图20

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    LinkedHashMap

  • LinkedHashMap继承关系

JAVA面试八股文 - 图21

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    TreeMap

  • TreeMap继承关系

JAVA面试八股文 - 图22

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    ConcurrentSkipListMap

  • ConcurrentSkipListMap继承关系

JAVA面试八股文 - 图23

  • 优缺点以及适用场景
  • 扩容机制
  • 常用方法

    异常

JVM

类加载机制

字节码执行机制

JVM内存模型

GC垃圾回收

JVM性能监控与故障定位

JVM调优

操作系统

进程/线程

并发/锁

内存管理和调度

I/O原理

数据库

SQL语句书写

SQL语句优化

事务以及隔离级别

索引

分库分表

读写分离

数据结构和算法

数据结构

简单数据结构

队列

链表

数组

哈希表

二叉树

字典树

平衡树

排序树

B树

B+树

R树

多路树

红黑树

大根堆

小根堆

有向图

无向图

拓扑

算法

时间&空间复杂度

深度优先&广度优先搜索

全排列

稳定排序

冒泡排序

插入排序

鸡尾酒排序

桶排序

计数排序

归并排序

原地归并排序

二叉树序数排序

鸽巢排序

基数排序

侏儒排序

图书馆排序

块排序

不稳定排序

选择排序

希尔排序

Clover排序

梳排序

堆排序

平滑排序

快速排序

内省排序

耐心排序

贪心算法

KMP算法

Hash算法

海量数据处理

分治

hash映射

堆排序

双层桶划分

Bloom Filter

bitmap

数据库索引

mapreduce

并发编程

并发编程基础

线程池

网络编程

APR协议

IP/ICMP协议

TCP/UDP协议

HTTP/HTTPS协议

http和https的区别

http1.0/http1.1/http2

http1.1 与 http1.0 的区别:

  1. 连接方面:http1.1 默认使用持久连接,而 http1.0 默认使用非持久连接。http1.1 通过使用持久连接来使多个http 请求复用同一个 TCP 连接,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点,减少了建立和关闭连接的消耗和延迟。

  2. 资源请求方面:在 http1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,http1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

  3. 缓存方面:在 http1.0 中主要使用 header 里的 If-Modified-Since,Expires来做为缓存判断的标准,http1.1则引入了更多的缓存控制策略例如 Etag、If-Unmodified-Since、If-Match、If-None-Match 等更多可供选择的缓存头来控制缓存策略。

  4. Host头处理:http1.1 新增了 host 字段,用来指定服务器的域名。http1.0 中认为每台服务器都绑定一个唯一的 IP地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。因此有了 host 字段,就可以将请求发往同一台服务器上的不同网站。

  5. 请求方法和状态码:http1.1 相对于 http1.0 还新增了很多方法,如 PUT、HEAD、OPTIONS 等,还新增了24个错误状态响应吗,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

http1.1 与 http2 的区别:

  1. 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

  2. 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

  3. header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

  4. 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。

Session/Cookie

DNS

CDN

代理

设计模式

设计模式原则

开闭原则

里氏代换原则

依赖倒转原则

接口隔离原则

迪米特法则(最少知道原则)

合成复用原则

创建型设计模式

单例模式

抽象工厂模式

创造者模式

工厂模式

原型模式

结构型设计模式

适配器模式

桥接模式

装饰模式

组合模式

外观模式

享元模式

代理模式

行为型设计模式

模板方法模式

命令模式

迭代器模式

观察者模式

中介者模式

备忘录模式

解释器模式

状态模式

策略模式

责任链模式

访问者模式

框架相关

MyBatis

Hibernate

Spring

Spring MVC

Spring Boot

Spring Security

Spring Cloud

工具篇

Git

maven

Idea