JAVA后端面试笔记

1.JAVA中==和equals的区别

区别:一个是运算符,一个是方法

==比较变量的值是否相同
①如果比较的对象是基本数据类型,则比较数值是否相等
②如果比较的是引用数据类型,则比较的是对象的内存地址是否相等
equals方法比较对象的内容是否相同
equals方法存在于Object类中,而Object类定义了equals方法

  public boolean equals(Object obj) {return (this == obj);}


①如果类未重写equals方法,会调用Object父类中的equals方法(实际使用的也是==操作符)
②如果类重写了equals方法,则调用自己的equals方法(一般是比较对象的内容是否相等)

@SpringBootApplication
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);System.out.println("Hello World");User user1 = new User("18","520");User user2 = new User("18","520");System.out.println(user1.equals(user2));}
}

实体类

@ApiModel(value = "用户实体类")
public class User {@ApiModelProperty(value = "用户姓名")public String userName;@ApiModelProperty(value = "用户密码")public String passWord;public User(String userName, String passWord) {this.userName = userName;this.passWord = passWord;}
}

比较两个对象是否相等,结果如下

Hello World
false

虽然两个变量的内容是一样的,但由于User类没有重写equals方法,导致调用的equals是父类Object的方法,结果会返回false

重写equals可以使用到@Data,相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集, @EqualsAndHashCode默认是false,表示不调用父类的属性

对添加了@Data的注解的,刚开始测试的操作会返回true,因为user1和user2的内容是一样的

2.String,StringBuffer,StringBuilder区别

2.1 String

String数组是final修饰的,所以线程是安全的,但是不可变的

@SpringBootApplication
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);System.out.println("Hello World");String s1 = "Hello";String s2 = s1;System.out.println("修改前 s1 的身份哈希码:" + System.identityHashCode(s1));System.out.println("修改前 s2 的身份哈希码:" + System.identityHashCode(s2)); // 与 s1 相同s1 += " World";System.out.println("修改后 s1 的身份哈希码:" + System.identityHashCode(s1)); // 新值(新对象)System.out.println("修改后 s2 的身份哈希码:" + System.identityHashCode(s2)); // 旧值(原对象未变)}
}

结果如下,String是引用数据类型,刚开始s1和s2的指向的内容是一样的,所以修改前的身份哈希值是相等的,当s1拼接字符后引用地址发生变化,s1地址身份也发生了变化,但是s2不变

Hello World
修改前 s1 的身份哈希码:1988584481
修改前 s2 的身份哈希码:1988584481
修改后 s1 的身份哈希码:205010614
修改后 s2 的身份哈希码:1988584481

2.2 StringBuffe

可变的,父类AbstractStringBuilder的数组是可变的

方法都用了synchronized,所以线程是安全的

2.3 StringBuilder

可变的,父类AbstractStringBuilder的数组是可变的

线程不安全,无锁,无final修饰符

3.Java之String系列--创建对象的个数及其原理

方式 1:字面量赋值 String s = "abc";

对象个数:0 个或 1 个(取决于常量池是否已存在该字面量)。

  • 存在:将s指向常量池"abc"的引用,不创建新对象(对象个数0)
  • 不存在:在常量池创建一个String对象(内容为"abc"),并将s指向该对象(对象个数1)

方式 2:new String("abc")

检查常量池

  • 若常量池中不存在 "abc",则先在常量池创建 1 个对象(内容为 "abc")。
  • 若已存在,则跳过此步。

创建堆对象

无论常量池是否存在,都会在 堆内存 中创建 1 个新的 String 对象(内容为 "abc"),并将 s 指向堆对象。

所以创建对象的个数为1-2,取决于是否有常量池对象

4.Java之String系列--intern方法的作用及原理

不同版本的jdk对intern方法是有差异的(待梳理)

intern() 方法行为(Java 1.8):

当调用 str.intern() 时,会先检查常量池中是否存在与 str 内容相同的字符串:

  • 存在:返回常量池中该字符串的引用。
  • 不存在:将 str 的引用 添加到常量池(而非复制对象),并返回 str 本身的引用。

== 比较:

比较的是 对象引用地址,而非字符串内容(内容比较需用 equals())。

@SpringBootApplication
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);String s1 = new String("Hello World");s1.intern();String s2 = "Hello World";System.out.println(s1 == s2);System.out.println("---------------------------------------");String s3 = new String("Hello") + new String("World");s3.intern();String s4 = "HelloWorld";System.out.println(s3 == s4);}
}
false
---------------------------------------
true----- s1 == s2
String s1 = new String("Hello World")
这个操作会创建两个对象
对象1:字符串字面量 "Hello World" 被加入 常量池(首次出现时自动入池)。
对象2:在 堆内存 中创建一个新的 String 对象(s1 指向该对象)。
此时:
常量池中存在 "Hello World"(引用地址记为 P)。
s1 指向堆中新建的对象(引用地址记为 H1)。
s1.intern()
调用intern(),常量池存在"Hello world"即地址P
itern()直接返回P,但未改变s1的指向,H1
String s2 = "Hello World"
直接使用字面量赋值,JVM会优先检查常量池
发现常量池存在"Hello World"地址P,因为s2指向P
s1指向H1(堆中新建对象),s2指向P(常量池的引用),地址不同----- s3 == s4
+ 操作符对字符串对象进行拼接时,底层通过StringBuilder 实现,最终返回一个新的堆对象为("HelloWorld")。
关键的是:此时常量池不存在"HelloWorld"字面量,因为拼接是动态生成,未出现字面量"HelloWorld"
s3指向新建的堆对象(引用地址为H3,内容为"HelloWorld"),此时常量池无引用
s3的intern()
s3调用intern(),但是常量池不存在"HelloWorld",因此会将s3的引用H3添加到常量池
但s3的指向仍是堆对象H3
String s4 = "HelloWorld";
s4使用字面量赋值,此时常量池存在"HelloWorld"的引用,即H3,因此s4直接指向H3
s3和s4的指向均指向H3,结果true

5.Java之String系列--String不可变的含义、原因、好处

5.1 String不可变的含义

String不可变的含义是:将一个已有字符串"123"重新赋值成"456",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。

5.2 String为什么不可变

 String的内部数据是一个char数组,被final修饰的,创建后不可改变。

package java.lang;public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];/** Cache the hash code for the string */private int hash; // Default to 0// 其他代码
}

5.3 String不可变的好处

使多线程安全 

加快字符串的处理:这也就是一般将String作为Map的Key的原因,处理速度要快过其它的键对象,所以HashMap中的键往往都使用String。

避免安全问题等等

6.Java--static--用法/使用位置/实例

用法1:修饰成员属性

给属性加了static关键字之后,对象就不再拥有该属性了,该属性会由类去管理,即多个对象只对应一个属性。一般用于定义一些常量。

用法2:修饰成员方法

static修饰成员方法的作用是可以使用"类名.方法名"的方式操作方法,避免了先要new出对象的繁琐和资源消耗。

用法3:修饰代码块

在静态代码块中,可以访问静态变量,调用静态方法

静态代码块(static)只在类加载的时候执行一次,实例代码块在创建对象的时候执行,加载的时候也会执行一次。

@Data
@Component
@NoArgsConstructor
@ApiModel(value = "用户实体类")
public class User {@ApiModelProperty(value = "用户姓名")private String userName;@ApiModelProperty(value = "用户密码")private String passWord;public User(String userName, String passWord) {this.userName = userName;this.passWord = passWord;}{System.out.println("代码块执行了...");}static {System.out.println("静态代码块执行了");}}

创建两个User对象,观察代码块的执行情况

@SpringBootApplication
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);System.out.println("第一次创建");User user1 = new User();System.out.println("第二次创建");User user2 = new User();}
}

执行结果,类第一次加载的时候会执行代码块(无论是否有static修饰),后续创建过程中,只会调用无static修饰的代码块(每次执行都会调用)

静态代码块执行了
代码块执行了...第一次创建
代码块执行了...
第二次创建
代码块执行了...

用法4:静态导包

7.Java--异常/Exception--类型/原理

异常的层次结构

Throwable有两个直接的子类: Error、Exception。

Error

JVM内部的严重问题,比如资源不足等,无法恢复

Exception

可恢复。分RuntimeException和其他Exception

或者说分为非受检异常(unchecked exception)和受检异常(checked exception)。
RuntimeException(unchecked exception)
处理或者不处理都可以(不需try...catch...或在方法声明时throws)
其他Exception(checked exception)
Java编译器要求程序必须捕获(try...catch)或声明抛出(方法声明时throws)这种异常

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

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

相关文章

在 Ubuntu 上将 Docker 降级到版本 25.0.5 (二) 降低版本,涉及兼容性问题

以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作 地址&#xff1a;星宇科技 | GPU服务器 高性能云主机 云服务器-登录 相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客 兑换码要是过期了&#xff0c;可以私信我获取最新兑换码&#xff01;&a…

什么是MySQL 视图

文章目录什么是MySQL 视图定义为什么使用视图创建/替换视图更新视图总结什么是MySQL 视图 定义 视图是一种虚拟表&#xff0c;是一个逻辑表&#xff0c;本身并不包含数据&#xff0c;通过select语句去基本表上动态生成数据。 举个例子&#xff1a; 你有一个员工表employees…

Neo4j 5.x版本的导出与导入数据库

neo4j的版本管理真的是灾难级别的&#xff0c;文档也乱&#xff0c;特定版本也难下&#xff0c;不同版本之间的命令存在很大差异&#xff0c;网上的很多资料都是Neo4j 4.x的&#xff0c;在此给出我自己试出来的5.x的导入导出方法使用前先关闭neo4j服务进入到neo4j安装目录的bin…

Java——深入解析 CGlib 与 JDK 动态代理:原理、区别与实践

在 Java 开发中&#xff0c;动态代理是实现 AOP&#xff08;面向切面编程&#xff09;的核心技术&#xff0c;广泛应用于日志记录、事务管理、权限控制等场景。其中&#xff0c;JDK 动态代理和 CGlib 是两种最常用的动态代理实现方式。本文将从原理、区别、使用场景等方面深入解…

变频器带动电机:全方位解析参数变化

在现代工业自动化领域&#xff0c;变频器作为电机调速的核心设备&#xff0c;扮演着至关重要的角色。它能够精准地控制电机的运行状态&#xff0c;通过改变电源频率和电压&#xff0c;实现电机转速、转矩、功率等参数的灵活调整。本文将深入探讨变频器带动电机时&#xff0c;各…

OpenCV 入门知识:图片展示、摄像头捕获、控制鼠标及其 Trackbar(滑动条)生成!

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

Elasticsearch是什么?

Elasticsearch&#xff08;简称ES&#xff09;是一种基于Lucene的分布式搜索引擎&#xff0c;广泛应用于大数据、日志分析、全文搜索等场景。它的核心是提供高效、可扩展的搜索和分析能力。ES 提供了强大的全文搜索、聚合分析、数据可视化等功能&#xff0c;可以用来快速地对海…

(Arxiv-2025)OmniGen2:通向先进多模态生成的探索

OmniGen2&#xff1a;通向先进多模态生成的探索 paper title&#xff1a;OmniGen2: Exploration to Advanced Multimodal Generation paper是BAAI发布在Arxiv 2025的工作 Code:链接 Abstract 在本研究中&#xff0c;我们提出了 OmniGen2&#xff0c;这是一种多功能、开源的生成…

期权到期会对大盘有什么影响?

本文主要介绍期权到期会对大盘有什么影响&#xff1f;期权到期对大盘的影响主要体现在以下几个方面&#xff0c;但整体影响通常有限且短期&#xff0c;具体效果需结合市场环境、期权规模及行权价位置综合判断。期权到期会对大盘有什么影响&#xff1f;1. 市场流动性波动到期日效…

【LeetCode刷题指南】--随机链表的复制

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

系统学习算法:专题十四 链表

前提知识&#xff1a;1.画图&#xff0c;数据结构相关的题&#xff0c;画图必不可少&#xff0c;只要能画出来&#xff0c;那么后面的代码就很容易能写出来&#xff0c;因为将抽象的数据结构转换为直观的图画2.引入虚拟头结点&#xff0c;也叫哨兵位&#xff0c;能够避免考虑很…

零基础学后端-PHP语言(第一期-PHP环境配置)

从本期开始&#xff0c;我们学习PHP&#xff0c;但是我们要先配置PHP环境 PHP官网链接&#xff1a;PHP For Windows: Binaries and sources Releases 我们可以看到有以下资源 可以看到有很多php的版本&#xff0c;有Non Thread Safe和Thread Safe&#xff0c;还有zip&#xf…

C++ primer知识点总结

《C Primer》系统学习指南&#xff1a;从C到C的平滑过渡根据你提供的《C Primer》目录和你的需求&#xff08;C语言背景转C&#xff0c;侧重网络编程&#xff09;&#xff0c;我将为你制定一个全面的学习计划&#xff0c;包含知识点详解、C/C对比、实战案例和分阶段项目练习。第…

异构融合 4A:重构高性能计算与复杂场景分析的安全与效率边界

当全球数据量以每两年翻一番的速度爆炸式增长&#xff0c;高性能计算&#xff08;HPC&#xff09;与复杂场景分析正成为破解气候预测、基因测序、金融风控等世界级难题的关键引擎。但异构计算环境的碎片化、多系统协同的复杂性、数据流动的安全风险&#xff0c;正在形成制约行业…

【华为机试】240. 搜索二维矩阵 II

文章目录240. 搜索二维矩阵 II描述示例 1示例 2提示解题思路核心分析问题转化算法实现方法1&#xff1a;右上角开始搜索&#xff08;推荐&#xff09;方法2&#xff1a;逐行二分查找方法3&#xff1a;分治法方法4&#xff1a;左下角开始搜索复杂度分析核心要点数学证明右上角搜…

疯狂星期四文案网第16天运营日记

网站运营第16天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 昨日访问量 昨日30多ip, 今天也差不多&#xff0c;同步上周下降了一些&#xff0c;感觉明天疯狂星期四要少很多了&#xff0c;记得上周四700多ip&…

Linux系统基础入门与配置指南

Linux基本概述与配置 一、我们为什么使用Linux&#xff08;Linux的优点&#xff09;开源与自由 免费&#xff1a; 无需支付许可费用&#xff0c;任何人都可以自由下载、安装和使用。源代码开放&#xff1a; 任何人都可以查看、修改和分发源代码。这带来了极高的透明度、安全性和…

如何删除VSCode Marketplace中的publisher

网页上并没有提供删除的按钮&#xff0c;需要通过命令的形式删除。 vsce delete-publisher [要删除的名字]# 键入token # y 确认这里的token是之前在Azure DevOps中创建的token&#xff0c;忘了的话可以重建一个 刷新网页看一下 成功删除了。

Windows安装git教程(图文版)

Git 是一个分布式版本控制系统&#xff0c;用于跟踪文件的变化&#xff0c;特别是在软件开发中。它使得多个开发者可以在不同的机器上并行工作&#xff0c;然后将他们的改动合并在一起。是在开发过程中&#xff0c;经常会用到的一个工具。本章教程&#xff0c;主要介绍Windows上…

Remote Framebuffer Protocol (RFB) 详解

RFC 6143 规范文档&#xff1a;The Remote Framebuffer Protocol 文章目录1. 引言2. 初始连接流程2.1 TCP连接建立2.2 协议版本协商2.3 安全握手3. 显示协议机制3.1 核心概念3.2 像素格式4. 输入协议4.1 键盘事件(KeyEvent)4.2 鼠标事件(PointerEvent)5. 协议消息详解5.1 握手消…