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
英文地址,請注明出處:http://en.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 握手消…