JAVA面试八股整理——基础部分

news2025/1/19 20:25:50

JAVA

基础

JVM JDK JRE

JVM java虚拟机,针对不同的系统,使用相同的字节码会给出相同结果。一次编译,随处可运行

JDK Java SDK 提供给开发者使用,创建和编译Java程序。包含了JRE,同时包含了其它工具(java 源码的编译器 javac 等)

JRE Java运行环境,包含JVM和基础类库

在这里插入图片描述

编译相关

字节码

JVM可以理解的代码叫字节码(.class文件),只面向虚拟机,解决了传统解释性语言效率低的问题,又保留了解释性语言可移植的特点。

在这里插入图片描述

JIT编译器

.class - > 机器码,首先加载字节码文件,然后解释器逐行解释执行,如果代码块经常被调用(热点代码),JIT在第一次编译后将机器码保存下来,下次直接使用。

根据二八定律,消耗大部分资源的只有一小部分代码(热点代码),即JIT需要编译的部分。JIT需要预热,达到一定时间和调用频率才会触发JIT分层

AOT

直接将字节码编译成机器码,避免预热。但不能根据程序运行情况进一步优化。代码经常更新的话每次都需要重新编译。

编译与解释并存

编译:将源代码一次性翻译成可被该平台执行的机器码(C++)开发慢,执行快

解释:一句一句的将代码解释(interpret)为机器代码后再执行(Python)开发快,执行慢

Java程序要先经过编译,生成字节码,再由Java解释器执行

数据类型&变量

基本数据类型、包装类型

基本数据类型

整数型:byte short int long

浮点数:float double

字符:char

布尔:boolean

包装类型(引用类型)

包装类型可用于泛型,基本类型不行

基本数据类型的局部变量存放于虚拟机栈的局部变量表,成员变量放在堆中;包装类型属于对象类型,放在堆

基本数据类型占用空间小

包装类型不赋值时为null,基本数据类型有默认值

基本数据类型 == 比较真值,包装类型 == 比较地址;整型包装类型之间的比较用 equals

包装类型的缓存

整型(-128~127)、布尔、字符默认创建了缓存数据,如 Integer i1 = 40; 直接使用了缓存中的对象

自动装箱、拆箱

装箱:基本类型->引用类型

拆箱:引用类型->基本类型

  • Integer i = 10 等价于 Integer i = Integer.valueOf(10)
  • int n = i 等价于 int n = i.intValue()

浮点数计算 及 BigDecimal

精度丢失:无限循环的小数储存在计算机会被截断,没办法用二进制精确表示

浮点数之间的等值判断,基本数据类型不能用 == 来比较,包装数据类型不能用 equals 来判断

BigDecimal 可以实现对浮点数运算不丢精度

BigInteger

超过long:BigInteger内部用int[]储存任意大小的整型数据

静态变量

static 被类的所有实例共享,所有对象共享同一份静态变量,节省内存。通常静态变量会被final修饰成常量。

字符常量&字符串常量

字符常量相当于一个整型值(ASCII),可以参加运算;字符串常量表示一个地址(字符串在内存中的位置)

char占两个字节

方法

面向对象三大特性:封装、继承、多态

静态方法

静态方法不能调用非静态成员:静态方法属于类,类加载时分配内存,可通过类名直接访问;非静态成员属于对象,实例化后才能存在。

调用可以使用 类名.方法名对象.方法名

只允许访问静态成员

重载&重写

重载:一个方法根据输入不同,处理不同。参数类型、个数、顺序不同,返回值,修饰符可以不同

重写:子类继承父类相同方法,覆盖父类方法。参数列表相同,返回值、抛出异常范围应该小于等于父类,访问修饰符范围大于等于父类(两同两小一大)

可变参数只能作为最后一个参数,重载优先匹配固定参数

面向对象

基础

面向过程:过程拆解成一个个方法

面向对象:抽象出对象,用对象执行方法

对象

实例和引用

new 创建对象实例(对象实例在堆内存),对象引用(在栈内存)指向实例

气球和绳子:一个实例可有多个引用

对象相等

对象相等:内存中内容相等

引用相等:指向的内存地址相等

构造方法

没有声明构造方法也可执行(默认无参构造)

不能重写(overwrite),但能重载(overload)

三大特征

封装

对象的状态信息隐藏在内部,不允许外部直接访问对象内部信息,提供方法给外界。

继承

子类可以增加新的数据或功能,也可以用父类的,但不能选择性继承。

  • 子类能拥有父类对象的私有属性和方法,但无法访问
多态

父类的引用指向子类的实例

Animal animal1 = new Dog();

对象类型和引用类型间有继承(类)/实现(接口)关系

多态不能调用“只存在于子类不存在于父类”的方法

接口&抽象类

共同点

  • 不能被实例化
  • 可以包含抽象方法
  • 都可以使用默认方法(default,实现类没有提供自己的实现,将使用接口中的默认实现方法)

区别

  • 接口主要对类的行为约束;抽象类强调所属关系
  • 一个类只能继承一个类,但可以实现多个接口
  • 接口中的成员变量只能是 public static final 类型的;抽象类成员变量默认default,可以在子类重新定义赋值

深拷贝&浅拷贝

浅拷贝:堆上创建一个新对象,原对象内部是引用对象的话,会直接复制内部对象的地址,即共用一个内部对象

实现Cloneable接口,调用父类Object的clone方法

深拷贝:完全复制整个对象,包括内部对象

序列化和反序列化

public class DeepCopy {
    public static void main(String[] args) {

    }

    // 泛型类型参数必须实现 Serializable 接口
    public static <T extends Serializable> T deepClone(T obj) throws IOException, ClassNotFoundException {
        // 对象写入字节流。序列化
        // 对象写入字节数组
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // 对象序列化写入outputStream
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        // 将对象obj写入outputStream
        objectOutputStream.writeObject(obj);
        
        // 从字节流读取对象,反序列化
        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        return (T) objectInputStream.readObject();
    }
}

class User implements Serializable {
    String name;
    Address address;

    public User(String name, Address address) {
        this.name = name;
        this.address = address;
    }
}

class Address {
    String province;
    String city;

    public Address(String province, String city) {
        this.province = province;
        this.city = city;
    }
}

Object

Object常见方法

hashCode: 返回对象的哈希码;
equals: 比较两对象地址是否相等(String重写了该方法)
clone: 浅拷贝
toString: 
wait: 暂停线程
notify、notifyAll: 唤醒线程

== equals

== 对于基本类型比较值,对于引用类型,比较地址(本质也是比较值,但引用类型变量存的地址)

equals 等价于 == ,但一般会重写,来比较属性相等

hashCode

获取哈希码,确定对象在哈希表中的索引位置

与equals

hashcode和equal都是比较对象是否相等,但hashcode效率更高。HashSet对比时,同样的哈希码下再用equals。

两个对象hashcode相等,不一定对象相等(哈希码算法可能重复)

重写equals必须重写hashCode

两对象equals相等时,hashcode一定相等,不然使用hashmap会出现问题(无法正确找到对象)

如果不重写hashcode,equals按属性值比较,hashcode按地址比较

String

String、StringBuffer、StringBuilder

String不可变,故线程安全,每次改变都会生成一个新的String对象。String中使用final修饰的字符数组来保存字符串。

StringBuilderStringBuffer 都继承自 AbstractStringBuilder 类,提供了修改字符串的方法,如 append

StringBuffer 对方法加了同步锁,线程安全;StringBuilder线程不安全

  • StringBuffer StringBuilder类似,代表可变字符序列
  • String不可变,效率低,复用率高(池中存在就不用再创建),需要大量修改的话不用String
  • StringBuffer 效率高,线程安全
  • StringBuilder 效率最高,线程不安全

字符串拼接

字符串 + 实际上是通过StringBuilder调用append方法实现,String的for循环拼接每次循环创建一个StringBuilder,不如直接用StringBuilder拼接效率高。

字符串常量池

JVM为字符串开辟的区域,避免重复创建

// 在堆中创建字符串对象”ab“
// 将字符串对象”ab“的引用保存在字符串常量池中
String aa = "ab";
// 直接返回字符串常量池中字符串对象”ab“的引用
String bb = "ab";
System.out.println(aa==bb);// true
intern

String.intern 将指定字符串对象的引用保存在字符串常量池,若已保存,直接返回该引用

异常

在这里插入图片描述

exception error

exception:程序本身可以处理的异常,可以通过catch捕获

error:程序无法处理的错误,JVM一般会选择线程终止。内存溢出、虚拟机异常等

checked unchecked

checked:没有被catch或throws处理的话没法通过编译,如IO异常

unchecked:不接受检查也可以正常通过编译,由于逻辑错误或环境错误引起,如算术错误、空指针

try

try-catch-finally

finally不一定会运行,如:CPU关闭、线程死亡

泛型

使用方式

泛型类

public class Generic<T>{

泛型接口

public interface Generator<T> {

泛型方法

 public static < E > void printArray( E[] inputArray )

项目用到

自定义一个与CommonResult<T> 接口,接口中的方法 getData() 中使用类型参数 T 来动态指定结果的数据类型。

public interface CommonResult<T> {
    boolean isSuccess();
    String getMessage();
    T getData();
}

工具类

反射

可以在运行时分析类以及执行类中方法,通过反射可以获取任意一个类的所有属性和方法,并调用

原理

反射通过编译后的字节码(class)文件找到其中的信息

应用

在动态代理中,invoke函数中使用反射类Method来调用指定方法

注解也用到了反射,@Value注解就读取到配置文件中的值

优缺点

优点:让代码更灵活,为框架开箱即用的功能提供便利

缺点:安全问题,性能略差

获取class对象

class对象将一个类的信息告诉程序

  1. 知道具体类:
Class alunbarClass = TargetObject.class;
  1. 传入类的全路径 Class.forName
Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");
  1. 通过对象实例 instance.getClass
TargetObject o = new TargetObject();
Class alunbarClass2 = o.getClass();

注解

常用

@Override
 // 覆盖父类方法
@Deprecated
// 标注内容不再被建议使用

解析方法

注解解析后才会被使用

  • 编译器直接扫描:编译时扫描注解并处理,如override
  • 运行期间通过反射处理:如spring中注解

SPI

服务者提供给框架的使用者的接口,运行时动态加载框架。

将服务的接口与具体实现类解耦。

按照规定将要暴露对外使用的具体实现类在固定文件中声明,框架在运行时扫描并加载实现类。

API&SPI

API:实现方提供接口和实现,我们调用接口

SPI:调用方确定接口规则,厂商根据规则实现

优缺点

优点:接口设计灵活

缺点:需要遍历加载所有实现类,效率低

序列化反序列化

序列化:将数据结构或对象转换成二进制字节流

反序列化:将二进制字节流转成数据结构或对象

目的:通过网络传输对象,或储存

属于计算机网络的应用层

序列化协议

JDK自带

不想被序列化:transient修饰

不推荐原因

  • 不支持跨语言
  • 序列化后体积大,传输性能差
  • 安全问题
Hessian

RPC协议,dubbo2.x默认启用序列化协议

JSON

简单易用,性能低

集合

服务者提供给框架的使用者的接口,运行时动态加载框架。

将服务的接口与具体实现类解耦。

按照规定将要暴露对外使用的具体实现类在固定文件中声明,框架在运行时扫描并加载实现类。

API&SPI

API:实现方提供接口和实现,我们调用接口

SPI:调用方确定接口规则,厂商根据规则实现

优缺点

优点:接口设计灵活

缺点:需要遍历加载所有实现类,效率低

序列化反序列化

序列化:将数据结构或对象转换成二进制字节流

反序列化:将二进制字节流转成数据结构或对象

目的:通过网络传输对象,或储存

属于计算机网络的应用层

序列化协议

JDK自带

不想被序列化:transient修饰

不推荐原因

  • 不支持跨语言
  • 序列化后体积大,传输性能差
  • 安全问题
Hessian

RPC协议,dubbo2.x默认启用序列化协议

JSON

简单易用,性能低

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/574353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Deepin 23的最佳新功能和亮点

Deepin是一个基于Linux的操作系统&#xff0c;以其美观、简洁和易用的用户界面而闻名。Deepin 23是Deepin操作系统的最新版本&#xff0c;引入了许多令人兴奋的新功能和亮点&#xff0c;为用户提供了更好的体验和更多的功能。 本文将详细介绍Deepin 23的最佳新功能和亮点。 1…

教你彻底卸载MySQL 并重装(保姆级教程 )

前言&#xff1a;都是自己踩过的坑&#xff08;其他博主也有&#xff0c;不过我的特殊&#xff0c;按步骤走完重新安装仍要输入原密码&#xff0c;本篇主要解决和我问题类似的情况&#xff09;&#xff0c;跟着以下步骤走就行。 步骤一&#xff1a;关闭MySQL服务 右击【计算机】…

@Transactional @Aysnc 循环依赖 事务同步问题

文章目录 学习链接场景最初版本TestControllerTestService问题 Lazy版本 事务同步报错版本&#xff1a;TestServiceLazy正常启动版本&#xff08;有问题&#xff09;Lazy 注册事务同步 学习链接 Async学习及循环依赖 场景 我们要做的事情很简单&#xff1a; 现在我们需要…

高校智能用电管理系统的应用探讨

摘 要&#xff1a;随着现代科学技术的发展&#xff0c;在高校中开始广泛应用智能化技术&#xff0c;改善学生宿舍的用电管理模式&#xff0c;提高宿舍的管理水平&#xff0c;有利于实现高校宿舍用电管理的科学化。本文主要阐述传统高校宿舍用电管理模式&#xff0c;设计高校智能…

tektronix泰克TDS3054B数字荧光示波器

TDS3054B示波器体积小巧、便于携带、可用电池供电&#xff0c;所以可在任何需要的地方使用。安装电池 后&#xff0c;其重量还不到5 公斤。即便是在现场工作&#xff0c;也可通过选购的插入式热敏打印机当场打印测量 结果。 用户还可通过选购的应用模块轻而易举地使TDS3000B 系…

Web3小白科普系列:加密社区行业黑话全解(第一弹)

加密货币的快速发展创造了属于自己的全新语言&#xff0c;其中充满了黑话和首字母缩写&#xff0c;可能会让新手不知所措。本期《Web3小白科普系列&#xff1a;加密社区行业黑话全解》旨在解释加密世界中经常使用的、旁人难以解读的术语。我们将深入探究流行俚语的起源和含义&a…

专转本大忌,老实说这样备考真的考不上

&#xff08;1&#xff09;目标院校定太高&#xff0c;报考全凭主观臆断&#xff0c;没有深入了解学校专业和今年的考情&#xff0c;结果自身实力不够导致错失升本的机会。 &#xff08;2&#xff09;盲目追求学习时间却不追求效率&#xff0c;经常熬夜通宵学习&#xff0c;结…

开发工具---Eclipse 教程Ⅰ

Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。 Eclipse 是 Java 的集成开发环境&#xff08;IDE&#xff09;&#xff0c;当然 Eclipse 也可以作为其他开发语言的集成开发环境&#xff0c;如C&#xff0c;C&#xff0c;PHP&#xff0c;和 Ruby 等。 Eclipse 附带…

JavaScript面向对象编程

在这里插入代码片## 1. 构造函数和new命令 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" con…

PLX31-EIP-MBS 以太网/IP到Modbus串行

PLX31-EIP-MBS ProSoft Technology的EtherNet/IP to Modbus串行通信网关允许在EtherNet/IP PACs或设备与支持Modbus的PACs或设备之间进行高速双向数据传输。 EtherNet/IP PACs包括Rockwell Automation ControlLogix和CompactLogix&#xff0c;以及几款施耐德电气控制器。Mod…

NameServer总结

NameServer是一个注册中心&#xff0c;提供服务注册和服务发现的功能。NameServer可以集群部署&#xff0c;集群中每个节点都是对等的关系&#xff08;没有像ZooKeeper那样在集群中选举出一个Master节点&#xff09;&#xff0c;节点之间互不通信。服务注册 Broker启动的时候会…

Eclipse教程Ⅲ

Eclipse 菜单 Eclipse 查看的菜单栏通常包含以下几个菜单&#xff1a; File 菜单Edit 菜单Navigate 菜单Search 菜单Project 菜单Run 菜单Window 菜单Help 菜单 通过 Eclipse 插件你可以添加新的菜单和菜单项。 菜单描述 菜单名描述FileFile 菜单运行你打开文件&#xff0c;…

同余方程 乘法逆元 扩展欧几里得算法 5.26

同余方程 乘法逆元 扩展欧几里得算法 526 同余方程 乘法逆元 扩展欧几里得算法_哔哩哔哩_bilibili 给定整数a,b,m&#xff0c;求解同余方程axb(mod m). 如果x存在整数解&#xff0c;则输出任意一个&#xff1b; 如果不存在&#xff0c;则输出none 例&#xff1a; 8x4(mod…

动态线程池 dynamic-tp 源码

目录 1. 介绍 2. Spring 环境整合配置源码 2.1 DtpBeanDefinitionRegistrar 2.2 DtpPostProcessorRegistrar 2.3 ApplicationContextHolder 2.4 DtpBaseBeanConfiguration 2. 动态线程池 DtpLifecycle 生命周期源码 3. 动态线程池 DtpRegistry 注册源码 4. 动态线程池…

基于51单片机的两路数字电压表Protues仿真设计

目录 一、设计背景 1.1、数字电压表的发展历程 1.2、课题的意义和目的 二、实现功能 三、仿真演示 四、部分程序展示 一、设计背景 1.1、数字电压表的发展历程 数字电压表简称DVM&#xff0c;它是采用数字化测量技术设计的电压表。从性能来看&#xff1a;数字电压表的发展从…

MYSQL索引连环18问(上)

MYSQL索引连环18问&#xff08;上&#xff09; 1.索引是什么&#xff1f; 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分)&#xff0c;它们包含着对数据表里所有记录的引用指针。索引是一种数据结构。数据库索引&#xff0c;是数据库管理系统中一个排序的…

PLX31-EIP-SIE 以太网/IP到西门子工业以太网

ProSoft Technology的EtherNet/IP to Siemens工业以太网通信网关允许支持EtherNet/IP的控制器或设备与西门子S7 PACs(包括S7-200s、S7-300s、S7-400s、S7-1200和S7-1500 PACs)之间进行高速双向数据传输。 此外&#xff0c;该网关还包括几个功能&#xff0c;包括数据优先级&…

我在GPT小程序开发中踩过的5个坑

坑1&#xff1a;没有充分了解需求 在GPT小程序开发中&#xff0c;充分了解需求十分重要。如果你没有认真地与客户交流&#xff0c;并理解他们的需求和期望&#xff0c;那么你很可能会浪费很多时间在错误的方向上。 坑2&#xff1a;没有使用合适的开发工具 在GPT小程序开发中…

Shell脚本攻略:Shell编程规范与变量

一、理论 1.Shell脚本编程规范 &#xff08;1&#xff09;Shell简介 Linux 系统中的 Shell 是一个特殊的应用程序&#xff0c;它介于操作系统内核与用户之间&#xff0c;充当 了一个“命令解释器”的角色&#xff0c;负责接收用户输入的操作指令&#xff08;命令&#xff09…

从小白到大神之路之学习运维第28天

第二阶段基础 时 间&#xff1a;2023年5月24日 参加人&#xff1a;全班人员 内 容&#xff1a; ISCSI服务 目录 实验构建iscsi服务 实现步骤&#xff1a;以下实验为例 前提配置&#xff1a; 服务器端&#xff1a; 客户端&#xff1a; 注意事项&#xff1a; 实验构…