文章目錄
面向對象和麪向過程的區別
- 面相過程:面相過程性能比面向對象高, 因爲類調用時需要實例化,開銷比較大。
- 面向對象:面向對象更易維護、易複用、易擴展,因爲面向對象有封裝、繼承、多態性的特性。
Java語言有哪些特點
- 面向對象(封裝、繼承、多態)
- 平臺無關性
- 支持多線程
- 支持網絡編程
JVM JDK 和 JRE
- JVM:Java虛擬機(JVM)是運行Java字節碼的虛擬機。JVM有針對不同系統的特定的實現,目的是使用相同的字節碼,他們都能給出相同的結果。字節碼和不同系統的 JVM 實現是 Java 語言一次編譯,隨處可以運行的關鍵所在。
- JDK:JDK是Java Development Kit,它是功能齊全的Java SDK。它擁有JRE所擁有的一切,還有編譯器(javac)和工具(如javadoc和jdb)。它能夠創建和編譯程序。
- JRE:JRE 是 Java運行時環境。它是運行已編譯 Java 程序所需的所有內容的集合,包括 Java虛擬機(JVM),Java類庫,java命令和其他的一些基礎構件。但是,它不能用於創建新程序。
Java和C++的區別
- 都是面嚮對象語言,都支持封裝、繼承、多態
- Java不提供指針來直接訪問內存,程序內存更加安全
- Java類是單繼承,C++支持多繼承,接口可以多繼承
- Java有自動內存管理機制。
字符型常量和字符串常量的區別
- 形式上:字符常量是單引號引起的一個字符,字符常量是雙引號引起的若干字符。
- 含以上:字符常量相當於一個整型值,字符串常量代表一個地址值。
構造器是否可以被override
父類的私有屬性和構造方法並不能被繼承,所以 Constructor 也就不能被 override(重寫),但是可以 overload(重載)
重載和重寫的區別
- 重載:發生在同一個類中,方法名相同,參數類型、個數、順序不同,返回值和訪問修飾符可不同。
- 重寫:發生在父子類中,方法名、參數列表必須相同。
封裝 繼承 多態
- 封裝:把一個對象的屬性私有化。同時提供一些可以被外界訪問的屬性和方法。
- 繼承:在已有類的基礎上建立新類,可以增加新的功能,也可以用父類的功能。
- 多態:指程序中定義的引用變量類型和通過該引用變量調用的方法在編程時並不確定,在程序運行期間才能確定。
實現多態的兩種形式:繼承、接口
String StringBuffer StringBuilder
線程安全
- String對象不可變,線程安全
- StringBuffer對方法加了同步鎖,線程安全
- StringBuilder非線程安全
性能
- String 在改變時,都會生成一個新String對象。
- StringBuffer每次都對StringBuffer對象本身操作,不生成新對象
- StringBuilder性能相比StringBuffer高,但是線程不安全。
總結
- 少量數據:String
- 單線程操作大量數據:StringBuilder
- 多線程操作大量數據:StringBuffer
自動裝箱與拆箱
裝箱:將基本類型用引用類型包裝起來
拆箱:將包裝類型轉換爲基本數據類型
接口和抽象類的區別
- 接口方法默認是public,所有方法在接口中不能有實現,抽象類可以有非抽象的方法
- 接口只能有static、final變量
- 類可以實現多個接口,只能實現一個抽象類
- 設計層面來說,抽象是對類的抽象,是一種模板設計,而接口是對行爲的抽象,是一種行爲的規範。
== 與 equals
- == 判斷兩個對象是不是相等(是不是同一對象)
對於 equals(),有兩種情況
- 沒有覆蓋equals方法,等價於使用==比較
- 覆蓋了equals方法,若他們內容相等則返回true
String 的equals被重寫過,object比較的是對象地址,String比較的是值。
創建String 類型的對象時,首先會在常量池中查找有沒有和要創建值相同的對象,否則就在常量池中創建一個對象。
hashCode 與 equals
hashCode作用是獲取哈希碼。實際上返回一個int整數。這個哈希碼可以確定對象在哈希表中的索引位置。hashCode定義在Object中,Java中任何類都有hashCode函數。
- 如果兩個對象相對,則hashCode一定相等
- 兩個對象相等,對兩個對象分別調用equals方法都返回true
- 兩個對象有相同的hashCode,他們也不一定相等。
- 因此,equals 方法被覆蓋過,則 hashCode 方法也必須被覆蓋
線程的基本狀態
- 當線程執行 wait()方法之後,線程進入 WAITING(等待) 狀態。
- 進入等待狀態的線程需要依靠其他線程的通知才能夠返回到運行狀態,而TIME_WAITING(超時等待) 狀態相當於在等待狀態的基礎上增加了超時限制,比如通過 sleep(long millis)方法或 wait(long millis)方法可以將 Java 線程置於 TIMED WAITING 狀態。當超時時間到達後 Java 線程將會返回到 RUNNABLE 狀態。
- 當線程調用同步方法時,在沒有獲取到鎖的情況下,線程將會進入到 BLOCKED(阻塞) 狀態。
- 線程在執行 Runnable 的run()方法之後將會進入到 TERMINATED(終止) 狀態。
final 關鍵字
final關鍵字可以修飾變量、方法、類
- 修飾變量:如果是基本類型,一旦初始化不能更改;如果是引用類型,則是不能指向其他的對象
- 修飾類:表明不能被繼承
- 修飾方法:可以避免繼承類修改他的定義。private都隱式的指定爲final
Java異常
異常層次
Java中所有的異常都是Throwable類的子類。
- Error:是程序無法處理的錯誤,表示運行應用程序中較嚴重的問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM出現的問題。比如OutOfMemoryError。這些異常發生時,Java虛擬機一般會選擇線程終止。
- Exception:是程序本身可以處理的異常。 Exception 類有一個重要的子類 RuntimeException。RuntimeException 異常由Java虛擬機拋出。比如NullPointerException、ArithmeticException、ArrayIndexOutOfBoundsException
異常處理
- try——用於捕獲異常
- catch——用於處理try捕獲到的異常
- finally——無論是否捕獲到,都會執行的代碼塊
try或cache中出現return時,finally語句塊將在方法返回之前被執行,若finally裏面有返回,他會覆蓋原始的返回值。
有些字段不想進行序列化
使用transient關鍵字修飾。當對象被反序列化時,被transient修飾的變量值不會被持久化和恢復。