当前位置: 首页 > news >正文

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

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();// 对象序列化写入outputStreamObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);// 将对象obj写入outputStreamobjectOutputStream.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

简单易用,性能低

相关文章:

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

JAVA 基础 JVM JDK JRE JVM java虚拟机&#xff0c;针对不同的系统&#xff0c;使用相同的字节码会给出相同结果。一次编译&#xff0c;随处可运行 JDK Java SDK 提供给开发者使用&#xff0c;创建和编译Java程序。包含了JRE&#xff0c;同时包含了其它工具&#xff08;jav…...

【JavaSE】Java基础语法(二十八):HashSet集合

文章目录 1. HashSet集合概述和特点2. HashSet集合的基本应用3. 哈希值4. HashSet集合存储学生对象并遍历【应用】 1. HashSet集合概述和特点 底层数据结构是哈希表存取无序不可以存储重复元素没有索引,不能使用普通for循环遍历 2. HashSet集合的基本应用 存储字符串并遍历 …...

压缩感知重构之匹配追踪算法

算法的重构是压缩感知中重要的一步&#xff0c;是压缩感知的关键之处。因为重构算法关系着信号能否精确重建&#xff0c;国内外的研究学者致力于压缩感知的信号重建&#xff0c;并且取得了很大的进展&#xff0c;提出了很多的重构算法&#xff0c;每种算法都各有自己的优缺点&a…...

【SpinalHDL快速入门】4.6、复合类型之Vec

文章目录 1.1、描述1.2、声明1.2.1、实例 1.3、运算符1.3.1、比较&#xff08;Comparison&#xff09;1.3.2、类型转换&#xff08;Type cast&#xff09;1.3.3、杂项&#xff08;Misc&#xff09;1.3.4、Lib辅助函数&#xff08;Lib helper functions&#xff09; 1.1、描述 …...

探访世优科技数字人虚拟直播产品体系 | 世优开放日再次成功举行

2023年5月30日&#xff0c;世优科技全栈技术产品体验活动&#xff08;第二期&#xff09;顺利落下帷幕。此次活动共邀请到30余位各行各业的嘉宾到场&#xff0c;在两个多小时的开放日活动中&#xff0c;世优科技全面展示数字人及虚拟直播领域的技术产品体系。来访嘉宾们全程体验…...

有奖励!2023陕西省首台(套)重大技术装备产品项目申报条件、认定材料

本文整理了2023陕西省首台&#xff08;套&#xff09;重大技术装备产品项目申报条件&#xff0c;认定材料等相关内容&#xff0c;感兴趣的朋友快跟小编一起来看看吧&#xff01; 一、重点支持方向及领域 重点支持方向及领域&#xff1a;高档工业母机、电力装备、大型矿山和冶金…...

2023/6/6总结

CSS 如果想要实现背景颜色渐变效果&#xff1a; left是从左边开始&#xff0c;如果想要对角线比如&#xff0c;左上角就是left top&#xff0c;渐变效果始终是沿着一条线来实现的。 下面是跟着视频教学用flex布局写的一个移动端网页&#xff1a; html代码&#xff1a; <!…...

api习题

// 1 整数或者小数 // String a"378.000"; // String rex"[1-9]\\d*|[0-9]|*\\.[0-9]*"; // System.out.println(a.matches(rex)); // 2 只能输入数字&#xff1a; // String rex"\\b*"; // 3 只能输入n位的数字&#xff1a; // String r…...

(STL之string)string类的用法详解

string类成员函数PART1 成员函数(构造函数拷贝构造函数)&#xff1a;string 函数原型&#xff1a; string(); string (const string& str); string (const string& str, size_t pos, size_t len npos); string (const char* s); string (const char* s, size_t n)…...

基于RT-Thread快速上手SD NAND 虚拟文件系统

SD NAND 也称之为贴片式TF卡&#xff0c;贴片式SD卡&#xff0c;采用标准的SDIO接口&#xff0c;兼容SPI接口。下图所示为CS 新一代CS SD NAND NP1GCR01-AOW 大小为128M&#xff0c;对比128M的SD卡&#xff0c;可以看到贴片SD卡尺寸更小&#xff0c;不要SD卡座&#xff0c;占…...

性能测试实战

目录 一、创建线程组与http(s)请求1、JMeter关键词2、创建线程组3、线程组参数举例说明案例1:模拟5个用户,同时访问百度案例2:模拟5个用户,同时访问百度,并且循环2次案例3:模拟5个线程,持续执行10秒的时间案例4:模拟10秒启动10个线程,循环执行20秒4、创建http请求a、操…...

【PWN · 总结】system返回shell(‘/bin/sh‘、‘sh‘、$(0))

pwn题中要通过system/excute等返回shell&#xff0c;进而cat flag。今天遇到一题&#xff0c;参数$(0)也可返回&#xff0c;有必要记录一下。 目录 前言 一、/bin/sh 1.strings 2.IDA 3.pwntools 4.ROPgadget 5.libc中寻找 二、sh 三、$(0) exp IDA查看机器码 …...

《庄子》笔记

庄子 前述&#xff1a;庄子&#xff0c;战国时宋国人。 1.鲲鹏&#xff1a;胸襟宽广&#xff0c;高远&#xff0c;无界限。 2.寒蝉和灵龟&#xff1a;小年的悲哀。 3.小麻雀的得意&#xff1a;境界不同&#xff0c;又有什么可比性呢。 4.列子随风而行&#xff1a;得大道者&…...

五、VBO、EBO 和 VAO

五、VBO、EBO 和 VAO VBO、EBO 和 VAO&#xff1a; VBO&#xff08;Vertex Buffer Object&#xff09;是指顶点缓冲区对象&#xff0c;而 EBO&#xff08;Element Buffer Object&#xff09;是指图元索引缓冲区对象&#xff0c;VAO 是顶点数据的缓冲区对象&#xff0c;VAO 和…...

数据库期末复习(7.2)查询优化

查询优化的概述 商用数据库花了很多的资金投入到查询优化。 查询优化的分类 逻辑查询优化 物理查询优化 比逻辑查询计划多了怎么去执行的方式,为的是数据操作速度更快 逻辑查询优化的三种关键技术 在科学研究的道路上我们往往不是一帆风顺的,人的认识也是局限的,但是我…...

深入探索:在std::thread中创建并管理QEventLoop的全面指南

深入探索&#xff1a;在std::thread中创建并管理QEventLoop的全面指南 1. 前言&#xff1a;理解QEventLoop和std::thread的基本概念1.1 QEventLoop的基本概念和工作原理1.2 std::thread的基本概念和工作原理1.3 QTimer的基本概念和工作原理 2. 在std::thread中创建QEventLoop&a…...

【Netty】Netty中的超时处理与心跳机制(十九)

文章目录 前言一、超时监测二、IdleStateHandler类三、ReadTimeoutHandler类四、WriteTimeoutHandler类五、实现心跳机制5.1. 定义心跳处理器5.2. 定义 ChannelInitializer5.3. 编写服务器5.4. 测试 结语 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#…...

尚硅谷大数据hadoop教程_mapReduce

p67 课程介绍 p68概述 p69 mapreduce核心思想 p70 wordcount源码 序列化类型 mapReduce三类进程 p71 编程规范 用户编写的程序分成三个部分&#xff1a;Mapper、Reducer和Driver。 P72 wordcount需求案例分析 p 73 -78 案例环境准备 &#xff08;1&#xff09;创建maven…...

一键启停脚本

在/root 目录下创建bin文件夹再创建你的文件 文件里面写如下命令 #!/bin/bash if [ $# -lt 1 ] then echo "No Args Input..." exit ; fi case $1 in "start") echo " 启动集群 " echo " --------------- 启动 -------…...

20230604_Hadoop命令操作练习

20230604_Hadoop命令操作示例 再HDFS中创建文件夹&#xff1a;/itcast/it heima&#xff0c;如存在请删除&#xff08;跳过回收站&#xff09;。 hdfs dfs -mkdir -p /itcast/itheima上传/etc/hosts文件到hdfs的/itcast/itheima内。 hadoop fs -put /etc/hosts /itcast/itheima…...

hashCode 与 equals(重要)?

hashCode () 作用是获取哈希码&#xff0c;也称为散列码&#xff0c;实际上是返回一个int 整数&#xff0c;哈希码作用是确定该对象在哈希表中的索引位置&#xff1b;hashCode() 定义在JDK的Object.java中&#xff0c;意味着Java中的任何类都包含有hashCode() 函数。 散列表存…...

华为OD机试(2023.5新题) 需要打开多少监控器(java,py,c++,js)

华为OD机试真题目录:真题目录 本文章提供java、python、c++、jsNode四种代码 题目描述 某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开 给出某一时刻停车场的停车分布,请统计最少需要打开…...

209.长度最小的子数组

2023.6.1 这道题的关键是滑动窗口法&#xff0c;滑动窗口法应设定好窗口左侧的右移条件与窗口右侧的移动条件 本例中先初始化好用到的各种值 循环的终止条件是滑动窗口右侧超出列表的范围 走来 cur_sum nums[right] 是将cur_sum的值更新为当前滑动窗口[left,right]的值之和 接…...

react antd Modal里Form设置值不起作用

问题描述&#xff1a; react antd Modal里Form设置值不起作用&#xff0c;即使用form的api。比如&#xff1a;编辑时带出原有的值。 造成的原因&#xff1a;一般设置值都是在声明周期里设置&#xff0c;比如&#xff1a;componentDidMounted里设置&#xff0c;hook则在useEff…...

idea连接Linux服务器

一、 介绍 配置idea的ssh会话和sftp可以实现对linux远程服务器的访问和文件上传下载&#xff0c;是替代Xshell的理想方式。这样我们就能在idea里面编写文件并轻松的将文件上传到linux服务器中。而且还能远程编辑linux服务器上的文件。掌握并熟练使用&#xff0c;能够大大提高我…...

在windows环境下使用winsw将jar包注册为服务(实现开机自启和配置日志输出模式)

前言 Windows系统使用java -jar m命令行运行Java项目会弹出黑窗。首先容易误点导致程序关闭&#xff0c;其次我们希望能在Windows系统做到开机自动启动。因此对于SpringBoot程序&#xff0c;目前主流的方法是采用winsw&#xff0c;简单容易配置 1.下载winsw工具 https://git…...

汽车通用款一键启动舒适进入拓展蓝牙4G网络手机控车系统

1.PKE无钥匙舒适进入功能,靠近车门自动开锁,离开车门自动上锁 2.一键启动/熄火 3.远程遥控启动/熄火 4.遥控设防盗/解除防盗 5.遥控开后尾箱锁负信号输出(需要原车自带尾箱马达和继电器&#xff09; 6.静音防盗/解除防盗 7.启动车后踩脚刹自动上锁 8.熄火车辆后自动开锁…...

QSettings Class

QSettings类 QSettings类公共类型&#xff08;枚举&#xff09;公有成员函数静态成员函数函数作用这个类写文件的特征 QSettings类 QSettings类提供持久的独立于平台的应用程序设置。 头文件:#include< QSettings >qmake:QT core继承&#xff08;父&#xff09;:QObje…...

【vue】关于vue中的插槽

当在Vue.js中构建可复用的组件时&#xff0c;有时候需要在父组件中传递内容给子组件。Vue的插槽&#xff08;slot&#xff09;机制提供了一种灵活的方式来实现这种组件间通信。 插槽允许你在父组件中编写子组件的内容&#xff0c;然后将其传递给子组件进行渲染。这样&#xff…...

Springboot整合Mybatis Plus【超详细】

文章目录 Mybatis Plus简介快速整合1&#xff0c;导入依赖2&#xff0c;yml文件中配置信息3&#xff0c;启动类上加上扫描mapper接口所在包的注解4&#xff0c;编写配置类5&#xff0c;实现自动注入通用字段接口&#xff08;非必需&#xff09;6&#xff0c;编写生成器工具类 使…...