面試1
Java面試1
https://juejin.cn/post/6908514567232421895
1.面向對象和面向過程的區別:
面向過程:分析問題的步驟,然后用函數把這些步驟一步一步的實現,然后在使用的時候一一調用即可。
面向對象:把構成問題的事務分解成各個對象,建立對象的目的也不是完成一個個步驟而是為了在解決某個事物整個過程中所發生的行為。易維護,易復用,易擴展但是性能比面向過程低。
2.普通類和抽象類的區別:
普通類可以實例化調用,抽象類不能被實例化;普通類不能包含抽象方法,可以有普通方法,抽象類可以包含抽象方法。
3.接口和抽象類的區別:
實現:抽象類的子類只能用extend繼承,接口必須使用implements來實現接口;
構造函數:抽象類可以有多個構造函數,接口沒有構造函數;
實現數量:類可以實現多個接口,但是只能繼承一個抽象類;
訪問修飾符:接口的方法默認是public修飾,抽象類中的方法可以是任意訪問修飾符;
4.JDK和JRE有什么區別:
JDK:java開發工具包,提供了java的開發環境和運行環境。
JRE:java運行環境,提供了java運行所需環境。
JDK包含JRE,編譯器,java源碼等,JRE包含JVM和需要運行的程序。運行java程序安裝JRE就可以了,日常開發需要安裝JDK。
5.重載和重寫的區別:
重載方法的規則:
- 參數列表:被重載的方法必須改變參數列表;
- 返回類型:可以改變返回類型;
- 修飾符:可以改變修飾符;
- 異常:可以聲明新的或者更廣泛的異常;
重寫方法的規則:
- 參數列表:必須與重寫方法的參數列表完全匹配;
- 返回類型:必須與超類中被重寫的方法聲明的返回類型或子類型完全相同;
- 訪問級別:一定不能被重寫的方法強,可以比被重寫方法弱;
- 非檢查異常:重寫方法可以拋出任何非檢查的異常,無論被重寫方法是否聲明了該異常;
- 檢查異常:重寫方法一定不能拋出新的檢查異常,或比被重寫方法聲明的檢查異常更廣的檢查異常;
- 修飾符:不能重寫標志為final,static的方法;
重載和重寫,方法的重載和重寫是java多態的不同表現。重寫是父類和子類之間多態性的一種表現,重載是一個類中多態的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,該方法被重寫。
6.equals和==的區別
基本類型:比較的是值是否相等;
引用類型:比較的引用是否相同;
==:在進行基本類型比較時比較的是值,在非基本數據類型時比較的時其關聯的對象在內存中的地址;
equals:在進行基本類型比較時會報編譯錯誤;equals是Object中的方法,在Object類中equals方法是用來比較兩個對象的引用是否相等,但是在String類中重寫了equals方法,在String類中equals用來比較指向字符串對象所存儲的字符串是否相等。
7.重寫equals方法時為什么必須要重寫hashCode方法:
hashCode()的作用是獲取哈希碼,也稱為散列碼;它實際上返回是一個int整數。哈希碼的作用是確定該對象在哈希表中的索引位置。hashCode()定義在JDK的Object類中,意味著Java中任何類都包含hashCode()函數。
如果兩個對象equals和==相等則hashcode一定相同反之則不一定。在將對象加入HashSet中會先計算hsahCode值來判斷對象加入的位置,同時其他對象加入時會將他們的hashCode值進行比較如果不同這時會調用equals()方法來檢查hashcode相等的對象是否真的相同。如果相同HashSet就不會讓其加入成功,不同就會重新散列到其他位置。這樣減少了equals的次數。如果兩個對象相等則hashCode一定相同。兩個對象有相同的hsahcode值,他們也不一定是相等的因此ewuals方法重寫則hashCode方法也被重寫。
8.java的基本數據類型有哪些,什么是自動拆裝箱,String屬于基礎的數據類型嗎:
java基本數據類型有8種:byte(1字節),short(2字節),int(4字節),long(8字節),char(2字節),float(4字節),double(8字節),boolean(2字節);String屬于對象不屬于基本類型;
自動裝箱: 就是將基本數據類型自動轉換成對應的包裝類。
自動拆箱:就是將包裝類自動轉換成對應的基本數據類型
為什么需要包裝類:
java是一種面向對象的語言很多地方需要使用對象而不是基本數據類型(比如,集合的容器要求元素是Object類型)讓基本類型有對象的特征出現了包裝類。
int自動裝箱都是通過Intefer.valueOf()方法來實現的,Integer的自動拆箱都是通過Integer.intValue()來實現的。
9.final,finally,finalize的區別:
final:用于聲明屬性,方法和類, 分別表示屬性不可變, 方法不可覆蓋, 類不可繼承。final 修飾的變量叫常量,常量必須初始化,初始化之后值就不能被修改;
finally:是異常處理語句結構的一部分,表示總是執行;
finalize:是 Object 類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等 JVM 不保證此方法總被調用;
10.String,StringBuffer,StringBuider之間有什么區別:
String和StringBuffer,StringBUider的區別在于String聲明的是不可變的對象,每次操作都會生成新的String對象,然后將指針指向新的String對象,而StringBuffer,StringBuilder可以在原有對象的基礎上進行操作。StringBuffer和StringBuilder最大的區別在于,StringBuffer是線程安全的而StringBuider是非線程安全的,但是StringBuilder的性能高于StringBuffer,單線程推薦StringBuilder,多線程推薦StringBuffer;
11.String類的常用方法:
- indexOf():返回指定字符的索引
- charAt():返回指定索引處的字符
- replace():字符串替換
- trim():去除字符串兩端空白
- split():分割字符串,返回一個分割后的字符串數組
- getBytes():返回字符串的byte類型數組
- length():返回字符串長度
- toLowerCase():將字符串轉成小寫字母
- toUpperCase():將字符串轉成大寫字母
- substring():截取字符串
- equals():字符串比較
12.深淺拷貝的區別:
- 淺拷貝:被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象,淺拷貝僅僅復制所考慮的對象,而不復制它所引用的對象;
- 深拷貝:被復制對象的所有變量都含有與原來對象相同的值,而那些引用其他對象的變量將指向被復制過的新的對象,而不再是原來的那些被引用的對象,深拷貝把要復制的對象所引用的對象都復制了一遍。
13.try catch finally,try里面有return,finally還執行嗎?
不管有沒有異常,finally都會執行;try里面有return,finally會執行而且會早于return;finally是在return后面的表達式運算后執行但此時返回運算后的值先保存起來,不管finally的代碼怎么樣返回值都不會改變仍是之前保存的值,所以返回值是在finally執行前確定的;finally里面最好不要包含return否則程序會提前退出返回值不是try或catch中保存的返回值;
14.java中IO流分類
- 功能:輸入流(input),輸出流(output)
- 類型:字節流,字符流
字節流和字符流的區別是字節流按8位傳輸以字節單位輸入輸出數據,字節流按16位傳輸已字符流傳輸數據。
15.BIO,NIO,AIO有什么區別:
-
BIO:Block IO同步阻塞式IO,就是我們平常使用的傳統 IO,它的特點是模式簡單使用方便,并發處理能力低。
-
NIO:Non IO 同步非阻塞 IO,是傳統 IO 的升級,客戶端和服務器端通過 Channel(通道)通訊,實現了多路復用。
-
AIO:Asynchronous IO 是 NIO 的升級,也叫 NIO2,實現了異步非堵塞 IO ,異步 IO 的操作基于事件和回調機制。
16.Files的常用方法都有哪些:
-
Files. exists():檢測文件路徑是否存在。
-
Files. createFile():創建文件。
-
Files. createDirectory():創建文件夾。
-
Files. delete():刪除一個文件或目錄。
-
Files.deleteIfExists() :存在才刪除,不存在時不會報錯。。
-
Files. copy():復制文件。
-
Files. move():移動文件。
-
Files. size():查看文件個數。
-
Files. read():讀取文件。
-
Files. write():寫入文件。

浙公網安備 33010602011771號