Java語(yǔ)言是一種廣泛應(yīng)用于軟件開(kāi)發(fā)的高級(jí)編程語(yǔ)言,最初由Sun Microsystems于1995年發(fā)布。
????????文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-824844.html
以下是Java語(yǔ)言的一些特點(diǎn)和用途:
1. 跨平臺(tái)性:?Java是一種跨平臺(tái)的編程語(yǔ)言,一次編寫(xiě),到處運(yùn)行(Write Once, Run Anywhere,WORA)。這得益于Java虛擬機(jī)(JVM),它使得編譯后的Java程序可以在不同的操作系統(tǒng)上運(yùn)行,只需安裝相應(yīng)平臺(tái)的JVM。
2. 面向?qū)ο螅?/strong>?Java是一種面向?qū)ο蟮木幊陶Z(yǔ)言,它支持面向?qū)ο蟮木幊谭妒?,例如封裝、繼承、多態(tài)等。
3. 自動(dòng)內(nèi)存管理:?Java使用自動(dòng)內(nèi)存管理機(jī)制,開(kāi)發(fā)人員無(wú)需手動(dòng)管理內(nèi)存分配和釋放,而是通過(guò)垃圾回收器(Garbage Collector)來(lái)自動(dòng)管理對(duì)象的生命周期。
4. 強(qiáng)類(lèi)型:?Java是一種強(qiáng)類(lèi)型的語(yǔ)言,即要求在編譯期間就對(duì)變量進(jìn)行類(lèi)型檢查,避免了一些潛在的類(lèi)型錯(cuò)誤。
5. 豐富的類(lèi)庫(kù)支持:Java提供了強(qiáng)大且豐富的類(lèi)庫(kù),包括用于網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)、圖形界面、多媒體處理等方面的API,能夠支持各種應(yīng)用程序的開(kāi)發(fā)。
6. 多線程支持:Java內(nèi)置了對(duì)多線程的支持,使用多線程可以實(shí)現(xiàn)并發(fā)執(zhí)行,提高程序的性能和響應(yīng)能力。
7. 應(yīng)用廣泛:?Java被廣泛應(yīng)用于Web開(kāi)發(fā)、企業(yè)級(jí)應(yīng)用開(kāi)發(fā)、移動(dòng)應(yīng)用開(kāi)發(fā)(Android平臺(tái))、大數(shù)據(jù)、云計(jì)算等各個(gè)領(lǐng)域。
????????
除了上述特點(diǎn)以外,Java還具有良好的安全性、穩(wěn)定性和擴(kuò)展性,因此備受開(kāi)發(fā)者和企業(yè)的青睞。Java語(yǔ)言的不斷更新和發(fā)展,使得它在現(xiàn)代軟件開(kāi)發(fā)中依然發(fā)揮著重要的作用。
????????
讓人前眼一亮提升表現(xiàn)分基礎(chǔ)是關(guān)鍵:
? ? 1. 理解基礎(chǔ)概念:確保你對(duì)Java的基本概念有清晰的理解,比如OOP原則(封裝、繼承、多態(tài)和抽象)、集合框架、異常處理、多線程等。
? ? 2.掌握語(yǔ)法和API:對(duì)Java語(yǔ)法要熟練掌握,熟悉標(biāo)準(zhǔn)庫(kù)的API,如常用的java.lang,java.util等包。
? ? 3.強(qiáng)化核心概念:數(shù)據(jù)結(jié)構(gòu)如數(shù)組、鏈表和圖,控制流程語(yǔ)句(if-else、switch、for、while、do-while),以及遞歸和迭代等。
? ? 4.了解JVM:了解Java虛擬機(jī)(JVM)的基本工作原理,比如類(lèi)加載器、內(nèi)存模型、垃圾收集器等。
? ? 5.編寫(xiě)干凈的代碼:練習(xí)編寫(xiě)清晰、高效的代碼。面試時(shí)寫(xiě)代碼要保持結(jié)構(gòu)清晰,變量命名合理。
? ? 6.調(diào)試技能:提升你的代碼調(diào)試技能,了解如何在Java程序中使用調(diào)試工具。
? ? 7.思路清晰:在解釋你的思路時(shí)要清晰和條理,即使遇到不會(huì)的問(wèn)題也不要慌張,可以嘗試從不同角度思考問(wèn)題。
? ? 8.詢(xún)問(wèn)和反饋:如果對(duì)面試官提出的問(wèn)題不理解,可以尋求澄清。完成問(wèn)題后,詢(xún)問(wèn)面試官對(duì)你解答的反饋。
? ? 9.保持更新:Java是一個(gè)不斷發(fā)展的語(yǔ)言,要關(guān)注其新的特性和更新,比如 Java 8 引入的lambda表達(dá)式和Stream API。
? ? 10.練習(xí)編程題:本文后面和后續(xù)更新相關(guān)的面試題來(lái)練習(xí)。
? ? 11.模擬面試:進(jìn)行模擬面試可以幫助你適應(yīng)面試環(huán)境和時(shí)間壓力,也是檢驗(yàn)自己哪些地方需要改進(jìn)的好方法。
? ? 12.實(shí)戰(zhàn)經(jīng)驗(yàn):如果有項(xiàng)目經(jīng)歷,要準(zhǔn)備好如何清晰地描述你的項(xiàng)目和其中你負(fù)責(zé)的部分。
目錄
一、Java中的基本數(shù)據(jù)類(lèi)型,它們分別占用字節(jié)
二、Java中的面向?qū)ο筇匦?/p>
三、Java中的訪問(wèn)修飾符
四、Java中的自動(dòng)裝箱和自動(dòng)拆箱
五、Java中的重載(overloading)和重寫(xiě)(overriding)
六、Java中的異常處理機(jī)制,Java中異常類(lèi)
七、請(qǐng)解釋一下Java中的final、finally、finalize各自的作用
八、String、StringBuilder和StringBuffer之間的區(qū)別
九、在Java中,==和equals()方法有什么區(qū)別?
十、ava深拷貝(deep copy)和淺拷貝(shallow copy)
十一、Java內(nèi)存泄漏情況
十二、Java多態(tài)特性
一、Java中的基本數(shù)據(jù)類(lèi)型,它們分別占用字節(jié)
Java 中的基本數(shù)據(jù)類(lèi)型包括以下幾種:
????????1. byte:占用 1 個(gè)字節(jié)(8 位)
????????2. short:占用 2 個(gè)字節(jié)(16 位)
????????3. int:占用 4 個(gè)字節(jié)(32 位)
????????4. long:占用 8 個(gè)字節(jié)(64 位)
????????5. float:占用 4 個(gè)字節(jié)(32 位)
????????6. double:占用 8 個(gè)字節(jié)(64 位)
????????7. char:占用 2 個(gè)字節(jié)(16 位)
????????8. boolean:理論上占用 1 個(gè)位,但在實(shí)際中可能會(huì)占用更多的空間需要注意的是,基本數(shù)據(jù)類(lèi)型在不同的平臺(tái)上所占的字節(jié)數(shù)可能會(huì)有所不同,因?yàn)檫@些大小是由 Java 語(yǔ)言規(guī)范規(guī)定的,而不是由底層硬件規(guī)定的。
????????
二、Java中的面向?qū)ο筇匦?/h2>
Java 中的面向?qū)ο筇匦灾饕ㄒ韵聨讉€(gè)方面:
????????1. 封裝(Encapsulation):封裝是指將數(shù)據(jù)和操作數(shù)據(jù)的方法捆綁在一起,以防止對(duì)數(shù)據(jù)的意外修改和濫用。在 Java 中,可以通過(guò)訪問(wèn)控制符(如 public、protected、private)來(lái)實(shí)現(xiàn)封裝,確保數(shù)據(jù)只能通過(guò)規(guī)定的方式進(jìn)行訪問(wèn)和修改。
????????2. 繼承(Inheritance):繼承是面向?qū)ο缶幊讨械闹匾拍?,它允許一個(gè)類(lèi)(子類(lèi))從另一個(gè)類(lèi)(父類(lèi))中繼承屬性和方法,并可以在此基礎(chǔ)上進(jìn)行擴(kuò)展和修改。通過(guò)繼承,可以實(shí)現(xiàn)代碼的重用,并建立類(lèi)之間的層次關(guān)系。
????????3. 多態(tài)(Polymorphism):多態(tài)是指同一操作作用于不同的對(duì)象上會(huì)有不同的行為。在 Java 中,多態(tài)性可以通過(guò)方法重載和方法重寫(xiě)來(lái)實(shí)現(xiàn)。方法重載是在同一個(gè)類(lèi)中,方法名相同但參數(shù)列表不同的多個(gè)方法;方法重寫(xiě)是子類(lèi)重寫(xiě)父類(lèi)的方法,實(shí)現(xiàn)不同的行為邏輯。
????????4. 抽象(Abstraction):抽象是指將具有共性的內(nèi)容提取出來(lái)形成類(lèi)的方式。在 Java 中,可以通過(guò)抽象類(lèi)(abstract class)和接口(interface)來(lái)實(shí)現(xiàn)抽象。抽象類(lèi)不能實(shí)例化,而接口只提供方法聲明而不包含方法的實(shí)現(xiàn),通過(guò)這兩種方式可以實(shí)現(xiàn)對(duì)業(yè)務(wù)邏輯的抽象描述。
????????
這些面向?qū)ο筇匦允沟?Java 編程更加靈活和易于維護(hù),同時(shí)也有助于提高代碼的可讀性和可重用性。
Java 中的面向?qū)ο筇匦灾饕ㄒ韵聨讉€(gè)方面:
????????1. 封裝(Encapsulation):封裝是指將數(shù)據(jù)和操作數(shù)據(jù)的方法捆綁在一起,以防止對(duì)數(shù)據(jù)的意外修改和濫用。在 Java 中,可以通過(guò)訪問(wèn)控制符(如 public、protected、private)來(lái)實(shí)現(xiàn)封裝,確保數(shù)據(jù)只能通過(guò)規(guī)定的方式進(jìn)行訪問(wèn)和修改。
????????2. 繼承(Inheritance):繼承是面向?qū)ο缶幊讨械闹匾拍?,它允許一個(gè)類(lèi)(子類(lèi))從另一個(gè)類(lèi)(父類(lèi))中繼承屬性和方法,并可以在此基礎(chǔ)上進(jìn)行擴(kuò)展和修改。通過(guò)繼承,可以實(shí)現(xiàn)代碼的重用,并建立類(lèi)之間的層次關(guān)系。
????????3. 多態(tài)(Polymorphism):多態(tài)是指同一操作作用于不同的對(duì)象上會(huì)有不同的行為。在 Java 中,多態(tài)性可以通過(guò)方法重載和方法重寫(xiě)來(lái)實(shí)現(xiàn)。方法重載是在同一個(gè)類(lèi)中,方法名相同但參數(shù)列表不同的多個(gè)方法;方法重寫(xiě)是子類(lèi)重寫(xiě)父類(lèi)的方法,實(shí)現(xiàn)不同的行為邏輯。
????????4. 抽象(Abstraction):抽象是指將具有共性的內(nèi)容提取出來(lái)形成類(lèi)的方式。在 Java 中,可以通過(guò)抽象類(lèi)(abstract class)和接口(interface)來(lái)實(shí)現(xiàn)抽象。抽象類(lèi)不能實(shí)例化,而接口只提供方法聲明而不包含方法的實(shí)現(xiàn),通過(guò)這兩種方式可以實(shí)現(xiàn)對(duì)業(yè)務(wù)邏輯的抽象描述。
????????
這些面向?qū)ο筇匦允沟?Java 編程更加靈活和易于維護(hù),同時(shí)也有助于提高代碼的可讀性和可重用性。
????????
三、Java中的訪問(wèn)修飾符
在Java中,訪問(wèn)修飾符用于控制類(lèi)、方法和變量的訪問(wèn)級(jí)別。Java中有四種訪問(wèn)修飾符:
public
:public修飾符是最為開(kāi)放的訪問(wèn)級(jí)別,被修飾的成員可以在任何地方被訪問(wèn),其他類(lèi)可以自由地訪問(wèn)、繼承和重寫(xiě)public成員。
protected
:protected修飾符對(duì)于當(dāng)前包內(nèi)的類(lèi)和子類(lèi)是可見(jiàn)的。外部包的類(lèi)無(wú)法訪問(wèn)protected成員,但如果子類(lèi)在不同的包中,可以訪問(wèn)其父類(lèi)的protected成員。
default
(默認(rèn)修飾符):如果沒(méi)有顯式指定訪問(wèn)修飾符,則默認(rèn)使用default修飾符。默認(rèn)修飾符對(duì)于同一包中的類(lèi)是可見(jiàn)的,但對(duì)于不同包中的類(lèi)是不可見(jiàn)的。
private
:private修飾符是最為限制的訪問(wèn)級(jí)別,被private修飾的成員只能在聲明它的類(lèi)中訪問(wèn)。其他類(lèi)無(wú)法直接訪問(wèn)、繼承或重寫(xiě)private成員。下面是一些使用訪問(wèn)修飾符的例子:
public class MyClass { public int publicVariable; protected int protectedVariable; int defaultVariable; private int privateVariable; public void publicMethod() { // 公共方法的實(shí)現(xiàn) } protected void protectedMethod() { // 受保護(hù)方法的實(shí)現(xiàn) } void defaultMethod() { // 默認(rèn)方法的實(shí)現(xiàn) } private void privateMethod() { // 私有方法的實(shí)現(xiàn) } }
盡管Java提供了這些訪問(wèn)修飾符,但良好的編程實(shí)踐建議限制對(duì)類(lèi)的直接訪問(wèn),使用public方法來(lái)訪問(wèn)和修改類(lèi)的狀態(tài)。這有助于封裝和維護(hù)代碼的穩(wěn)定性。同樣地,類(lèi)的成員變量也應(yīng)該盡可能地私有化,通過(guò)公共方法來(lái)操作它們。
????????
四、Java中的自動(dòng)裝箱和自動(dòng)拆箱
在Java中,自動(dòng)裝箱(Autoboxing)和自動(dòng)拆箱(Unboxing)是編譯器提供的功能,用于在基本數(shù)據(jù)類(lèi)型和對(duì)應(yīng)的包裝類(lèi)之間進(jìn)行自動(dòng)轉(zhuǎn)換。
自動(dòng)裝箱是指將基本數(shù)據(jù)類(lèi)型自動(dòng)轉(zhuǎn)換為對(duì)應(yīng)的包裝類(lèi)對(duì)象。例如,當(dāng)你將一個(gè)`int`類(lèi)型的值賦給一個(gè)`Integer`類(lèi)型的變量時(shí),編譯器會(huì)自動(dòng)將`int`類(lèi)型的值裝箱為`Integer`對(duì)象。這個(gè)過(guò)程是隱式的,不需要顯式地調(diào)用構(gòu)造函數(shù)。例如:
int number = 10; Integer obj = number; // 自動(dòng)裝箱
自動(dòng)拆箱是指將包裝類(lèi)對(duì)象自動(dòng)轉(zhuǎn)換為對(duì)應(yīng)的基本數(shù)據(jù)類(lèi)型。例如,當(dāng)你將一個(gè)`Integer`對(duì)象賦給一個(gè)`int`類(lèi)型的變量時(shí),編譯器會(huì)自動(dòng)將`Integer`對(duì)象拆箱為`int`類(lèi)型的值。這個(gè)過(guò)程也是隱式的,不需要顯式地調(diào)用方法。例如:
Integer obj = 20; int number = obj; // 自動(dòng)拆箱
自動(dòng)裝箱和自動(dòng)拆箱使得在基本數(shù)據(jù)類(lèi)型和包裝類(lèi)之間進(jìn)行轉(zhuǎn)換更加方便,可以使代碼更簡(jiǎn)潔易讀。然而,需要注意的是,自動(dòng)裝箱和自動(dòng)拆箱可能會(huì)帶來(lái)一些性能開(kāi)銷(xiāo),因?yàn)樗鼈兩婕暗筋l繁的對(duì)象創(chuàng)建和銷(xiāo)毀。在某些情況下,手動(dòng)進(jìn)行裝箱和拆箱操作可能會(huì)更加高效。
????????
五、Java中的重載(overloading)和重寫(xiě)(overriding)
在 Java 中,重載(overloading)和重寫(xiě)(overriding)是面向?qū)ο缶幊讨谐S玫膬煞N概念,它們分別用于描述在類(lèi)中的方法的多態(tài)性。
????????
重載(overloading)指的是在同一個(gè)類(lèi)中,可以存在多個(gè)同名的方法,但它們的參數(shù)列表不同。重載的方法可以有不同的返回類(lèi)型,但是參數(shù)列表必須不同。在調(diào)用重載的方法時(shí),編譯器會(huì)根據(jù)傳入的參數(shù)自動(dòng)匹配合適的方法。重載方法的返回類(lèi)型不影響方法的區(qū)分度,因此不能以返回類(lèi)型作為重載的條件。
舉個(gè)例子:
public class OverloadExample { public int add(int a, int b) { return a + b; } public double add(double a, double b) { return a + b; } }
在上面的例子中,add 方法被重載了,分別接受不同類(lèi)型的參數(shù)。
????????
重寫(xiě)(overriding)指的是子類(lèi)重新定義了父類(lèi)中已有的方法,方法名、參數(shù)列表和返回類(lèi)型都相同。重寫(xiě)的方法可以訪問(wèn)父類(lèi)中定義的方法,但是不能重新定義父類(lèi)方法的訪問(wèn)權(quán)限。重寫(xiě)通常用于實(shí)現(xiàn)多態(tài)性,即父類(lèi)引用指向子類(lèi)對(duì)象時(shí),調(diào)用的方法是子類(lèi)中重寫(xiě)的方法。
舉個(gè)例子:
class Animal { public void makeSound() { System.out.println("Some sound"); } } class Cat extends Animal { @Override public void makeSound() { System.out.println("Meow"); } }
在上面的例子中,Cat 類(lèi)重寫(xiě)了 Animal 類(lèi)中的 makeSound 方法。
????????
總的來(lái)說(shuō),重載是一個(gè)編譯時(shí)的概念,而重寫(xiě)是一個(gè)運(yùn)行時(shí)的概念。重載是在同一個(gè)類(lèi)中多個(gè)方法之間的關(guān)系,而重寫(xiě)是子類(lèi)和父類(lèi)之間方法的關(guān)系。
????????
六、Java中的異常處理機(jī)制,Java中異常類(lèi)
在 Java 中,異常是指程序在運(yùn)行時(shí)可能發(fā)生的不正常情況,如錯(cuò)誤、錯(cuò)誤輸入或者是硬件故障等。Java 中的異常處理機(jī)制是通過(guò) try-catch-finally 塊和 throw 關(guān)鍵字來(lái)實(shí)現(xiàn)的。
????????
異常處理機(jī)制的基本概念如下:
????????1. `try-catch` 塊:在 `try` 塊中放置可能會(huì)引發(fā)異常的代碼,然后使用 `catch` 塊來(lái)捕獲并處理這些異常,防止程序中斷。
????????2. `throw` 關(guān)鍵字:用于在代碼中人工觸發(fā)異常,并將異常拋出到調(diào)用者處進(jìn)行處理。
????????3. `finally` 塊:無(wú)論是否發(fā)生了異常,`finally` 塊中的代碼始終會(huì)被執(zhí)行,通常用于資源清理等操作。????????
Java 中的常見(jiàn)異常類(lèi)可以分為兩大類(lèi):Checked 異常和 Unchecked 異常。
????????1. Checked 異常:必須在代碼中顯式地進(jìn)行處理,否則程序?qū)o(wú)法通過(guò)編譯。這些異常通常表示程序中的一些邏輯錯(cuò)誤或外部環(huán)境的問(wèn)題,需要程序員在代碼中處理,以保證程序的穩(wěn)定性。常見(jiàn)的 Checked 異常包括 `IOException`、`FileNotFoundException`、`SQLException` 等。
????????2. Unchecked 異常:不強(qiáng)制要求進(jìn)行顯式地處理,通常由程序邏輯錯(cuò)誤引起,如空指針異常、數(shù)組越界異常等。通常情況下,Unchecked 異常是由 Java 虛擬機(jī)在運(yùn)行時(shí)拋出的。常見(jiàn)的 Unchecked 異常包括 `NullPointerException`、`IndexOutOfBoundsException`、`ArithmeticException` 等。
????????
在實(shí)際編程中,可以根據(jù)實(shí)際需求選擇合適的異常處理策略,并使用 try-catch 塊來(lái)捕獲并處理異常,保證程序的穩(wěn)定性和可靠性。
????????
七、請(qǐng)解釋一下Java中的final、finally、finalize各自的作用
在 Java 中,final、finally 和 finalize 是三個(gè)不同的關(guān)鍵字,具有不同的作用和用途。
1. final 關(guān)鍵字:final 關(guān)鍵字可以用來(lái)修飾類(lèi)、方法和變量。
? ?- 當(dāng) final 修飾一個(gè)類(lèi)時(shí),表示該類(lèi)不能被繼承,即為最終的類(lèi)。
? ?- 當(dāng) final 修飾一個(gè)方法時(shí),表示該方法不能被子類(lèi)重寫(xiě),即為最終的方法。
? ?- 當(dāng) final 修飾一個(gè)變量時(shí),表示該變量的值無(wú)法被修改,即為最終的常量。? ?final 關(guān)鍵字的作用是保證被修飾的類(lèi)、方法或變量的穩(wěn)定性和不可變性,提供額外的安全性和效率。
????????
2. finally 關(guān)鍵字:finally 關(guān)鍵字主要用于異常處理,表示無(wú)論是否發(fā)生異常,finally 塊中的代碼都會(huì)被執(zhí)行。
? ?通常在 try-catch 塊后面跟著一個(gè) finally 塊,用于釋放資源、清理操作和確保關(guān)鍵代碼的執(zhí)行。
try { // 可能會(huì)拋出異常的代碼 } catch (Exception e) { // 異常處理邏輯 } finally { // 無(wú)論有無(wú)異常,都會(huì)執(zhí)行的代碼塊 }
????????
3. finalize 方法:finalize 方法是 Object 類(lèi)的一個(gè)方法,被稱(chēng)為垃圾回收器的“終結(jié)方法”。
? ?finalize 方法通常由垃圾回收器在回收對(duì)象之前調(diào)用,用于在對(duì)象銷(xiāo)毀之前進(jìn)行一些清理操作,例如關(guān)閉文件流或釋放系統(tǒng)資源等。但是,finalize 方法并不是直接銷(xiāo)毀對(duì)象,僅僅是提供了一個(gè)機(jī)會(huì)讓對(duì)象在被銷(xiāo)毀之前執(zhí)行一些必要的清理操作。
? ?在實(shí)際編程中,一般不直接使用 finalize 方法,而是使用 try-finally 塊或者其他合適的資源管理方式來(lái)確保資源的釋放。因?yàn)?finalize 方法的調(diào)用時(shí)間是不確定的,并且對(duì)性能可能會(huì)有一定的影響。
????????
綜上所述,final、finally 和 finalize 三者分別用于修飾和控制類(lèi)、方法和變量的特性,保證程序可靠性、資源釋放和內(nèi)存管理。
????????
八、String、StringBuilder和StringBuffer之間的區(qū)別
String、StringBuilder 和 StringBuffer 是 Java 中處理字符串的三個(gè)類(lèi),它們之間的區(qū)別主要涉及可變性、線程安全性和性能。
????????
1. String 類(lèi):
? ?- 不可變性:String 是不可變的,一旦創(chuàng)建,其值不能被修改。每次對(duì) String 進(jìn)行操作,例如拼接、替換等,都會(huì)創(chuàng)建一個(gè)新的 String 對(duì)象,原來(lái)的 String 對(duì)象會(huì)被丟棄。這種不可變性使得 String 在多線程環(huán)境下是線程安全的。
? ?- 線程安全性:String 是不可變的,因此可以共享,適用于多線程環(huán)境。
? ?- 性能:由于 String 的不可變性,頻繁的字符串拼接操作會(huì)導(dǎo)致創(chuàng)建大量的臨時(shí)對(duì)象,對(duì)內(nèi)存和性能會(huì)帶來(lái)一定的開(kāi)銷(xiāo)。????????
2. StringBuilder 類(lèi):
? ?- 可變性:StringBuilder 是可變的,允許對(duì)字符串進(jìn)行修改和操作,而不會(huì)創(chuàng)建新的對(duì)象。適用于需要頻繁進(jìn)行字符串操作的場(chǎng)景。
? ?- 線程安全性:StringBuilder 不是線程安全的,不適用于多線程環(huán)境下。
? ?- 性能:由于 StringBuilder 的可變性,避免了大量臨時(shí)對(duì)象的創(chuàng)建,對(duì)于頻繁的字符串拼接操作具有更好的性能。????????
3. StringBuffer 類(lèi):
? ?- 可變性:StringBuffer 也是可變的,類(lèi)似于 StringBuilder,允許對(duì)字符串進(jìn)行修改和操作,而不會(huì)創(chuàng)建新的對(duì)象。
? ?- 線程安全性:StringBuffer 是線程安全的,使用了同步機(jī)制,適用于多線程環(huán)境下。
? ?- 性能:由于 StringBuffer 的線程安全性,需要額外的同步開(kāi)銷(xiāo),性能上略低于 StringBuilder。????????
根據(jù)具體的需求,可以選擇使用 String、StringBuilder 或 StringBuffer。如果字符串不需要進(jìn)行頻繁的修改,且在多線程環(huán)境下,建議使用 String 類(lèi);如果字符串需要頻繁的修改且在單線程環(huán)境下,建議使用 StringBuilder;如果在多線程環(huán)境下,建議使用 StringBuffer 來(lái)保證線程安全性。
????????
九、在Java中,==和equals()方法有什么區(qū)別?
在 Java 中,"==" 和 equals() 方法都用于比較對(duì)象,但是它們的作用和行為有所不同。
????????
? 1. "==" 運(yùn)算符:
? ?? ?- 對(duì)于基本數(shù)據(jù)類(lèi)型,"==" 用于比較值是否相等。
? ?? ?- 對(duì)于引用類(lèi)型,"==" 用于比較兩個(gè)對(duì)象的引用是否相等,即比較兩個(gè)對(duì)象在內(nèi)存中的地址是否相同。????????
? 2. equals() 方法:
? ?? ?- equals() 方法是 Object 類(lèi)的一個(gè)方法,在 Java 中的任何對(duì)象都可以直接或間接調(diào)用該方法。
? ?? ?- 默認(rèn)情況下,equals() 方法比較兩個(gè)對(duì)象的引用是否相等,即判斷兩個(gè)對(duì)象是否指向同一塊內(nèi)存地址。
? ?? ?- 但是,可以根據(jù)需要在自定義的類(lèi)中重寫(xiě) equals() 方法,以實(shí)現(xiàn)自定義的對(duì)象比較邏輯,例如比較對(duì)象的字段值是否相等。????????
需要注意的是,對(duì)于常見(jiàn)的 String 類(lèi)和封裝類(lèi)(如 Integer、Double 等),它們重寫(xiě)了 equals() 方法來(lái)比較對(duì)象的內(nèi)容而不是引用。
????????
總結(jié):
? ?- "==" 運(yùn)算符比較的是引用的地址,用于判斷兩個(gè)對(duì)象是否指向同一塊內(nèi)存。
? ?- equals() 方法用于比較對(duì)象的內(nèi)容,但默認(rèn)情況下比較的是引用是否相等,可以通過(guò)重寫(xiě) equals() 方法來(lái)自定義對(duì)象的比較邏輯。
????????
十、ava深拷貝(deep copy)和淺拷貝(shallow copy)
在Java中,深拷貝(Deep Copy)和淺拷貝(Shallow Copy)是用來(lái)描述對(duì)象拷貝的兩種不同方法,它們之間有以下區(qū)別:
? 1. 淺拷貝(Shallow Copy):
? ?? ?- 淺拷貝會(huì)創(chuàng)建一個(gè)新的對(duì)象,該對(duì)象和原始對(duì)象共享相同的引用。
? ?? ?- 對(duì)于引用類(lèi)型的成員變量,淺拷貝只會(huì)復(fù)制引用,而不會(huì)復(fù)制引用指向的對(duì)象本身。
? ?? ?- 因此,在淺拷貝中,對(duì)原始對(duì)象或拷貝對(duì)象的引用類(lèi)型成員變量進(jìn)行修改會(huì)影響到兩者,因?yàn)樗鼈冎赶蛲粋€(gè)對(duì)象。
? ?- 在Java中,可以通過(guò)實(shí)現(xiàn)`Cloneable`接口并重寫(xiě)`clone()`方法來(lái)實(shí)現(xiàn)淺拷貝。? 2. 深拷貝(Deep Copy):
? ?? ?- 深拷貝會(huì)創(chuàng)建一個(gè)新的對(duì)象,該對(duì)象擁有獨(dú)立的引用和值。
? ?? ?- 在深拷貝中,不僅對(duì)對(duì)象進(jìn)行拷貝,還會(huì)對(duì)對(duì)象的引用類(lèi)型成員變量進(jìn)行遞歸拷貝。
? ?? ?- 因此,在深拷貝中,對(duì)原始對(duì)象或拷貝對(duì)象的引用類(lèi)型成員變量進(jìn)行修改不會(huì)相互影響,因?yàn)樗鼈冎赶虿煌膶?duì)象。
? ?? ?- 在Java中,可以通過(guò)實(shí)現(xiàn)`Serializable`接口或使用第三方庫(kù)(例如`Gson`、`Jackson`等)來(lái)實(shí)現(xiàn)深拷貝。需要注意的是,默認(rèn)的對(duì)象拷貝操作是淺拷貝,即對(duì)于簡(jiǎn)單類(lèi)型的成員變量會(huì)進(jìn)行復(fù)制,而對(duì)于引用類(lèi)型的成員變量只會(huì)復(fù)制引用。如果需要實(shí)現(xiàn)深拷貝,開(kāi)發(fā)人員需要顯式地處理引用類(lèi)型的成員變量,以確保其也能被正確地拷貝。
在實(shí)際開(kāi)發(fā)中,需要根據(jù)具體的需求來(lái)選擇使用淺拷貝還是深拷貝,以確保對(duì)象的拷貝行為符合預(yù)期。
????????
十一、Java內(nèi)存泄漏情況
Java內(nèi)存泄漏是指在程序運(yùn)行過(guò)程中,由于無(wú)法釋放不再使用的對(duì)象所占用的內(nèi)存空間,導(dǎo)致系統(tǒng)的可用內(nèi)存持續(xù)減少,最終出現(xiàn)內(nèi)存溢出或性能下降的情況。以下是導(dǎo)致Java內(nèi)存泄漏的常見(jiàn)情況:
- 未及時(shí)釋放對(duì)象引用:當(dāng)一個(gè)對(duì)象不再需要時(shí),如果程序員沒(méi)有及時(shí)將其引用置為null,那么這個(gè)對(duì)象將無(wú)法被垃圾回收器回收,造成內(nèi)存泄漏。
- 集合類(lèi)持有對(duì)象:如果集合類(lèi)(如ArrayList、HashMap等)持有對(duì)象的引用,并且程序員忘記從集合中移除對(duì)象,那么這些對(duì)象將一直被集合持有,無(wú)法被釋放。
- 靜態(tài)集合:靜態(tài)集合中的對(duì)象會(huì)一直存在于內(nèi)存中,如果程序員忘記從靜態(tài)集合中移除對(duì)象,就會(huì)導(dǎo)致內(nèi)存泄漏。
- 監(jiān)聽(tīng)器和回調(diào):注冊(cè)的監(jiān)聽(tīng)器或回調(diào)未被及時(shí)注銷(xiāo),導(dǎo)致持有對(duì)象的引用而無(wú)法被釋放,造成內(nèi)存泄漏。
- 線程:線程的使用也容易導(dǎo)致內(nèi)存泄漏,如果線程未正確終止或無(wú)法正常釋放,會(huì)導(dǎo)致線程持有的對(duì)象無(wú)法被釋放。
- 單例模式:若單例對(duì)象持有了外部對(duì)象的引用,并且長(zhǎng)時(shí)間不釋放,也可能導(dǎo)致內(nèi)存泄漏。
- 使用緩存:緩存中的對(duì)象如果長(zhǎng)時(shí)間保持在緩存中且未設(shè)置合適的過(guò)期策略,也容易導(dǎo)致內(nèi)存泄漏。
為了避免Java內(nèi)存泄漏,開(kāi)發(fā)人員應(yīng)該注意及時(shí)釋放不再使用的對(duì)象引用,避免無(wú)意識(shí)地持有對(duì)象的引用,合理管理集合、監(jiān)聽(tīng)器、線程等對(duì)象的生命周期,并注意內(nèi)存資源的合理利用。此外,可以使用一些內(nèi)存分析工具(如Java VisualVM、YourKit Java Profiler等)來(lái)幫助發(fā)現(xiàn)和解決內(nèi)存泄漏問(wèn)題。
????????
十二、Java多態(tài)特性
Java多態(tài)性(Polymorphism)是面向?qū)ο缶幊讨械囊粋€(gè)重要概念,它允許一個(gè)對(duì)象具有多種形態(tài)。具體來(lái)說(shuō),Java多態(tài)性有兩種形式:靜態(tài)多態(tài)性(編譯時(shí)多態(tài)性)和動(dòng)態(tài)多態(tài)性(運(yùn)行時(shí)多態(tài)性)。
? 1. 靜態(tài)多態(tài)性(編譯時(shí)多態(tài)性):?靜態(tài)多態(tài)性是通過(guò)方法重載(Overloading)實(shí)現(xiàn)的,它允許我們?cè)谕粋€(gè)類(lèi)中定義多個(gè)方法,具有相同的名稱(chēng)但參數(shù)列表不同。在編譯時(shí),編譯器能夠根據(jù)方法調(diào)用的參數(shù)類(lèi)型選擇調(diào)用合適的方法。例如:
public class Calculation { public int add(int a, int b) { return a + b; } public float add(float a, float b) { return a + b; } }
在上述代碼中,
Calculation
類(lèi)中定義了兩個(gè)名為add
的方法,分別接受兩個(gè)整數(shù)和兩個(gè)浮點(diǎn)數(shù)作為參數(shù)。在編譯時(shí),通過(guò)方法調(diào)用的參數(shù)類(lèi)型來(lái)確定調(diào)用哪個(gè)方法。?????????
? 2.?動(dòng)態(tài)多態(tài)性(運(yùn)行時(shí)多態(tài)性):?動(dòng)態(tài)多態(tài)性是通過(guò)方法重寫(xiě)(Overriding)和繼承實(shí)現(xiàn)的。當(dāng)一個(gè)子類(lèi)繼承自父類(lèi)并重寫(xiě)了父類(lèi)的方法后,可以在運(yùn)行時(shí)根據(jù)實(shí)際的對(duì)象類(lèi)型來(lái)調(diào)用該方法。這樣,即使引用變量的類(lèi)型是父類(lèi),當(dāng)實(shí)際的對(duì)象是子類(lèi)對(duì)象時(shí),調(diào)用的是子類(lèi)的方法。例如:
public class Animal { public void makeSound() { System.out.println("Animal is making a sound"); } } public class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog is barking"); } } public class Cat extends Animal { @Override public void makeSound() { System.out.println("Cat is meowing"); } } public class Main { public static void main(String[] args) { Animal animal1 = new Dog(); Animal animal2 = new Cat(); animal1.makeSound(); // 輸出:"Dog is barking" animal2.makeSound(); // 輸出:"Cat is meowing" } }
在上述代碼中,
Animal
類(lèi)是父類(lèi),Dog
和Cat
類(lèi)是子類(lèi),它們都重寫(xiě)了makeSound
方法。在Main
類(lèi)中,創(chuàng)建了一個(gè)Animal
類(lèi)型的引用變量animal1
和animal2
,分別指向Dog
和Cat
實(shí)例。在運(yùn)行時(shí),根據(jù)實(shí)際的對(duì)象類(lèi)型,調(diào)用相應(yīng)子類(lèi)重寫(xiě)的方法。????????
Java多態(tài)性使得代碼更加靈活和可擴(kuò)展,提高了代碼的重用性和可維護(hù)性。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-824844.html
到了這里,關(guān)于Java入門(mén)高頻考查基礎(chǔ)知識(shí)1的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!