2020春招Java面試題型彙總《1》

#前言

恍然間就已經到了二月中旬了,還有多少和我一樣仍然困在家中辦公的同學舉個爪,PS(在家真的好無聊啊!!!) 但是,疫情也是非常嚴峻的,大家就儘量躲在家中,少外出吧~

嗯哼! 雖然疫情仍舊嚴峻,但是春招的到來也是必不可免的,今天主要就是給大家總結了一下2020的春招試題,打算今年換一份高薪工作的朋友們,記得收藏啊! 那麼話不多說,進入今天的分享內容吧~

  1. String,StringBuffer,StringBuilder的區別是什麼?String爲什麼是不可變的?

可變性

​ String類中使用的是final關鍵字修飾字符數組保存字符串,private final char value[],所以String對象是不可變的。

​ StringBuffer和StringBuilder都繼承AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組來保存字符串 char[] value,但是沒有用final關鍵字修飾,所以兩種對象是可變的。

線程安全性

​ String中的對象是不可變的,因此也可以理解成線程安全的。

​ AbstractStringBuilder 是 StringBuilder 與 StringBuffer 的公共父類,定義了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。StringBuilder 並沒有對方法進行加同步鎖,所以是非線程安全的。

​ (引申一道題:i++是線程安全的嗎?=============>線程不安全)

性能

​ 每次對String類型進行改變的時候,都會生成一個新的String對象,然後將指針指向新的String對象,這個過程中會重新開闢內存空間,對內存空間極大的浪費。

​ StringBuffer 每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象並改變對象引用。相同情況下使用 StringBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升,但卻要冒多線程不安全的風險。

​ 因此:由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。然而在應用程序要求線程安全的情況下,則必須使用 StringBuffer 類。

總結

1.少量數據:適用String

2.單線程操作字符串緩衝區下操作大量數據: 適用StringBuilder

3.多線程操作字符串緩衝區下操作大量數據: 適用StringBuffer

  1. 構建器Constructor是否可被override?

​ java中,父類的私有屬性和構造方法都不能被繼承,所以Constructor也就不能被重寫,但是可以重載,所有可以看到一個類中有多個構建函數的情況。

  1. 重寫和重載的區別

​ 重寫:重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫,發生在子類中,方法名、參數列表必須相同,返回值範圍小於等於父類,拋出的異常範圍小於等於父類,訪問修飾符範圍大於等於父類。另外,如果父類方法訪問修飾符爲 private 則子類就不能重寫該方法。也就是說方法提供的行爲改變,而方法的外貌並沒有改變。

​ 重載:同一個類中,方法名相同,參數類型不同,個數不同,順序不同,方法返回值和訪問修飾符不同。eg:構建函數。

  1. Java面向對象的三大特性(繼承,封裝,多態)

​ 封裝:封裝把一個對象的屬性私有化,同時提供一些可以被外界訪問的屬性的方法,(get,set)。

​ 繼承:繼承是使用已存在的類的定義作爲基礎建立新類的技術,新類的定義可以增加新的數據或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。通過使用繼承我們能夠非常方便地複用以前的代碼。

​ 多態:多態指的是同一個方法調用,由於對象不同可能會有不同的行爲。

  1. 自動裝箱與拆箱(JDK1.5引入)

​ 裝箱:將基本類型用它們對應的引用類型包裝起來;

​ 拆箱:將包裝類型轉換爲基本數據類型;

​ 基本類型與引用類型:

​ 基礎數據類型:它們存儲的都是數據量比較小的數據,只需要1個或者少量幾個字節就可以了,因此,這些數據類型的變量的二進制就直接保存着他們的值。

​ 引用數據類型:它主要用來指向某個對象,對象保存的數據一般都比較大。

基本數據類型 引用數據類型

byte Byte

short Short

int Integer

long Long

float Float

double Double

char Character

boolean Boolean

  1. 靜態方法內調用一個非靜態成員爲什麼是非法的?

​普通的方法調用都是通過”對象名.方法名“來調用,即需要一個對象,然而靜態方法可以不通過對象進行調用,因此不能調用其他非靜態變量,也不能訪問非靜態變量的成員。

  1. 對象的相等與指向他們的引用相等,兩者有什麼不同?

​對象的相等,比的是內存中存放的內容是否相等。而引用相等,比較的是他們指向的內存地址是否相等。

  1. == 與 equals的區別

​ == : 它的作用是判斷兩個對象的地址是不是相等。即,判斷兩個對象是不是同一個對象(基本數據類型=比較的是值,引用數據類型=比較的是內存地址)。

​ equals() : 它的作用也是判斷兩個對象是否相等。但它一般有兩種使用情況:

情況1:類沒有覆蓋 equals() 方法。則通過 equals() 比較該類的兩個對象時,等價於通過“==”比較這兩個對象。

情況2:類覆蓋了 equals() 方法。一般,我們都覆蓋 equals() 方法來比較兩個對象的內容是否相等;若它們的內容相等,則返回 true (即,認爲這兩個對象相等)。

String 中的 equals 方法是被重寫過的,因爲 object 的 equals 方法是比較的對象的內存地址,而 String 的 equals 方法比較的是對象的值。

當創建 String 類型的對象時,虛擬機會在常量池中查找有沒有已經存在的值和要創建的值相同的對象,如果有就把它賦給當前引用。如果沒有就在常量池中重新創建一個 String 對象。

  1. hashCode 與 equals

​ 面試官可能會問你:“你重寫過 hashcode 和 equals 麼,爲什麼重寫equals時必須重寫hashCode方法?”

​ hashCode()介紹

​ hashCode() 的作用是獲取哈希碼,也稱爲散列碼;它實際上是返回一個int整數。這個哈希碼的作用是確定該對象在哈希表中的索引位置。hashCode() 定義在JDK的Object.java中,這就意味着Java中的任何類都包含有hashCode() 函數。

​ 散列表存儲的是鍵值對(key-value),它的特點是:能根據“鍵”快速的檢索出對應的“值”。這其中就利用到了散列碼!(可以快速找到所需要的對象)

​ 爲什麼要有 hashCode

​ 我們先以“HashSet 如何檢查重複”爲例子來說明爲什麼要有 hashCode: 當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與其他已經加入的對象的 hashcode 值作比較,如果沒有相符的hashcode,HashSet會假設對象沒有重複出現。但是如果發現有相同 hashcode 值的對象,這時會調用 equals()方法來檢查 hashcode 相等的對象是否真的相同。如果兩者相同,HashSet 就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置。(摘自我的Java啓蒙書《Head first java》第二版)。這樣我們就大大減少了 equals 的次數,相應就大大提高了執行速度。

​ 通過我們可以看出:hashCode() 的作用就是獲取哈希碼,也稱爲散列碼;它實際上是返回一個int整數。這個哈希碼的作用是確定該對象在哈希表中的索引位置。hashCode()在散列表中才有用,在其它情況下沒用。在散列表中hashCode() 的作用是獲取對象的散列碼,進而確定該對象在散列表中的位置。

​ hashCode()與equals()的相關規定

如果兩個對象相等,則hashcode一定也是相同的

兩個對象相等,對兩個對象分別調用equals方法都返回true

兩個對象有相同的hashcode值,它們也不一定是相等的

因此,equals 方法被覆蓋過,則 hashCode 方法也必須被覆蓋

hashCode() 的默認行爲是對堆上的對象產生獨特值。如果沒有重寫 hashCode(),則該 class 的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數據)

10.線程,進程,程序的基本概念及關係

​ 線程與進程相似,但線程是一個比進程更小的執行單位。一個進程在其執行的過程中可以產生多個線程。與進程不同的是同類的多個線程共享同一塊內存空間和一組系統資源,所以系統在產生一個線程,或是在各個線程之間作切換工作時,負擔要比進程小得多,也正因爲如此,線程也被稱爲輕量級進程。

​ 程序是含有指令和數據的文件,被存儲在磁盤或其他的數據存儲設備中,也就是說程序是靜態的代碼。

​ 進程是程序的一次執行過程,是系統運行程序的基本單位,因此進程是動態的。系統運行一個程序即是一個進程從創建,運行到消亡的過程。簡單來說,一個進程就是一個執行中的程序,它在計算機中一個指令接着一個指令地執行着,同時,每個進程還佔有某些系統資源如CPU時間,內存空間,文件,輸入輸出設備的使用權等等。換句話說,當程序在執行時,將會被操作系統載入內存中。 線程是進程劃分成的更小的運行單位。線程和進程最大的不同在於基本上各進程是獨立的,而各線程則不一定,因爲同一進程中的線程極有可能會相互影響。從另一角度來說,進程屬於操作系統的範疇,主要是同一段時間內,可以同時執行一個以上的程序,而線程則是在同一程序內幾乎同時執行一個以上的程序段。

最後,以上全部內容本人已整理成PDF文檔形式,如需免費獲取請轉發+關注後私信:面試 即可,最後祝大家身體健康,記得勤戴口罩哦。

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