java面試-java基礎(下)

文章目錄

  • 一、==和equals區別?
  • 二、hashcode方法作用?兩個對象的hashCode方法相同,則equals方法也一定為true嗎?
  • 三、為什么重寫equals方法就一定要重寫hashCode方法?
  • 四、Java中的參數傳遞時傳值呢還是傳引用?
  • 五、深拷貝和淺拷貝?
  • 六、Java中創建對象的幾種方式?
  • 七、Java對象初始化過程?(筆試)
  • 八、怎么精確表示任意精度的整數和任何精度的定點數或者貨幣?
  • 九、String是Java基本數據類型嗎?可以被繼承嗎?
  • 十、String是不可變類嗎?字符串拼接是如何實現的?
  • 十一、不同String創建方法分別創建了幾個對象?
  • 十二、String為什么是不可變的?設計原因?
  • 十三、String、StringBuilder、StringBuffer 的區別?
  • 總結


一、==和equals區別?

  • ==:如果比較的對象是基本數據類型,則比較的是數值是否相等;如果比較的對象是引用數據類型,則比較的是對象的地址值是否相等
  • equals方法:沒有重寫相當于==,重寫后比較兩個對象的內容是否相等。String、Integer重寫了

二、hashcode方法作用?兩個對象的hashCode方法相同,則equals方法也一定為true嗎?

  • hashCode 方法主要用來獲取對象的哈希碼,哈希碼是由對象的內存地址或者對象的屬性計算出來的,它是?個int類型的整數,重復率低,因此可以用來作為鍵值對的鍵,以提高查詢效率。
  • 不一定。因為存在哈希沖突,不同的對象可能會有相同的哈希值,所以哈希值相等,并不一定能equals方法相等。為了解決哈希沖突的問題,在判斷對象是否相等時,不僅會比較鍵對象的哈希碼,還會使用 equals 方法。如果兩個對象的哈希碼相同,但通過equals方法比較結果為 false,那么這兩個對象就不被視為相等。

三、為什么重寫equals方法就一定要重寫hashCode方法?

  • 保證在equals相同的情況下hashcode值必定相同:如果只重寫equals方法,那么被認為相等的對象可能會有不同的哈希碼(默認是對象的地址,因此所有對象都是不同的哈希碼),存儲在集合不同的位置,導致集合出現重復元素或者無法找到對應元素(因為equals是根據對象的特征進行重寫)
  • 提升性能:hashCode能提高hashmap等集合去重的性能,如果沒有重寫hashCode()方法,那么集合每次添加元素都要遍歷已有元素調用equals方法,性能太差,重寫hashcode能減少equals方法調用次數

四、Java中的參數傳遞時傳值呢還是傳引用?

  • java基本類型作為參數被傳遞時是值傳遞;引用類型作為參數被傳遞時也是值傳遞,參數值是對象的引用。

五、深拷貝和淺拷貝?

  • 淺拷貝僅拷貝被拷貝對象的基本數據類型變量的值和引用數據類型變量的地址值,而對于引用類型變量指向的堆中的對象不會拷貝
  • 深拷貝完全拷貝一個對象,拷貝被拷貝對象的成員變量的值,堆中的對象也會拷貝一份。
  • 淺拷貝需要實現Cloneable接口并重寫Object類中的clone()方法;
  • 深拷貝需要實現Serializable接口,通過對象的序列化和反序列化,或者使所有引用類型屬性實現Cloneable接口

六、Java中創建對象的幾種方式?

  • 使用new關鍵字
A a = new A();
  • 使用Class類的newInstance方法,Class.forName.newInstance()
Class clazz = Class.forName("A");
A a = (A) clazz.newInstance();
  • 使用clone方法
A a = new A();
A a2= (A) a.clone();
  • 反序列化,比如調用ObjectInputStream類的readObject()方法
A a= new A();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
oos.writeObject(a);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
A a2 = (A) ois.readObject();

七、Java對象初始化過程?(筆試)

  • 父類靜態屬性
  • 父類靜態代碼塊
  • 子類靜態屬性
  • 子類靜態代碼塊
  • 父類非靜態屬性
  • 父類構造代碼塊
  • 父類構造方法
  • 子類非靜態屬性
  • 子類構造代碼塊
  • 子類構造方法

八、怎么精確表示任意精度的整數和任何精度的定點數或者貨幣?

  • BigInteger任意精度的整數
  • BigDecimal任何精度的定點數->貨幣
  • 轉成分用int運算

九、String是Java基本數據類型嗎?可以被繼承嗎?

  • 引用類型,String被final修飾不能被繼承

十、String是不可變類嗎?字符串拼接是如何實現的?

  • String是不可變的,1.8以前+的拼接操作,如果字符串在常量池中不存在,則會生成新的對象。1.8時被優化為基于StringBuilder的append方法進行處理

十一、不同String創建方法分別創建了幾個對象?

String str1 = "abc";//1
String str2 = new String("abc")//2 
  • 1在內存的字符串常量池中存儲abc字符串對象
  • 2在內存的字符串常量池中找abc字符串對象,沒有則創建;在堆中創建str2對象,引用指向abc字符串對象

十二、String為什么是不可變的?設計原因?

  • 不可變:一旦String對象被創建,它所包含的字符串內容是不可改變的。
  • 不可變是因為引用的char數組(jdk1.9后改為byte數組)被final修飾。字符串的值本身不能改變,但引用字符串的變量中記錄的地址值是可以改變的。每次修改操作(如拼接、替換等)都會產生新對象。
  • 避免內存浪費:當創建一個String對象時,如果字符串值在常量池中已經存在則不會創建,只是引用已經存在的對象
  • 性能優化:字符串不變性保證了hash碼的唯一性,允許String對象緩存頻繁使用的HashCode(如HashMap),不必每次都去計算新的哈希碼
  • 安全性:String被許多的Java類用來當做參數,例如:網絡連接地址URL、文件路徑path、反射機制的String參數等, 如果String不是固定不變的,將會引起各種安全隱患。

十三、String、StringBuilder、StringBuffer 的區別?

  • String:類的對象是不可變的;適用于字符串內容不經常改變的場景。在使用字符串常量或進行少量的字符串操作時使用。每次對String對象進行修改操作(如拼接、替換等)實際上都會生成一個新的String對象,而不是修改原有對象。大量字符串連接情況下,產生太多對象浪費內存。線程安全
  • StringBuilder:適用于單線程環境下需要頻繁修改字符串內容的場景,比如在循環中拼接或修改字符串,使用字符數組char[]保存字符串,可變類,每次對String對象進行修改操作(如拼接、替換等)都是直接在原有字符串對象的底層數組上進行,不產生新對象,線程不安全;效率高
  • StringBuffer:適用于多線程環境下需要頻繁修改字符串內容的場景,使用字符數組char[]保存字符串,可變類,方法加同步鎖synchronized,線程安全;效率低
  • 多線程強制使用StringBuilder()
public class StringBuilderHolder {private final StringBuilder sb;public StringBuilderHolder(int capacity) {sb = new StringBuidler(capacity);}//3.避免重復構造String,重用StringBuilderpublic StringBuilder resetAndGetStringBuilder() {sb.setLength(0);return sb;}
}
//2.ThreadLocal避免多線程沖突
private static final ThreadLocal<StringBuilderHolder> threadLocalStringBuilderHolder = new ThreadLocal<StringBuilderHolder>() {protected StringBuilderHolder initialValue() {//1.設置好初始長度,超過char[]默認16調用System.arraycopy成倍復制擴容太浪費資源return new StringBuilderHolder(256);}
}StringBuilder sb = threadLocalStringBuilderHolder.get().resetAndGetStringBuilder();

總結

本文介紹了的java面試之java基礎(下),如有問題歡迎私信和評論

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41120.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41120.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41120.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

期末上分站——計組(3)

復習題21-42 21、指令周期是指__C_。 A. CPU從主存取出一條指令的時間 B. CPU執行一條指令的時間 C. CPU從主存取出一條指令的時間加上執行這條指令的時間。 D. 時鐘周期時間 22、微型機系統中外設通過適配器與主板的系統總線相連接&#xff0c;其功能是__D_。 A. 數據緩沖和…

數據庫可視化管理工具dbeaver試用及問題處理。

本文記錄了在內網離線安裝數據庫可視化管理工具dbeaver的過程和相關問題處理方法。 一、下載dbeaver https://dbeaver.io/download/ 筆者測試時Windows平臺最新版本為&#xff1a;dbeaver-ce-24.1.1-x86_64-setup.exe 二、安裝方法 一路“下一步”即可 三、問題處理 1、問…

【深度學習】vscode 命令行下的debug

其實我一直知道vscode可以再命令行下進行debug。 比如 python aaa.py --bb1 --cc2 以前的做法是 去aaa.py 寫死bb和cc 然后直接debug。 直到今天我遇到這個&#xff1a; hydra hydra.main(version_baseNone, config_name/home/justin/Desktop/code/python_project/WASB-SBDT-m…

Truffle學習筆記

Truffle學習筆記 安裝truffle, 注意: 雖然目前truffle最新版是 5.0.0, 但是經過我實踐之后, 返現和v4有很多不同(比如: web3.eth.accounts; 都獲取不到賬戶), 還是那句話: “nodejs模塊的版本問題會搞死人的 !” 目前4.1.15之前的版本都不能用了, 只能安裝v4.1.15 npm instal…

新手學Cocos報錯 [Assets] Failed to open

兩個都在偏好設置里面調&#xff08;文件下面的偏好設置&#xff09;&#xff1a; 1.設置中文&#xff1f; 2.報錯 [Assets] Failed to open&#xff1f; 這樣在點擊打開ts文件的時候就不會報錯&#xff0c;并且用vscode編輯器打開了&#xff0c; 同樣也可以改成你們自己喜歡…

LabVIEW在圖像處理中的應用

abVIEW作為一種圖形化編程環境&#xff0c;不僅在數據采集和儀器控制領域表現出色&#xff0c;還在圖像處理方面具有強大的功能。借助其Vision Development Module&#xff0c;LabVIEW提供了豐富的圖像處理工具&#xff0c;廣泛應用于工業檢測、醫學影像、自動化控制等多個領域…

Apache Seata應用側啟動過程剖析——RM TM如何與TC建立連接

本文來自 Apache Seata官方文檔&#xff0c;歡迎訪問官網&#xff0c;查看更多深度文章。 本文來自 Apache Seata官方文檔&#xff0c;歡迎訪問官網&#xff0c;查看更多深度文章。 Apache Seata應用側啟動過程剖析——RM & TM如何與TC建立連接 前言 看過官網 README 的第…

Android最近任務顯示的圖片

Android最近任務顯示的圖片 1、TaskSnapshot截圖1.1 snapshotTask1.2 drawAppThemeSnapshot 2、導航欄顯示問題3、Recentan按鍵進入最近任務 1、TaskSnapshot截圖 frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java frameworks/base/cor…

IPython 性能評估工具的較量:%%timeit 與 %timeit 的差異解析

IPython 性能評估工具的較量&#xff1a;%%timeit 與 %timeit 的差異解析 在 IPython 的世界中&#xff0c;性能評估是一項至關重要的任務。%%timeit 和 %timeit 是兩個用于測量代碼執行時間的魔術命令&#xff0c;但它們之間存在一些關鍵的差異。本文將深入探討這兩個命令的不…

2786. 訪問數組中的位置使分數最大

2786. 訪問數組中的位置使分數最大 題目鏈接&#xff1a;2786. 訪問數組中的位置使分數最大 代碼如下&#xff1a; //參考鏈接:https://leetcode.cn/problems/visit-array-positions-to-maximize-score/solutions/2810335/dp-by-kkkk-16-tn9f class Solution { public:long …

vue-router 4匯總

一、vue和vue-router版本&#xff1a; "vue": "^3.4.29", "vue-router": "^4.4.0" 二、路由傳參&#xff1a; 方式一&#xff1a; 路由配置&#xff1a;/src/router/index.ts import {createRouter,createWebHistory } from &quo…

探索 WebKit 的緩存迷宮:深入理解其高效緩存機制

探索 WebKit 的緩存迷宮&#xff1a;深入理解其高效緩存機制 在當今快速變化的網絡世界中&#xff0c;WebKit 作為領先的瀏覽器引擎之一&#xff0c;其緩存機制對于提升網頁加載速度、減少服務器負載以及改善用戶體驗起著至關重要的作用。本文將深入探討 WebKit 的緩存機制&am…

代碼隨想錄leetcode200題之額外題目

目錄 1 介紹2 訓練3 參考 1 介紹 本博客用來記錄代碼隨想錄leetcode200題之額外題目相關題目。 2 訓練 題目1&#xff1a;1365. 有多少小于當前數字的數字 解題思路&#xff1a;二分查找。 C代碼如下&#xff0c; class Solution { public:vector<int> smallerNumb…

卷積神經網絡(CNN)和循環神經網絡(RNN) 的區別與聯系

卷積神經網絡&#xff08;CNN&#xff09;和循環神經網絡&#xff08;RNN&#xff09;是兩種廣泛應用于深度學習的神經網絡架構&#xff0c;它們在設計理念和應用領域上有顯著區別&#xff0c;但也存在一些聯系。 ### 卷積神經網絡&#xff08;CNN&#xff09; #### 主要特點…

解決C++編譯時的產生的skipping incompatible xxx 錯誤

問題 我在編譯項目時&#xff0c;產生了一個 /usr/bin/ld: skipping incompatible ../../xxx/ when searching for -lxxx 的編譯錯誤&#xff0c;如下圖所示&#xff1a; 解決方法 由圖中的錯誤可知&#xff0c;在編譯時&#xff0c;是能夠在我們指定目錄下的 *.so 動態庫的…

python函數和c的區別有哪些

Python有很多內置函數&#xff08;build in function&#xff09;&#xff0c;不需要寫頭文件&#xff0c;Python還有很多強大的模塊&#xff0c;需要時導入便可。C語言在這一點上遠不及Python&#xff0c;大多時候都需要自己手動實現。 C語言中的函數&#xff0c;有著嚴格的順…

Java基礎(六)——繼承

個人簡介 &#x1f440;個人主頁&#xff1a; 前端雜貨鋪 ?開源項目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;?♂?學習方向&#xff1a; 主攻前端方向&#xff0c;正逐漸往全干發展 &#x1…

【Web】

1、配倉庫 [rootlocalhost yum.repos.d]# vi rpm.repo ##本地倉庫標準寫法 [baseos] namemiaoshubaseos baseurl/mnt/BaseOS gpgcheck0 [appstream] namemiaoshuappstream baseurlfile:///mnt/AppStream gpgcheck0 2、掛載 [rootlocalhost ~]mount /dev/sr0 /mnt mount: /m…

QT操作各類數據庫用法詳解

文章目錄 創建內存SQLITE數據庫QSqlTableModel操作數據庫表連接國產數據庫多線程數據處理不指定數據庫名打開數據庫QT對各種數據庫的支持情況處理數據庫表名QT連接各種數據庫Qt提供了一個名為QtSQL模塊的強大組件, 使得在Qt應用程序中連接和操作多種類型的數據庫變得相對簡單。…

Vulnhub-Os-hackNos-1(包含靶機獲取不了IP地址)

https://download.vulnhub.com/hacknos/Os-hackNos-1.ova #靶機下載地址 題目&#xff1a;要找到兩個flag user.txt root.txt 文件打開 改為NAT vuln-hub-OS-HACKNOS-1靶機檢測不到IP地址 重啟靶機 按住shift 按下鍵盤字母"E"鍵 將圖中ro修改成…