Java后端-校招机考及面试知识考点整理(持续更新中!)

Java后端-校招知识考点整理

介于我近期机考面试不分大小厂,总有技术性碰壁,又想重新养成十年前发文做总结的习惯,我把我所有的遇到的知识点进行了整理,本文是关于Java后端的,在我找到工作前,会持续更新!尽情关注,欢迎评论区指正问题!等我找到工作了,我会重新做更好的整理版本进行发布!目前请快速浏览目录找到想看的知识点,如果某知识点只有标题,我会于近期尽快补上内容。(点个收藏鼓励下我吧,谢谢!)


本文存在很多空标题,目前虽已不再面试,但知识点会在之后补上,一定!


继承、封装、多态

final & static

final

  • final可以修饰属性。
    • 对于基本类型数据,final会将其值变为一个常数,创建后不能被修改。
    • 对于引用类型数据,final会将其引用地址变为一个常数,进行声明时必须初始化到一个具体的对象,创建后不能再指向另一个对象,但是对象的本身是可以修改的。
  • final修饰的方法表示该方法在子类中不能被重写。
  • final修饰的类表示该类不能被继承。

static

  • static修饰的属性、方法、代码段跟该类的具体对象无关,不创建对象也能调用static修饰的属性、方法等。
  • 被static修饰的成员变量叫做静态变量,也叫做类变量,这个变量是属于这个类的。
  • static修饰方法的时候,可以直接通过类名来进行调用。
  • 一个类要被声明为static的,只有一种情况,就是静态内部类。
    • 静态内部类可以被单独初始化。
    • 静态内部类跟静态方法一样,只能访问静态的成员变量和方法,不能访问非静态的方法和属性,但是普通内部类可以访问任意外部类的成员变量和方法。
    • 静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法。
    • 静态内部类使用场景一般是当外部类需要使用内部类,而内部类无需外部类资源,并且内部类可以单独创建的时候会考虑采用静态内部类的设计。

abstract & interface

abstract

  • abstract一般用来修饰类和方法。
  • abstract修饰类,会使得类变成抽象类。
    • 一个类只能继承一个抽象类。
    • 抽象类不能生成实例,但是可以作为对象变量声明的类型,也就是编译时类型。
    • 抽象类虽然不能实例化,但是有自己的构造方法。
    • 抽象类需要子类继承并覆盖其中的方法。
  • abstract修饰方法会使得这个方法变成抽象方法,也就是只有声明,而没有实现,需要子类重写。
  • 有抽象方法的类一定是抽象类,但是抽象类不一定有抽象方法。
  • 父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现了,子类才有创建对象实例的能力,否则子类也必须是抽象类。

interface

  • 接口支持多继承。
  • 接口不是被类继承了,而是要被类实现,一个类却可以实现多个接口。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为public static final变量。
  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为public abstract方法。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

String & StringBuffer & StringBuilder

三者底层均是由CharSequence字符序列实现。

String

  • 值不可变。
  • 每次对String的操作都会生成新的String对象。

StringBuffer

  • 值可变、效率低、线程安全(所有public方法均被synchronized修饰)。
  • 适用于多线程操作同一个StringBuffer的场景。
  • 每个对象有缓冲区,可自动扩容,toString()时直接使用缓存区的char[] toStringChache值构造字符串。

StringBuilder

  • 值可变、效率高、线程不安全。
  • 适用于单线程操作StringBuilder进行字符串修改。
  • 无缓冲区,每次toString()需先复制一次数组再构造字符串。

正则regex

快速排序

/*
    quickSort 快速排序:
        int[] sourceArray 源数组
        EXSORT_TYPE sortType 排序方式
 */
public static void quickSort(int[] sourceArray, EXSORT_TYPE sortType) {
    if (sourceArray == null || sourceArray.length < 2) return;
    // Arrays.sort(sourceArray, (v1, v2) -> v1[0] - v2[0]); //ASCENT
    qs(sourceArray, sortType, 0, sourceArray.length - 1);
}

/*
    qs 快速排序的递归实现:
        pivot 中轴
        index 中轴的下一个
 */
private static void qs(int[] sourceArray, EXSORT_TYPE sortType, int left, int right) {
    if (left < right) {
        int temp;
        // pivot = left
        // index = pivot + 1
        // 上面为正常写法,为节约一个pivot参数,只保留index和left
        int index = left + 1;
        for (int i = index; i <= right; i++) {
            if ((sortType == EXSORT_TYPE.ASCENT && sourceArray[i] < sourceArray[left]) || 
                (sortType == EXSORT_TYPE.DESCENT && sourceArray[i] > sourceArray[left])) {
                temp = sourceArray[i];
                sourceArray[i] = sourceArray[index];
                sourceArray[index] = temp;
                index++;
            }
        }
        temp = sourceArray[left];
        sourceArray[left] = sourceArray[index - 1];
        sourceArray[index - 1] = temp;
        qs(sourceArray, sortType, left, (index - 1) - 1);
        qs(sourceArray, sortType, (index - 1) + 1, right);
    }
}

归并排序


堆排序


Collection & Collections

  • Collection 是接口,它的方法就是抽象方法,不能直接使用。
  • Collections 是具体的工具类,提供一些静态的对于 Collection 的方法,比如排序、查找等。

Comparable & Comparator

Comparable

  • Comparable位于包 java.lang 下。
  • Comparable是一个接口,且只提供一个需要实现的抽象方法compareTo(T o)。
  • 实现Comparable接口的类,往往进行自比较。

Comparator

  • Comparator位于包 java.util 下。
  • Comparator也是一个接口,但提供了诸多方法,例如compare(T o1, T o2)。
  • 实现Comparator接口可制作一个专用比较器,通过策略模式,不让需比较对象进行自比较,而通过比较器(策略对象)来进行比较。

List & Set & Map

Object类、hashCode()、equals()、toString()

Hash

Iterator

Clonable & Serializable

进程、线程、线程状态、线程池

synchronized & Lock & AtomicXXX & volatile & asynchronous

死锁

JDK & JRE & JVM

类的加载 & 垃圾回收

面向对象的六原则一法则

  • 开闭原则:软件实体应当对扩展开放,对修改关闭。
  • 依赖倒转原则:面向接口编程。
  • 里氏替换原则:任何时候都可以用子类型替换掉父类型。
  • 接口隔离原则:接口要小而专,绝不能大而全。
  • 合成聚合复用原则:优先使用聚合或合成关系复用代码。
  • 迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。

单例模式、工厂模式、代理模式、适配器模式……

Java 8 新特性

  • Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
  • 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
  • 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
  • Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
  • Date Time API − 加强对日期与时间的处理。
  • Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。

HTTP & HTTPS & SSL & TLS

  • http即超文本传输协议,其信息是明文传输;https协议则是包含了SSL加密层(Secure Socket Layer 安全套接层)的安全性传输协议。
  • http和https使用的是完全不同的连接方式,用的端口也不一样,http是80,https是443。
  • http的连接很简单,是无状态的;Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
  • TLS(Transport Layer Security,传输层安全协议)建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。

HTTP方法、HTTP状态码

HTTP常见的8种请求方法

方法 描述
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT 预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。

HTTP状态码 分类

类别 原因
1XX Informational(信息性状态码) 接受的请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 需要进行附加操作已完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务器错误状态码) 服务器处理请求出错

反射 & 函数调用

Class.forName().getMethod().invoke();
object.getClass().getMethod().invoke();

ORM、MVC、REST、RPC

Spring、AOP、IOC、DI……

Redis

MySQL

数据库事务ACID

事务特性 描述
原子性(Atomicity,或称不可分割性) 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Consistency) 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性(Isolation,又称独立性) 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性持久性(Durability) 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

数据库范式

  • 第一范式(1NF):数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
  • 第二范式(2NF):满足第一范式,非码属性必须完全依赖于候选码。
  • 第三范式(3NF):满足第二范式,任何非主属性不依赖于其它非主属性。
  • 巴斯-科德范式(BCNF):满足第三范式,任何非主属性不能对主键子集依赖。
  • 第四范式(4NF):满足第三范式,将包含多对多的表进行表的拆分,形成多个一对多新表。
  • 第五范式(5NF):满足第四范式,尽可能的把表拆到不能再拆了。

你可能感兴趣的:(Java后端,java,面试,数据库)