Java基础面试题-5day

泛型

  1. 什么是泛型?有什么用?

泛型是jdk5引入的新特性,通过泛型可以提高代码的可读性和稳定性;当我们使用泛型时,传入的对象类型必须是指定的泛型类型,否则就会报错

  1. 泛型的使用方式有哪些?

一是泛型类

二是泛型接口

三是泛型方法

泛型类,一般在实例化的时候需要指定泛型的类型

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();
    }

在泛型方法中,泛型只是一个占位符,使用了泛型的方法是一个静态方法,表示我们使用这个方法可以是任意类型的数组

作为一个静态的方法,由于静态方法是先于类加载的,所有对于泛型方法,是不能使用泛型类指定的类型的,只能使用自己声明的泛型

  1. 项目中哪里用到泛型?

一是自定义的通用接口返回类,使用泛型可以做到返回结果的统一化

二是定义Excel处理类,用于动态的导出数据类型

三是构建集合处理类(比如Collections 中的 sort, binarySearch 方法)

反射

  1. 什么是反射?优缺点
    反射在很多框架都有体现,主要的作用就是在运行时,可以分析类或者执行类的方法,并且可以直接通过获取到一个类的所有方法和属性,给我们提供了便利。
    缺点就是会有安全的问题出现,比如反射会无视泛型类型的安全检查,因为泛型类型的安全检查是在编译时期执行的。
    根据反射的概念,反射是在运行时分析类和执行类的方法的
  2. 反射的应用场景?
    Java的注解
    Spring 的注解
    基于反射的分析类,获取到类,属性,方法,方法上的参数 上的注解,获取到注解之后,可以进行进一步的处理。

SPI

  1. 什么是SPI?
    SPI就是服务提供者接口,是专门提供给开发者的接口,一般提供一些扩展框架功能
  2. SPI和API的区别?
    API 应用程序编程接口,一个API 表示的是,接口的功能有服务的提供者来实现,包括一些接口的规则,详细的功能,提供一个接口给外界的人使用,调用方不需要知道内部的核心,只需要知道怎么使用调用接口即可
    SPI 服务提供者接口,接口的规则有调用方来确认,提供给不同的服务开发者进行开发,开发出来的结果都是符合接口调用方的要求。

序列化和反序列化

  1. 序列化和反序列化分别是什么?
    序列化在Java中是对 对象 进行序列化。
    当我们要进行网络传输的时候,我们就需要将数据结果或者对象进行序列化,或者是要将文件存储到数据库的之前,存储到缓存之前都需要进行序列化。
    反序列化就是当我们要从数据库,缓存,redis等取出数据的时候,都需要进行反序列化。
  2. 序列化对应TCP/IP4层模型的哪一层?
    TCP/IP4层模型从上到下分别是 应用层,传输层,网络层,网络接口层。
    OSI 七层模型从上到下分别是 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。
    OSI模型中的表现层是将应用层的数据进行解码,数据处理的,也就是将对象,数据接口转化为二进制流,所以,序列化对应的是OSI模型的表现层,对应TCP/IP则是应用层。
    TCP/IP 4层模型 的应用层 包含了 OSI模型的应用层,表示层和会话层
  3. 如果有些字段不想序列化怎么办?
    给不想序列化的字段(变量)添加transient关键字。
    transient关键字不能用在类和方法上。
    static 修饰的变量无论有没有添加关键字transient都是不支持序列化的。
  4. 常见的序列化协议
    Hessian、Kryo、Protobuf、ProtoStuff
  5. 为什么不使用JDK自带的序列化?
    因为不支持跨语言调用
    性能差
    存在安全问题

Java IO流

  1. 什么是IO流
    IO流就是输入输出流,在Java中分为输入流和输出流
    根据数据的处理方式又分为 字符流 和 字节流

语法糖

代指的是编程语言为了方便程序员开发程序而设计的一种特殊语法,这种语法对编程语言的功能并没有影响。实现相同的功能,基于语法糖写出来的代码往往更简单简洁且更易阅读。

Java虚拟机不能够识别Java的语法糖,必须相同Java的编译器进行解糖之后才能被Java虚拟机识别。

  1. 常见的语法糖有哪些?
    泛型,自动装箱,自动拆箱,变长参数,枚举,内部类,增强for循环等等。

根据javaguide总结
https://javaguide.cn/home.html

相关推荐
king96662 分钟前
python动态全局缓存配置
python·缓存
极客先躯2 分钟前
高级java每日一道面试题-2025年01月24日-框架篇[SpringMVC篇]-SpringMVC常用的注解有哪些?
java·springmvc·常用的注解
咕德猫宁丶7 分钟前
Spring Boot 邂逅Netty:构建高性能网络应用的奇妙之旅
java·spring boot·后端
西猫雷婶8 分钟前
python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算
开发语言·python·opencv
_板栗_10 分钟前
Java8 - flatMap() 介绍
java·stream
C++小厨神12 分钟前
C#语言的函数实现
开发语言·后端·golang
qwe35263314 分钟前
自定义数据集使用scikit-learn中的包实现线性回归方法对其进行拟合
开发语言·python
计算机学姐20 分钟前
基于微信小程序的网上订餐管理系统
java·vue.js·spring boot·mysql·微信小程序·小程序·intellij-idea
博一波21 分钟前
【设计模式-行为型】访问者模式
java·设计模式·访问者模式
S-X-S22 分钟前
OpenAI模块重构
开发语言·重构·openai