泛型
- 什么是泛型?有什么用?
泛型是jdk5引入的新特性,通过泛型可以提高代码的可读性和稳定性;当我们使用泛型时,传入的对象类型必须是指定的泛型类型,否则就会报错
- 泛型的使用方式有哪些?
一是泛型类
二是泛型接口
三是泛型方法
泛型类,一般在实例化的时候需要指定泛型的类型
java
public class Person<T>{
private String name ;
public Person<T>{
}
}
实例化
Person<ming> person = new Person<ming>
泛型接口,
java
public interface Generator<T> {
public T method();
}
// 实现接口,指定泛型类型
class GeneratorImpl<T> implements Generator<String>{
@Override
public String method() {
return "hello";
}
}
// 实现接口,不指定泛型类型
class GeneratorImpl<T> implements Generator<T>{
@Override
public T method() {
return "hello";
}
}
泛型方法
java
public static < E > void printArray( E[] inputArray )
{
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
在泛型方法中,泛型只是一个占位符,使用了泛型的方法是一个静态方法,表示我们使用这个方法可以是任意类型的数组
作为一个静态的方法,由于静态方法是先于类加载的,所有对于泛型方法,是不能使用泛型类指定的类型的,只能使用自己声明的泛型
- 项目中哪里用到泛型?
一是自定义的通用接口返回类,使用泛型可以做到返回结果的统一化
二是定义Excel处理类,用于动态的导出数据类型
三是构建集合处理类(比如Collections 中的 sort, binarySearch 方法)
反射
- 什么是反射?优缺点
反射在很多框架都有体现,主要的作用就是在运行时,可以分析类或者执行类的方法,并且可以直接通过获取到一个类的所有方法和属性,给我们提供了便利。
缺点就是会有安全的问题出现,比如反射会无视泛型类型的安全检查,因为泛型类型的安全检查是在编译时期执行的。
根据反射的概念,反射是在运行时分析类和执行类的方法的 - 反射的应用场景?
Java的注解
Spring 的注解
基于反射的分析类,获取到类,属性,方法,方法上的参数 上的注解,获取到注解之后,可以进行进一步的处理。
SPI
- 什么是SPI?
SPI就是服务提供者接口,是专门提供给开发者的接口,一般提供一些扩展框架功能 - SPI和API的区别?
API 应用程序编程接口,一个API 表示的是,接口的功能有服务的提供者来实现,包括一些接口的规则,详细的功能,提供一个接口给外界的人使用,调用方不需要知道内部的核心,只需要知道怎么使用调用接口即可
SPI 服务提供者接口,接口的规则有调用方来确认,提供给不同的服务开发者进行开发,开发出来的结果都是符合接口调用方的要求。
序列化和反序列化
- 序列化和反序列化分别是什么?
序列化在Java中是对 对象 进行序列化。
当我们要进行网络传输的时候,我们就需要将数据结果或者对象进行序列化,或者是要将文件存储到数据库的之前,存储到缓存之前都需要进行序列化。
反序列化就是当我们要从数据库,缓存,redis等取出数据的时候,都需要进行反序列化。 - 序列化对应TCP/IP4层模型的哪一层?
TCP/IP4层模型从上到下分别是 应用层,传输层,网络层,网络接口层。
OSI 七层模型从上到下分别是 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。
OSI模型中的表现层是将应用层的数据进行解码,数据处理的,也就是将对象,数据接口转化为二进制流,所以,序列化对应的是OSI模型的表现层,对应TCP/IP则是应用层。
TCP/IP 4层模型 的应用层 包含了 OSI模型的应用层,表示层和会话层 - 如果有些字段不想序列化怎么办?
给不想序列化的字段(变量)添加transient关键字。
transient关键字不能用在类和方法上。
static 修饰的变量无论有没有添加关键字transient都是不支持序列化的。 - 常见的序列化协议
Hessian、Kryo、Protobuf、ProtoStuff - 为什么不使用JDK自带的序列化?
因为不支持跨语言调用
性能差
存在安全问题
Java IO流
- 什么是IO流
IO流就是输入输出流,在Java中分为输入流和输出流
根据数据的处理方式又分为 字符流 和 字节流
语法糖
代指的是编程语言为了方便程序员开发程序而设计的一种特殊语法,这种语法对编程语言的功能并没有影响。实现相同的功能,基于语法糖写出来的代码往往更简单简洁且更易阅读。
Java虚拟机不能够识别Java的语法糖,必须相同Java的编译器进行解糖之后才能被Java虚拟机识别。
- 常见的语法糖有哪些?
泛型,自动装箱,自动拆箱,变长参数,枚举,内部类,增强for循环等等。
根据javaguide总结
https://javaguide.cn/home.html