天天看點

Java常見面試問題

Java常見面試問題

  • ​​一、Java基礎,[ORACLE官網——Java架構總概括](https://docs.oracle.com/javase/8/docs/index.html)​​
  • ​​1.1、 面向對象和面向過程的差別​​
  • ​​1.2、java的四個基本特性​​
  • ​​1.3、重載和重寫的差別​​
  • ​​1.4、采用位元組碼的好處​​
  • ​​1.5、構造器Constructor是否可被override​​
  • ​​1.6、通路控制符public,protected,private,以及預設的差別​​
  • ​​1.7、 是否可以繼承String類​​
  • ​​1.8、String和StringBuffer、StringBuilder的差別​​
  • ​​1.9、hashCode和equals方法的關系​​
  • ​​1.10、Java語言采用的編碼方案​​
  • ​​1.11、抽象類和接口的差別​​
  • ​​1.12、自動裝箱與拆箱​​
  • ​​1.13、什麼是泛型、為什麼要使用以及泛型擦除​​
  • ​​1.14、Java中的集合類及關系圖​​
  • ​​1.15、HashMap實作原理​​
  • ​​1.16、HashTable實作原理​​
  • ​​1.17、HashMap和HashTable差別​​
  • ​​1.18、ArrayList和vector差別​​
  • ​​1.19、Synchronized和可重入鎖​​
  • ​​1.20、servlet和filter的差別​​
  • ​​1.21、JVM規範中,将JVM運作資料,分為幾種​​
  • ​​1.22、Http的運作過程​​
  • ​​1.23、Object的常用方法​​
  • ​​1.24、​​
  • ​​1.25、​​
  • ​​1.26、​​
  • ​​二、Spring系列​​
  • ​​2.1、spring的三種依賴方式​​
  • ​​2.2、SpringMVC的運作機制​​
  • ​​2.1、​​
  • ​​2.1、​​
  • ​​2.1、​​
  • ​​2.1、​​
  • ​​三、SpringCloud系列​​
  • ​​3.1、feignClient的實作機制​​

一、Java基礎,​​ORACLE官網——Java架構總概括​​

1.1、 面向對象和面向過程的差別

· 面向過程

優點:性能比面向對象高,因為類調用時需要執行個體化,開銷比較大,比較消耗資源;比如單片機、嵌入式開發、Linux/Unix等一般采用面向過程開發,性能是最重要的因素

缺點:沒有面向對象易維護、易複用、易擴充。

· 面向對象

優點:易維護、易複用、易擴充,由于面向對象有封裝、繼承、多态性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易于維護。

缺點:性能比面向過程低。

1.2、java的四個基本特性

抽象:就是把現實生活中的某一類東西提取出來,用程式代碼表示,我們通常叫做類或者接口。抽象包括兩個方面:一個是資料抽象,一個是過程抽象。資料抽象也就是對象的屬性。過程抽象是對象的行為特征。

封裝:把客觀事物封裝成抽象的類,并且類可以把自己的資料和方法隻讓可信的類或者對象操作,對不可信的進行封裝隐藏。封裝分為屬性的封裝和方法的封裝。

繼承:是對有着共同特性的多類事物,進行再抽象成一個類。這個類就是多類事物的父類。父類的意義在于抽取多類事物的共性。

多态:允許不同類的對象對同一消息做出響應。方法的重載、類的覆寫正展現了多态。

1.3、重載和重寫的差別

重載:發生在同一個類中,方法名必須相同,參數類型不同、個數不同、順序不同,方法傳回值和通路修飾符可以不同,發生在編譯時。

重寫:發生在父子類中,方法名、參數清單必須相同,傳回值小于等于父類,抛出的異常小于等于父類,通路修飾符大于等于父類;如果父類方法通路修飾符為private則子類中就不是重寫。

1.4、采用位元組碼的好處

Java語言通過位元組碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。

是以Java程式運作時比較高效,而且,由于位元組碼并不專對一種特定的機器,是以,Java程式無須重新編譯便可在多種不同的計算機上運作。

1.5、構造器Constructor是否可被override

構造器不能被重寫,不能用static修飾構造器,隻能用public、private、protected這三個權限修飾符,且不能有傳回語句。

1.6、通路控制符public,protected,private,以及預設的差別

private隻有在本類中才能通路;

public在任何地方都能通路;

protected在同包内的類及包外的子類能通路;

預設不寫在同包内能通路。

1.7、 是否可以繼承String類

String類是final類故不可以繼承,一切由final修飾過的都不能繼承。

1.8、String和StringBuffer、StringBuilder的差別

· 可變性

String類中使用字元數組儲存字元串,private final char value[],是以string對象是不可變的。StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字元數組儲存字元串,char[] value,這兩種對象都是可變的。

· 線程安全性

String中的對象是不可變的,也就可以了解為常量,線程安全。AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字元串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,是以是線程安全的。StringBuilder并沒有對方法進行加同步鎖,是以是非線程安全的。

· 性能

每次對String 類型進行改變的時候,都會生成一個新的String 對象,然後将指針指向新的String 對象。StringBuffer每次都會對StringBuffer 對象本身進行操作,而不是生成新的對象并改變對象引用。相同情況下使用StirngBuilder 相比使用StringBuffer 僅能獲得10%~15% 左右的性能提升,但卻要冒多線程不安全的風險。

1.9、hashCode和equals方法的關系

equals相等,hashcode必相等;hashcode相等,equals可能不相等。

1.10、Java語言采用的編碼方案

Java語言采用Unicode編碼标準,Unicode(标準碼),它為每個字元制訂了一個唯一的數值,是以在任何的語言,平台,程式都可以放心的使用。

1.11、抽象類和接口的差別

· 文法層次

抽象類和接口分别給出了不同的文法定義。

· 設計層次

抽象層次不同,抽象類是對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。

· 跨域不同

抽象類所展現的是一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在"is-a"關系,即父類和派生類在概念本質上應該是相同的。對于接口則不然,并不要求接口的實作者和接口定義在概念本質上是一緻的,僅僅是實作了接口定義的契約而已,"like-a"的關系。

1.12、自動裝箱與拆箱

· 裝箱

将基本類型用它們對應的引用類型包裝起來;

· 拆箱

将包裝類型轉換為基本資料類型;

Java使用自動裝箱和拆箱機制,節省了常用數值的記憶體開銷和建立對象的開銷,提高了效率,由編譯器來完成,編譯器會在編譯期根據文法決定是否進行裝箱和拆箱動作。

todo == 機制

1.13、什麼是泛型、為什麼要使用以及泛型擦除

泛型,即“參數化類型”。

建立集合時就指定集合元素的類型,該集合隻能儲存其指定類型的元素,避免使用強制類型轉換。

Java編譯器生成的位元組碼是不包涵泛型資訊的,泛型類型資訊将在編譯處理是被擦除,這個過程即類型擦除。泛型擦除可以簡單的了解為将泛型java代碼轉換為普通java代碼,隻不過編譯器更直接點,将泛型java代碼直接轉換成普通java位元組碼。

類型擦除的主要過程如下:

1)将所有的泛型參數用其最左邊界(最頂級的父類型)類型替換。

2)移除所有的類型參數。

1.14、Java中的集合類及關系圖

List和Set繼承自Collection接口。

Set無序不允許元素重複。HashSet和TreeSet是兩個主要的實作類。List有序且允許元素重複。ArrayList、LinkedList和Vector是三個主要的實作類。

Map也屬于集合系統,但和Collection接口沒關系。Map是key對value的映射集合,其中key列就是一個集合。key不能重複,但是value可以重複。HashMap、TreeMap和Hashtable是三個主要的實作類。

SortedSet和SortedMap接口對元素按指定規則排序,SortedMap是對key列進行排序。

1.15、HashMap實作原理

HashMap基于hashing原理,通過put()和get()方法儲存和擷取對象。當将鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值對象。當擷取對象時,通過鍵對象的equals()方法找到正确的鍵值對,然後傳回值對象。HashMap使用LinkedList來解決碰撞問題,當發生碰撞了,對象将會儲存在LinkedList的下一個節點中。 HashMap在每個LinkedList節點中儲存鍵值對對象。

當兩個不同的鍵對象的hashcode相同時會發生什麼? 它們會儲存在同一個bucket位置的LinkedList中。鍵對象的equals()方法用來找到鍵值對。

1.16、HashTable實作原理

和HashMap一樣,Hashtable 也是一個散清單,它存儲的内容是鍵值對(key-value)映射。

Hashtable 繼承于Dictionary,實作了Map、Cloneable、java.io.Serializable接口。

Hashtable 的函數都是同步的,這意味着它是線程安全的。它的key、value都不可以為null。此外,Hashtable中的映射不是有序的。

1.17、HashMap和HashTable差別

1).HashTable的方法前面都有synchronized來同步,是線程安全的;HashMap未經同步,是非線程安全的。

2).HashTable不允許null值(key和value都不可以) ;HashMap允許null值(key和value都可以)。

3).HashTable有一個contains(Objectvalue)功能和containsValue(Objectvalue)功能一樣。

4).HashTable使用Enumeration進行周遊;HashMap使用Iterator進行周遊。

5).HashTable中hash數組預設大小是11,增加的方式是old*2+1;HashMap中hash數組的預設大小是16,而且一定是2的指數。

6).哈希值的使用不同,HashTable直接使用對象的hashCode; HashMap重新計算hash值,而且用與代替求模。

todo

​hashMap的資料結構和擴容,碰撞避免等機制​​

1.18、ArrayList和vector差別

ArrayList和Vector都實作了List接口,都是通過數組實作的。Vector是線程安全的,而ArrayList是非線程安全的。

List第一次建立的時候,會有一個初始大小,随着不斷向List中增加元素,當List 認為容量不夠的時候就會進行擴容。Vector預設情況下自動增長原來一倍的數組長度,ArrayList增長原來的50%

1.19、Synchronized和可重入鎖

​​可參考這裡​​

Java中還有哪些是可重入鎖

可重入鎖,指的是以線程為機關,當一個線程擷取對象鎖之後,這個線程可以再次擷取本對象上的鎖,而其他的線程是不可以的。

synchronized 和 ReentrantLock 都是可重入鎖。

可重入鎖的意義之一在于防止死鎖。

1.20、servlet和filter的差別

1.21、JVM規範中,将JVM運作資料,分為幾種

Jvm在java運作時資料分為6種:

①.程式計數器:一個資料結構,儲存目前正在運作的程式的記憶體位址。(java多線程中可用來進行線程的切換----線程切換後能回到正确的位置,線程私有);

②本地方法棧:為虛拟機使用到的本地方法服務

③運作時常量池:代表運作時每個class檔案中的采用表,

④Java虛拟機棧:用于存儲局部變量表,操作棧,方法傳回值,基本資料類型以及對象的引用,線程私有

1.22、Http的運作過程

1.23、Object的常用方法

1.24、

1.25、

1.26、

二、Spring系列

2.1、spring的三種依賴方式

2.2、SpringMVC的運作機制

2.1、

2.1、

2.1、

2.1、

三、SpringCloud系列

3.1、feignClient的實作機制