首頁 > 易卦

Java工程師成神之路(問題&答案1)

作者:由 程式秘籍 發表于 易卦日期:2023-01-20

欄位變成雙精度是什麼意思

java程式站專門收集整理了《Java工程師成神之路(1)》問題和答案整理成冊,分成系列文章分享給大家。

Java工程師成神之路(問題&答案1)

基礎篇

01面向物件

→ 什麼是面向物件、面向過程?

面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次呼叫就可以了。

面向物件是把構成問題事務分解成各個物件,建立物件的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。

面向物件的三大基本特徵和五大基本原則?

一、三大基本特徵:封裝、繼承、多型

1、封裝:也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏

2、繼承:所謂繼承是指可以讓某個型別的物件獲得另一個型別的物件的屬性的方法。它支援按級分類的概念。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件

3、多型:所謂多型就是指一個類例項的相同方法在不同情形有不同表現形式。多型機制使具有不同內部結構的物件可以共享相同的外部介面。這意味著,雖然針對不同物件的具體操作不同,但透過一個公共的類,它們(那些操作)可以透過相同的方式予以呼叫

二、五大基本原則

1、單一職責原則(SRP)是指一個類的功能要單一,不能包羅永珍

2、開放封閉原則(OCP)一個模組在擴充套件性方面應該是開放的而在更改性方面應該是封閉的

3、里氏替換原則(LSP)子類應當可以替換父類並出現在父類能夠出現的任何地方。繼承的體現

4、依賴倒置原則(DIP)具體依賴抽象,上層依賴下層。

5、介面隔離原則(ISP)模組間要透過抽象介面隔離開,不透過具體的類關聯,降低耦合度

→ 平臺無關性

什麼是平臺無關性,Java是如何做到平臺無關的?

平臺無關(跨平臺): 一種語言在計算機上的執行不受平臺的約束,一次編譯到處執行。

Java經過編譯之後生成的。class 的位元組碼檔案,執行平臺上只要有JVM就能執行,不需要進行再次編譯

JVM 還支援哪些語言(Kotlin、Groovy、JRuby、Jython、Scala)

→ 值傳遞

值傳遞、引用傳遞

java中只存在值傳遞,只存在值傳遞!!! 然而我們經常看到對於物件(陣列,類,介面)的傳遞似乎有點像引用傳遞,可以改變物件中某個屬性的值。但是不要被這個假象所矇蔽,實際上這個傳入函式的值是物件引用的複製,即傳遞的是引用的地址值,所以還是按值傳遞。

為什麼說 Java 中只有值傳遞?

Java 語言的引數傳遞只有「按值傳遞」。當一個例項物件作為引數被傳遞到方法中時,引數的值就是該物件的引用的一個副本。指向同一個物件,物件的內容可以在被呼叫的方法內改變,但物件的引用(不是引用的副本) 是永遠不會改變的。

按值傳遞的精髓是:傳遞的是儲存單元中的內容,而不是儲存單元的引用!

Java工程師成神之路(問題&答案1)

→ 封裝、繼承、多型

繼承

Java工程師成神之路(問題&答案1)

多型

Java工程師成神之路(問題&答案1)

方法過載與方法重寫

Java工程師成神之路(問題&答案1)

修飾符

Java工程師成神之路(問題&答案1)

程式碼塊

Java工程師成神之路(問題&答案1)

final關鍵字

Java工程師成神之路(問題&答案1)

程式碼塊的執行順序:靜態程式碼塊優先於構造程式碼塊,構造程式碼塊優先於構造方法。

02 Java 基礎知識

→ 基本資料型別

7 種基本資料型別:整型、浮點型、布林型、字元型以及取值範圍?

Java工程師成神之路(問題&答案1)

什麼是浮點型?什麼是單精度和雙精度?

單精度浮點數(float)與雙精度浮點數(double)的區別如下:

(1)在記憶體中佔有的位元組數不同

單精度浮點數在機內佔4個位元組

雙精度浮點數在機內佔8個位元組

(2)有效數字位數不同

單精度浮點數有效數字8位

雙精度浮點數有效數字16位

(3)所能表示數的範圍不同

單精度浮點的表示範圍:-3。40E+38 ~ +3。40E+38

雙精度浮點的表示範圍:-1。79E+308 ~ +1。79E+308

(4)在程式中處理速度不同一般來說,CPU處理單精度浮點數的速度比處理雙精度浮點數快

為什麼不能用浮點型表示金額?

金額計算不能用doube!必須用BigDecimal

1。出現科學計數法

2。計算金額不準確,丟失精度

→ 自動拆裝箱

什麼是包裝型別、什麼是基本型別?

1、為什麼存在基本型別:

在Java中正常應該設定物件,然後透過new一個物件儲存在堆中,再透過棧的引用來使用物件,但對於簡單的小的變數,用new

顯的繁瑣麻煩,所以產生了基本型別

2、有了基本型別,為什麼還會產生包裝型別:

(1)什麼是包裝類:

包裝型別相當於將基本型別包裝起來,使其具有物件的性質,並且可以新增屬性和方法,豐富了基本型別的操作。

(2)包裝型別具有哪些好處:

符合Java面向物件程式設計特徵

使用集合Collection就一定要用包裝型別

需要往ArrayList,HashMap放東西,int和double是放不進去的

3、二者相互轉換

(1)int轉換integer

int i=0

ineger ii=new integer(i)

(2)integer轉int

integer ii=new interger(0)

int i=ii。intValue();

4、二者的區別

(1)基本型別直接宣告而包裝型別需使用new關鍵字來在堆中分配記憶體空間

(2)基本型別儲存在棧中而包裝型別儲存在堆中透過引用

(3)基本型別初始值,int為0,boolean為false。包裝型別初始值為null

(4)基本型別直接賦值使用就好,包裝型別需要在集合如Collection、map時會使用

什麼是自動拆裝箱?

自動裝箱: 就是將基本資料型別自動轉換成對應的包裝類。

自動拆箱:就是將包裝類自動轉換成對應的基本資料型別。

自動裝箱都是透過包裝類的valueOf()方法來實現的。自動拆箱都是透過包裝類物件的xxxValue()來實現的。

Integer 的快取機制?

當使用自動裝箱的時候,也就是將基本資料型別傳遞給物件類的時候觸發自動裝箱。這個時候java虛擬機器會建立一系列的整數並且快取到一個數組中以便直接使用,這就是快取策略

→ String

字串的不可變性

JDK 6 和 JDK 7 中 substring 的原理及區別?

JDK6中,String是透過字元陣列實現的,String類包含三個成員變數:char value[], int offset,int count。他們分別用來儲存真正的字元陣列,陣列的第一個位置索引以及字串中包含的字元個數。

JDK6中的substring導致的問題

如果字串很長,但是隻需substring切割很短的一段。這可能導致效能問題,因為只需要的是一小段字元序列,卻引用了整個字串(因為這個很長的字元陣列一直被引用,而無法被回收,就可能導致記憶體洩露)。

在JDK 6中,一般用以下方式來解決該問題,原理其實就是生成一個新的字串並引用他。

x = x。substring(x, y) + “”

JDK 7 中的substring

上述問題,在JDK7中得到解決。

在jdk 7 中,substring方法會在堆記憶體中建立一個新的陣列。

//JDK 7

public String(char value[], int offset, int count) {

//check boundary

this。value = Arrays。copyOfRange(value, offset, offset + count);

}

public String substring(int beginIndex, int endIndex) {

//check boundary

int subLen = endIndex - beginIndex;

return new String(value, beginIndex, subLen);

}

replaceFirst、replaceAll、replace 區別?

· replace(CharSequence target, CharSequence replacement) ,用replacement替換所有的target,兩個引數都是字串。

· replaceAll(String regex, String replacement) ,用replacement替換所有的regex匹配項,regex很明顯是個正則表示式,replacement是字串。

· replaceFirst(String regex, String replacement) ,基本和replaceAll相同,區別是隻替換第一個匹配項。

String s = “my。test。txt”;

System。out。println(s。replace(“。”, “#”)); // replace將字串中的。 都替換為 #

System。out。println(s。replaceAll(“。”, “#”)); // replaceAll 用到了正則表示式,其中。 是任意字元的意思,所以結果是字串全部替換為#

System。out。println(s。replaceFirst(“。”, “#”)); // replaceFirst 用到了正則表示式, 其中。 是任意字元的意思,所以第一個字元被#號代替

System。out。println(s。replaceFirst(“\\。”, “#”)); // 正則表示式中雙槓是原生字串的意思,所以結果是字串中第一個。 被#代替得到

String 對“+”的過載?

String 類底層是一個 final 修飾的 char 型別陣列,意味著 String 類的物件是不可變的,所以 String 物件可以共享。

String 類中的每一個看起來會修改 String 值的方法,實際上都是建立了一個全新的 String 物件,用來包含修改後的字串內容,這也可以說明 String 物件具有隻讀的屬性。

String fruit = “Apple,” + “Pear,” + “Orange”;

編譯器會建立一個 StringBuilder 物件,用來構造最終要生成的 String,併為每一個字串呼叫一次 StringBuilder 中的 append() 方法,因此程式碼一共執行了三次 append() 方法。最後呼叫 toString 生成最終的結果,並儲存為 fruit。

字串拼接的幾種方式和區別?

1。無論如何直接用“+”號連線字串都是最慢的

2。在拼接少數字符串(不超過4個)的時候,concat效率是最高的

3。多個字串拼接的時候,StringBuilder/StringBuffer的效率是碾壓的

4。在不需要考慮執行緒安全問題的時候,使用StringBuilder的效率比StringBuffer更高

String。valueOf 和 Integer。toString 的區別?

String。valueOf()可以應用到任何資料型別,且不會有異常報出。

Integer。toString()表示先講int轉換成Integer型,然後再將Integer轉換成String型。

總的來說 String。valueOf()用的比較多(應用的資料型別無限制),但是基本上每個JAVA物件都會有一個toString方法。2個方法的執行結果還是一樣的,只是原理(執行過程)不一樣。

switch 對 String 的支援?

java中switch支援String,是利用String的hash值,本質上是switch-int結構。並且利用到了equals方法來防止hash衝突的問題。最後利用switch-byte結構,精確匹配。

字串池、常量池(執行時常量池、Class 常量池)、intern?

1。全域性常量池在每個VM中只有一份,存放的是字串常量的引用值。

2。class常量池是在編譯的時候每個class都有的,在編譯階段,存放的是常量的符號引用。

3。執行時常量池是在類載入完成之後,將每個class常量池中的符號引用值轉存到執行時常量池中,也就是說,每個class都有一個執行時常量池,類在解析之後,將符號引用替換成直接引用,與全域性常量池中的引用值保持一致。

→ 熟悉 Java 中各種關鍵字

transient、instanceof、final、static、volatile、synchronized、const 原理及用法

transient:修飾變數,在實現Serializable介面的類中,可以避免持久化,但是如果實現的是Externalizable介面,那麼手動序列化會無視 transient。

instanceof:物件 instanceof 類,檢查物件是否是這個類或者這個類的子類的物件,返回布林值。

volatile:輕量級的執行緒安全的實現,但是要注意用法,某些場合不適合用volatile,保證可見性,有序性

synchronized:執行緒安全的修飾符,鎖住物件的訪問許可權。

final:

final修飾類:該類不可繼承

final修飾方法:該方法不能被子類覆蓋(但它不能修飾建構函式)

final修飾字段屬性:屬性值第一次初始化後不能被修改

使用final可以提高程式執行的效率,將一個方法設成final後編譯器就可以把對那個方法的所有呼叫都置入“嵌入”呼叫裡。

static:

static修飾成員函式則該函式不能使用this物件

static不能修飾建構函式、函式引數、區域性成員變數

static修飾成員欄位則當類被虛擬機器載入時按照宣告先後順序對static成員欄位進行初始化。

static修飾語句塊:當類被虛擬機器載入時按照宣告先後順序初始化static成員欄位和static語句塊

static所修飾的方法和欄位只屬於類,所有物件共享,java不能直接定義全域性變數,是透過static來實現的。

java中沒有const,不能直接定義常量,是透過static final組合來實現的。

專注java職場經驗,技術分享,歡迎關注公眾號:程式秘籍