【軟工】【軟體工程】【第一版】
阿新 • • 發佈:2022-04-09
1.21 說一說hashCode()和equals()的關係
hashCode用於獲取雜湊值,equal用於確定兩個物件是否相等
- 如果兩個物件相等,則他們必須擁有相同的雜湊值
- 兩個物件雜湊值相等,則他們未必相等
1.22 為什麼要重寫hashCode()和equals()?
- Object類提供的equals()方法預設是用==進行比較,但在實際業務中,通常是要兩個物件內容相同則相同,所以要重寫
- equal()重寫了,則hashcode()必須重寫。
1.23 ==和equals()有什麼區別?
==運算子:
- 對於基本資料型別,比較其值大小
- 對於引用資料型別,則比較兩個物件的記憶體地址
equals():
- 沒有重寫前預設是==運算子,比較兩個物件的記憶體地址
- 重寫後通常是比較兩個物件內容,內容相等則相等
1.24 String類有哪些方法?
- charAt() 獲取指定字元索引
- indexOf() 獲取索取指定索引字元
- subString(int beginIndex, int endIndex)獲取指定位置子字串
- String toUpperCase():將此字串中所有的字元大寫;
- String toLowerCase():將此字串中所有的字元小寫;
1.25 String可以被繼承嗎?
String類有final修飾,不可被繼承
因為要保證String類不可變,所以用final修飾,如果可以繼承的話就可能存在子類方法修改字串的值,字元常量池就沒有存在的意義了
1.26 說一說String和StringBuffer有什麼區別
- String是一個不可變型別的類,一旦物件建立好之後,只到物件銷燬其字串序列都不會變
- StringBuffer是一個字元可變型別,內部有許多操作字串的API,最終可以轉換為String
1.27 說一說StringBuffer和StringBuilder有什麼區別
- StringBuffer和StringBuilder都是字元可變的
- StringBuffer和StringBuilder有共同的父類AbstractStringBuilder,常用API差不多
- StringBuffer是執行緒安全的,StringBuilder是執行緒不安全的
- 要建立可變字串,建議使用StringBuilder
1.28 使用字串時,new和""推薦使用哪種方式?
- “hello”會在常量池儲存一個hello的字串,由JVM管理
- new String(“hello”)的話首先會在常量池儲存,然後再建立一個String物件
- new方法會多建立一個物件
1.29 說一說你對字串拼接的理解
- +運算子適合字元直接量的拼接,java會有編譯器優化和完整的字串一樣
- StringBuilder適合執行緒不安全,字串包含變數,效能較高
- StringBuffer適合執行緒安全,字元包含變數
1.30 兩個字串相加的底層是如何實現的?
- 如果是字串直接量相加的話,編譯器會將其優化為一個完整的字串
- 如果拼接的字串中包含變數,則在編譯時編譯器採用StringBuilder對其進行優化,即自動建立StringBuilder例項並呼叫其append()方法,將這些字串拼接在一起。
1.31 String a = "abc"; ,說一下這個過程會建立什麼,放在哪裡?
- JVM會使用常量池管理字串,這個過程首先會檢查常量池中存不存在abc,如果存在則直接複用常量池中已有的abc,不存在則將abc放入常量池
1.32 new String("abc") 是去了哪裡,僅僅是在堆裡面嗎?
JVM首先將abc放入字串常量池,然後再在堆記憶體建立一個String物件,物件中的資料引用常量池的直接量
1.33 介面和抽象類有什麼區別?
介面體現的是一種規範,而抽象類體現的是一種模板式設計
- 介面和抽象類都不能例項化,他們都位於繼承樹的頂端,用於被其他類實現或繼承
- 介面和抽象類都可以包含抽象方法,其實現類或者子類都必須實現這些抽象方法
- 一個類最多隻能繼承一個父類,包括抽象類,而一個類可以實現多個介面
- 接口裡不包含構造器;抽象類裡可以包含構造器。抽象類裡的構造器並不是用於建立物件,而是讓其子類呼叫這些構造器來完成屬於抽象類的初始化操作。
1.34 介面中可以有建構函式嗎?
由於介面定義的是一種規範,因此接口裡不能包含構造器和初始化塊定義。
1.35 談談你對面向介面程式設計的理解
介面體現的是一種規範和實現分離的設計,充分利用介面可以降低程式各模組間的耦合,從而提高程式的擴充套件性和可維護性