2020JAVA面試基礎總結

目錄

 

1、Java的基本數據類型有哪些?各自佔用了多少字節?

2、JDK與JRE有什麼區別

3、Java語言有哪些特點

4、final在Java中有什麼作用(這問題我上禮拜線上面試,技術問我着。。)

5、== 和 equals 的區別是什麼?(這個線上面試也問來着)

6、Java面向對象編程的三大特徵是什麼?

7、hashCode 與 equals

8、String, Stringbuffer, StringBuilder 的區別?

9、抽象類與接口的區別

10、訪問修飾符 public、private、protected、default分別都有什麼作用? 

11、成員變量與局部變量的區別

12、Java異常

13、Java中的IO流

14、Java序列化問題

15、針對14的Java序列化問題,談一下serialVersionUID的作用,Transient 關鍵字作用。

16、深拷貝和淺拷貝的區別是什麼(針對序列化的拓展)

17、Java容器有哪些?

18、List、Set、Map 之間的區別是什麼?

19、 哪些集合類是線程安全的?

20、如何實現數組和 List 之間的轉換?

21、在 Queue 中 poll()和 remove()有什麼區別?

 


1、Java的基本數據類型有哪些?各自佔用了多少字節?

1)、四種整數類型(byte、short、int、long):    byte:8 位,用於表示最小數據單位,short:16 位,很少用,-32768 ~ 32767    int:32 位、最常用,-2^31-1~2^31  (21 億)    long:64 位。

2)、兩種浮點數類型(float、double):    float:32 位,後綴 F 或 f,1 位符號位,8 位指數,23 位有效尾數。    double:64 位。浮點數是不精準的,不能對浮點數進行精確比較。

3)、一種字符類型(char):    char:16 位,是整數類型,用單引號括起來的 1 個字符。

4)、布爾類型(boolean):true 真  和 false 假。

2、JDK與JRE有什麼區別

通常情況下,我們在電腦上下載安裝Java環境時,都會安裝兩個東西,以1.8版本爲例子,會安裝jdk1.8.0和jre1.8.0,那他們有什麼區別呢?

JDK:簡單來講,他提供了Java的開發環境和運行環境。

JRE:他爲Java的運行提供了相對應的環境。

jdk包含了jre,如果只是運行Java程序的話安裝上jre就夠了,但是咱們基本上都是開發人員,就得把jdk得裝上了,因爲咱得開發呀~

3、Java語言有哪些特點

這個問題,咱看過Java核心技術這本書的都知道,第一章就介紹到了這個知識點。

簡單性、面向對象、分佈式、健壯性、安全性、體系結構中立、可移植性、解釋性、高性能、多線程、動態性。

4、final在Java中有什麼作用(這問題我上禮拜線上面試,技術問我着。。)

1)、final修飾的類是最終類,該類不能被繼承。

2)、final修飾的方法是不能被重寫的。

3)、final修飾的變量叫做常量,他是固定不變的值,必須初始化。

其實挺好記下來的,final英文單字意思是最終的,老末唄,理解下來他修飾的東西就是不能被別人拿走。

5、== 和 equals 的區別是什麼?(這個線上面試也問來着)

1)、功能不同,“==”是判斷兩個變量或者是實例是否是指向同一內存空間。

         equals是判斷兩個變量或者是實例所指向的內存空間的值是否相等。

2)、定義不同,equals是Java中的方法,“==”是Java中的運算符。

3)、equals本質上其實就是“==”,但是他是方法,可以重寫,試用equals比較值會返回ture或者false。

6、Java面向對象編程的三大特徵是什麼?

  •   封裝
  •   繼承
  •   多態

7、hashCode 與 equals

    其實把hashCode方法跟equals方法,他們倆的作用是一樣的,在Java中都是判斷兩個對象是否一致的。重寫的equal()裏一般比較的比較全面比較複雜,這樣效率就比較低,而利用hashCode()進行對比,則只要生成一個hash值進行比較就可以了,效率很高。

  但是這樣就hashCode()中存在着一個問題,那就是他並不準確,有些時候,兩個對象的 hashCode()相同,equals()不一定 true。因爲在散列表中,hashCode()相等即兩個鍵值對的哈希值相等,然而哈希值相等,並不一定能得出鍵值對相等。

8、String, Stringbuffer, StringBuilder 的區別?

1)、運行速度:StringBuilder >StringBuffer >String。

2)、線程安全:StringBuilder是線程不安全的,而StringBuffer是線程安全的。

3)、String:適用於少量的字符串操作的情況、StringBuilder:適用於單線程下在字符緩衝區進行大量操作的情況、

StringBuffer:適用多線程下在字符緩衝區進行大量操作的情況。

9、抽象類與接口的區別

1)、抽象類需要子類使用extend來繼承,接口需要implement來實現。

2)、接口只能作爲方法的重申,不能有相關的構造方法,但是抽象類可以。

3)、類可以有多個接口,但是隻能繼承一個抽象類。

4)、接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。

5)、抽象類主要用來抽象類別,接口主要用來抽象功能。

6)、抽象類前面的訪問修飾符(見9)可以是任何,但是接口默認的是public,(寫代碼的時候可以不寫)

10、訪問修飾符 public、private、protected、default分別都有什麼作用? 

1)、public: Java語言中訪問限制最寬的修飾符,一般稱之爲“公共的”。被其修飾的類、屬性以及方法不僅可以跨類訪問,而且允許跨包(package)訪問。
2)、private: Java語言中對訪問權限限制的最窄的修飾符,一般稱之爲“私有的”。被其修飾的類、屬性以及方法只能被該類的對象訪問,其子類不能訪問,更不能允許跨包訪問。
3)、protect: 介於public 和 private 之間的一種訪問修飾符,一般稱之爲“保護形”。被其修飾的類、屬性以及方法只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
4)、default:即不加任何訪問修飾符,通常稱爲"默認訪問模式"。該模式下,只允許在同一個包中進行訪問。

11、成員變量與局部變量的區別

1)、類中的位置不同,成員變量一般在方法外,類內。局部變量則在方法當中。

2)、作用對象不同,成員變量一般是公有的而局部變量一般只是供給方法去使用的。

3)、生命週期不同,成員變量會隨着對象的創建而創建,對象的消失而消失。局部變量只會在執行到對應方法的時候纔會出現,出了這個區域就會馬上從內存當中消失。

4)、初始值不同,成員變量是有默認的初始值的,但是局部變量沒有,必須要初始化之後才能夠使用。

12、Java異常

轉自https://www.cnblogs.com/wrencai/p/5648442.html,這塊我後面再整理,先看人家的。

13、Java中的IO流

1)、按照數據流方向可以分爲:輸入流(InputStream),輸出流(outputStream)。

2)、按照類型分可以分爲:字節流,字符流。 1字符 = 2字節 、 1字節(byte) = 8位(bit)  、 一個漢字佔兩個字節長度

他們倆有一個關於漢字的問題,字節流:每次讀取(寫出)一個字節,當傳輸的資源文件有中文時,就會出現亂碼。字符流:每次讀取(寫出)兩個字節,有中文時,使用該流就可以正確傳輸顯示中文。

14、Java序列化問題

1)、序列化應用的場景:(1)永久的保存對象,保存對象的字節序列到本地文件或者是數據庫中。(2)通過序列化使對象以字節流的形式再網絡中進行傳遞和接收。(3)通過序列化在進程中傳遞對象。

2)、序列化的好處:(1)實現了數據的持久性,通過序列化可以將數據永久的保存在硬盤內。(2)利用序列化實現了遠程的通信。

3)、Java序列化有兩個接口,分別是Serializable和Externalizable接口。但他們倆也是有些區別的:

(1)Externalizable繼承自Serializable接口

(2)需要我們重寫writeExternal()與readExternal()方法

(3)實現Externalizable接口的類必須要提供一個public的無參的構造器。

15、針對14的Java序列化問題,談一下serialVersionUID的作用,Transient 關鍵字作用。

1)、一句話:其目的是序列化對象版本控制,有關各版本反序列化時是否兼容。如果在新版本中這個值修改了,新版本就不兼容舊版本,反序列化時會拋出InvalidClassException異常。如果修改較小,比如僅僅是增加了一個屬性,我們希望向下兼容,老版本的數據都能保留,那就不用修改;如果我們刪除了一個屬性,或者更改了類的繼承關係,必然不兼容舊數據,這時就應該手動更新版本號,即SerialVersionUid。

serialVersionUID有兩種顯示的生成方式:

一是默認的1L,比如:private static final long serialVersionUID = 1L;

二是根據類名、接口名、成員方法及屬性等來生成一個64位的哈希字段,

2)、Transient 關鍵字的作用是控制變量的序列化,在變量聲明前加上該關鍵字,可以阻止該變量被序列化到文件中,在被反序列化後,transient 變量的值被設爲初始值,如 int 型的是 0,對象型的是 null。

16、深拷貝和淺拷貝的區別是什麼(針對序列化的拓展)

1)、其實對象的克隆也就做對象的拷貝,拷貝來講就分爲了兩種,深拷貝和淺拷貝。

淺拷貝:使用一個已知實例對新創建實例的成員變量逐個賦值,這個方式被稱爲淺拷貝。

深拷貝:當一個類的拷貝構造方法,不僅要複製對象的所有非引用成員變量值,還要爲引用類型的成員變量創建新的實例,並且初始化爲形式參數實例值。這個方式稱爲深拷貝。

淺拷貝存在對象拷貝不徹底問題。

2)、他們倆有什麼區別呢:淺拷貝只複製指向某個對象的指針,而不復制對象本身,新舊對象還是共享同一塊內存。但深拷貝會另外創造一個一模一樣的對象,新對象跟原對象不共享內存,修改新對象不會改到原對象。

17、Java容器有哪些?

18、List、Set、Map 之間的區別是什麼?

  • List:有序集合,元素可重複
  • Set:不重複集合,LinkedHashSet按照插入排序,SortedSet可排序,HashSet無序
  • Map:鍵值對集合,存儲鍵、值和之間的映射;Key無序,唯一;value 不要求有序,允許重複

本截圖來源: https://blog.csdn.net/u012102104/article/details/79235938

19、 哪些集合類是線程安全的?

1、vector:就比arraylist多了個同步化機制(線程安全),因爲效率較低,現在已經不太建議使用。在web應用中,特別是前臺頁面,往往效率(頁面響應速度)是優先考慮的。
2、statck:堆棧類,先進後出。
3、hashtable:就比hashmap多了個線程安全。
4、enumeration:枚舉,相當於迭代器。

20、如何實現數組和 List 之間的轉換?

1、List轉換成爲數組:調用ArrayList的toArray方法。

2、數組轉換成爲List:調用Arrays的asList方法。

21、在 Queue 中 poll()和 remove()有什麼區別?

poll() 和 remove() 都是從隊列中取出一個元素,但是 poll() 在獲取元素失敗的時候會返回空,但是 remove() 失敗的時候會拋出異常。

 

關於Java多線程問題,我會另外再寫一個的,這邊主要去總結關於Java基礎方面的一些基本知識點,包括面試的時候會用到的知識。

更多詳細的信息,請看這裏:https://blog.csdn.net/qq_41790332/article/details/105254057


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章