1、String、StringBuffer、StringBuilder
- 操作少量數據->String
- 單線程操作字符串緩沖區下操作大量數據->StringBuilder
- 多線程操作字符串緩沖區下操作大量數據->StringBuffer
- 可變性:String類中使用final關鍵字
private final char value[]
,所以String對象是不可變的。而StringBuilder和StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuiler類中也是使用字符數組保存字符串char[] valur
,但是沒有用到final關鍵字,所以StringBuilder和StringBuffer都是可變的。 - 線程安全性:String中的對象是不可變的,也就可以理解為常量,所以String是線程安全的。AbstractStringBuilder是StringBuilder和StringBuffer的公共父類,它定義了一些字符串的基本操作,如:append、insert、indexOf等公共方法。StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以StringBuffer是線程安全的。而StringBuilder并沒有對方法進行加同步鎖,所以StringBuilder是線程不安全的。
- 性能:每次對String類型進行改變的時候,都會生成一個新的String對象,然后將指針指向新的String對象。StringBuffer每次都會對StringBuffer對象本身進行操作,而不是生成新的對象并改變對象引用。相同的情況下使用StringBuilder相對比StringBuffer能獲得10%-15%左右的性能提升,但要冒線程不安全的險。
2、裝箱、拆箱
- 裝箱:將基本類型用它們對應的引用類型包裝起來
- 拆箱:將包裝類型轉換為基本數據類型
3、無參構造函數的作用
程序在執行子類的構造方法之前,如果沒有用super()來調用父類特定的構造方法,則會調用父類中沒有參數的構造方法。因此,如果父類中只定義了有參數的構造方法,而在子類的構造方法中又沒有用super()來調用父類中特定的構造方法,則編譯時會發生錯誤。而且需要注意一點:如果沒有定義任何構造函數,那么程序會幫我們自動定義一個默認無參的構造函數;如果只定義了有參構造函數,那么程序就不會幫我們定義無參構造函數。所以最保守的方法還是手動定義無參的構造函數。
4、java包、javax包
起初JavaAPI所需的包時java包,javax包當時只是擴展API包來使用。隨著時間的推移,javax包逐漸擴展成為JavaAPI的組成部分。但是直接遷移比較麻煩,會破壞許多原有的代碼,因此最終決定javax包成為標準API的一部分。
5、接口、抽象類
- 接口的方法默認是public,所有方法在接口中不能有實現(java8開始接口方法可以用默認實現),抽象類可以有非抽象的方法,抽象方法必須只能聲明,子類實現
- 接口中的實例變量默認是final類型的,而抽象類中不一定
- 一個類可以實現多個接口,但最多只能繼承一個抽象類
- 一個類實現接口的話就要實現接口的所有方法,而繼承抽象類的話不一定
- 接口不能用new實例化,但可以聲明,但是必須引用一個實現該接口的對象
- 抽象是對類的抽象,是一種模板設計;接口是行為的抽象,是一種行為的規范
- 注:java8中,接口可以定義靜態方法,可以直接用接口名調用,實現類和實現不可以調用。如果同時實現兩個接口,接口中定義了一樣的默認方法,必須重寫。
6、成員變量、局部變量
- 語法形式:成員變量屬于類,局部變量屬于方法(在方法中定義or方法的參數);成員變量可以被public、private、static等修飾符所修飾,而局部變量不能被訪問控制修飾符和static修飾;但是,兩者都可以被final修飾
- 在內存中存儲方式:局部變量,如果是基本數據類型,那么就直接存在棧中,如果是包裝類型,比如
Integer i = new Integer (12);
,會把對象存在堆中,對象的引用存在棧中。 成員變量,類的成員在不同對象中各不相同,基本數據類型和引用數據類型都存儲在這個對象中,作為整體一并存儲在堆中。而類的方法是所有對象共享的,方法是存在方法區的,只用當調用的時候才會被壓棧,不用的時候是占內存的。 - 生存時間:成員變量是對象的一部分,它隨著對象的創建而存在;局部變量隨著方法的調用完畢而自動消失
- 沒有賦初始值:成員變量會按照類型的默認值而賦值(除了被final修飾的變量);局部變量不會自動賦值
7、創建一個對象用什么運算符?對象實體、對象引用的差異?
使用new運算符,new創建對象實例(對象實例在堆內存中),對象引用指向對象實例(對象引用存在棧內存中)。把對象實體比作氣球,把對象引用比作繩子:一根繩子可以不系氣球,也可以系一個氣球;一個氣球可以被n條繩子系住。結論:一個對象引用可以指向0個/1個對象實體;一個對象實體可以有n個對象引用指向它。
8、構造方法的特性
- 名字與類名相同
- 雖然沒有返回值,但是也不能用void聲明
- 生成對象時自動執行,不用手動調用
9、靜態方法、實例方法
在外部調用靜態方法時,可以使用類名.方法名的方式,也可以使用對象名.方法名的方式。而實例方法只能通過對象名.方法名來調用。靜態方法在訪問本類的成員時,只允許訪問靜態變量、靜態方法,不允許訪問實例成員變量、方法,而實例方法沒有這樣的限制
10、final 關鍵字
- 變量:對于一個final變量,如果是基本數據類型的變量,則其數值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象。
- 類:當用final修飾一個類時,表明這個類不能被繼承。final類中的所有成員方法都會被隱式地指定為final方法。
- 方法:第一個原因是把方法鎖定,以防任何繼承類修改它的含義,不能重寫;第二個原因是效率。在早期的Java實現版本中,會將final方法轉為內嵌調用。但是如果方法過于龐大,可能看不到內嵌調用帶來的任何性能提升(現在的Java版本已經不需要使用final方法進行這些優化了)。類中所有的private方法都隱式地指定為final。