java面試題

來源:互聯網
上載者:User

標籤:模板方法   作業系統   模板   等等   windows   提高   世界   執行個體   ast   

本文全文轉自hope900的部落格,如有侵權,請告知刪除

部落格連結如下:https://blog.csdn.net/hope900

一、JAVA基礎篇-概念

1.簡述你所知道的Linux:

Linux起源於1991年,1995年流行起來的免費作業系統,目前, Linux是主流的伺服器作業系統, 廣泛應用於互連網、雲端運算、智能手機(Android)等領域。由於Java主要用於伺服器端的開發,因此Java應用的部署環境有很多為Linux。
Windows作業系統的目錄結構,是以盤符為單位,C盤、D盤、E盤等等,資料存放區在各個盤符之下,而Linux作業系統最頂層只有一個根目錄root,所有檔案都儲存在這一個根目錄之下。
Linux不像Windows的圖形操作介面,是通過命令的方式進行操作,常用命令有:
a . pwd:用於顯示當前工作目錄;
b . ls:用於查看當前工作目錄內容;
c . cd:用於改變當前工作目錄。

2.什麼是Java虛擬機器?為什麼Java被稱作是“平台無關的程式設計語言”?

Java虛擬機器是一個可以執行Java位元組碼的虛擬機器進程。Java源檔案被編譯成能被Java虛擬機器執行的位元組碼檔案。
Java被設計成允許應用程式可以運行在任意的平台,而不需要程式員為每一個平台單獨重寫或者是重新編譯。Java虛擬機器讓這個變為可能,因為它知道底層硬體平台的指令長度和其他特性。

3.JDK、JRE、JVM關係是什嗎?

JDK(Java Development Kit)即為Java開發套件,包含編寫Java程式所必須的編譯、運行等開發工具以及JRE。開發工具如:用於編譯java程式的javac命令、用於啟動JVM運行java程式的java命令、用於產生文檔的javadoc命令以及用於打包的jar命令等等。
JRE(Java Runtime Environment)即為Java運行環境,提供了運行Java應用程式所必須的軟體環境,包含有Java虛擬機器(JVM)和豐富的系統類別庫。系統類別庫即為java提前封裝好的功能類,只需拿來直接使用即可,可以大大的提高開發效率。
JVM(Java Virtual Machines)即為Java虛擬機器,提供了位元組碼檔案(.class)的運行環境支援。
簡單說,就是JDK包含JRE包含JVM。

4.Java支援的資料類型有哪些?什麼是自動拆裝箱?

基礎資料型別 (Elementary Data Type):
整數值型:byte,short,int,long,
字元型:char
浮點類型:float,double
布爾型:boolean
整數預設int型,小數預設是double型。Float和long類型的必須加尾碼。

首Crowdsourced Security Testing道String是參考型別不是基本類型,參考型別聲明的變數是指該變數在記憶體中實際儲存的是一個引用地址,實體在堆中。參考型別包括類、介面、數組等。String類還是final修飾的。
而封裝類就屬於參考型別,自動裝箱和拆箱就是基本類型和參考型別之間的轉換,至於為什麼要轉換,因為基本類型轉換為參考型別後,就可以new對象,從而調用封裝類中封裝好的方法進行基本類型之間的轉換或者toString(當然用類名直接調用也可以,便於一眼看出該方法是靜態),還有就是如果集合中想存放基本類型,泛型的限定類型只能是對應的封裝類型。

5.物件導向是什嗎?

物件導向是一種思想,世間萬物都可以看做一個對象,這裡只討論物件導向編程(OOP),Java是一個支援並發、基於類和物件導向的電腦程式設計語言,物件導向軟體開發的優點:代碼開發模組化,更易維護和修改;代碼複用性強;增強代碼的可靠性和靈活性;增加代碼的可讀性。
  • 物件導向的四大基本特性:

抽象:提取現實世界中某事物的關鍵特性,為該事物構建模型的過程。對同一事物在不同的需求下,需要提取的特性可能不一樣。得到的抽象模型中一般包含:屬性(資料)和操作(行為)。這個抽象模型我們稱之為類。對類進行執行個體化得到對象。

封裝:封裝可以使類具有獨立性和隔離性;保證類的高內聚。只暴露給類外部或者子類必須的屬性和操作。類封裝的實現依賴類的修飾符(public、protected和private等)

繼承:對現有類的一種複用機制。一個類如果繼承現有的類,則這個類將擁有被繼承類的所有非私人特性(屬性和操作)。這裡指的繼承包含:類的繼承和介面的實現。

多態:多態是在繼承的基礎上實現的。多態的三個要素:繼承、重寫和父類引用指向子類對象。父類引用指向不同的子類對象時,調用相同的方法,呈現出不同的行為;就是類多態特性。多態可以分成編譯時間多態和運行時多態。

抽象、封裝、繼承和多態是物件導向的基礎。在物件導向四大基礎特性之上,我們在做物件導向編程設計時還需要遵循有一些基本的設計原則。

  • 物件導向的七大設計原則:

SOLID原則(單一職責原則、開放關閉原則、裡氏替換原則、介面隔離原則和依賴倒置原則)
迪米特法則
組合優於繼承原則(合成複用原則)。
在遵循這些物件導向設計原則基礎上,前輩們總結出一些解決不同問題情境的設計模式,以四人幫的gof23最為知名。

  • 24種設計模式(gof23+1):

建立型模式:
1.簡單原廠模式(不包含在gof23中)
2.原廠模式
3.抽象原廠模式
4.單例模式
5.原型模式
建立者模式
6.結構型模式:
7.組合模式
8.裝飾者模式
9.面板模式
10.適配器模式
11.代理模式
12.享元模式
13.橋接模式
行為型模式:
14.觀察者模式
15.策略模式
16.狀態模式
17.中介模式
18.模板方法
19.命令模式
20.備忘錄模式
21.訪問者模式
22.解譯器模式
23.迭代器模式
24.職責鏈模式
這裡只是簡單描述了定義和特徵以及設計模式的關係,具體細節不討論。

6.請寫出下面幾個運算式的結果,答案可以用10進位或16進位書寫

1). 0xaa | 0x55
2). 15 & 240
3). 10 ^ 12
4). -2 >> 1
5). -2 >>> 1
1). 分析:十六進位數用0x……來表示,後面一個十六進位位是四位,兩個十六進位位為一個位元組,最多後面可以有8個十六進位位,32個位元組,如:0xFFFFFFFF。 或(“ | ”)運算,全0為0,其他為1。
所以:0xaa 用二進位表示為 10101010 ,0x55 用二進位表示為 01010101 ,按位或之後為 11111111 ,十進位數為255,十六進位數為 0xFF 。

2). 分析:10進位轉換成2進位,用該數字除以2,記錄商和餘數,利用商再次除以2,記錄商和餘數……直到上為0或餘數為0停止,餘數逆序組成二進位的從低到高位(最後的餘數為二進位最低位)。與(“ & ”)運算,全1為1,其他為0 。
所以: 15 等於1111 ,240等於 11110000,15前面用0補齊為00001111 ,按位與之後為 00000000 ,即結果為0

3). 分析: 異或(“ ^ ”)運算,相同取0,不同取1 。
所以:1010 ^ 1100 =0110 , 十進位表示為6,十六進位表示為 0x06 。

4). 分析: 帶符號右移(“ >> ”),即有符號位時,負數符號位補1,正數符號位補0, -2 的二進位求法是正數取反加1,因此 2 的二進位表示為0000 0000 0000 0000 0000 0000 0000 0010 ,取反加一為
1111 1111 1111 1111 1111 1111 1111 1110 ,即 -2 的二進位表示。
註: >> , << , >>> , 運算子只針對int型和long型,byte ,short ,char型需要轉換成Int型在進行操作。
所以: 帶符號右移之後為 1111 1111 1111 1111 1111 1111 1111 1111 ,除符號位之外,減一取反,得到帶符號十進 制數為 -1 。

5). 分析:無符號右移 (“ >>> ”) ,即無論正負數,右移之後符號位均補 0 。
所以: -2 的二進位無符號右移一位之後為 0111 1111 1111 1111 1111 1111 1111 1111,即 2^31 - 1,二的三十一次方減一。
註:右移和無符號右移主要區別就在於左面最高位補 0 還是補 1 的問題,無符號右移任何時候最高位都補 0 , 有符號右移則是正數補 0 ,負數補 1 。(沒有無符號左移!)。

7.&和&&的區別?

&運算子有兩種用法:(1)按位與;(2)邏輯與。&&運算子是短路與運算。邏輯與跟短路與的差別是非常巨大的,雖然二者都要求運算子左右兩端的布爾值都是true整個運算式的值才是true。&&之所以稱為短路運算是因為,如果&&左邊的運算式的值是false,右邊的運算式會被直接短路掉,不會進行運算。很多時候我們可能都需要用&&而不是&,例如在驗證使用者登入時判定使用者名稱不是null而且不是Null 字元串,應當寫為:username != null &&!username.equals(“”),二者的順序不能交換,更不能用&運算子,因為第一個條件如果不成立,根本不能進行字串的equals比較,否則會產生NullPointerException異常。注意:邏輯或運算子(|)和短路或運算子(||)的差別也是如此。

 

8.什麼是值傳遞和引用傳遞?

值傳遞是對基本型變數而言的,傳遞的是該變數的一個副本,改變副本不影響原變數.
引用傳遞一般是對於對象型變數而言的,傳遞的是該對象地址的一個副本, 並不是原對象本身 。
一般認為,java內的基本類型傳遞都是值傳遞. java中執行個體對象的傳遞是引用傳遞 。

比如,寫一個方法交換兩個基本類型的值是無法交換的,如果是封裝類,則可以,因為封裝類傳遞的為對象的引用

9.是否可以在static環境中訪問非static變數?

static變數在Java中是屬於類的,它在所有的執行個體中的值是一樣的。當類被Java虛擬機器載入的時候,會對static變數進行初始化。如果你的代碼嘗試不用執行個體來訪問非static的變數,編譯器會報錯,因為這些變數還沒有被建立出來,還沒有跟任何執行個體關聯上。

10.Java中的方法覆蓋(Overriding)和方法重載(Overloading)是什麼意思?

Java中的方法重載發生在同一個類裡面兩個或者是多個方法的方法名相同但是參數不同的情況。與此相對,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,參數列表和傳回型別。覆蓋者可能不會限制它所覆蓋的方法的訪問。

11.Java中,什麼是構造方法?什麼是構造方法重載?什麼是複製構造方法?

當新對象被建立的時候,構造方法會被調用。每一個類都有構造方法。在程式員沒有給類提供構造方法的情況下,Java編譯器會為這個類建立一個預設的構造方法。
Java中構造方法重載和方法重載很相似。可以為一個類建立多個構造方法。每一個構造方法必須有它自己唯一的參數列表。
Java不支援像C++中那樣的複製構造方法,這個不同點是因為如果你不自己寫構造方法的情況下,Java不會建立預設的複製構造方法。

12.Java支援多繼承嗎?

Java中類不支援多繼承,只支援單繼承(即一個類只有一個父類)。 但是java中的介面支援多繼承,,即一個子介面可以有多個父介面。(介面的作用是用來擴充項物件的功能,一個子介面繼承多個父介面,說明子介面擴充了多個功能,當類實現介面時,類就擴充了相應的功能)。可以大概理解為:單繼承,多實現

13.解釋記憶體中的棧(stack)、堆(heap)和方法區(method area)的用法。

通常我們定義一個基礎資料型別 (Elementary Data Type)的變數,一個對象的引用,還有就是函數調用的現場儲存都使用JVM中的棧空間;而通過new關鍵字和構造器建立的對象則放在堆空間,堆是垃圾收集器管理的主要區域,由於現在的垃圾收集器都採用分代收集演算法,所以堆空間還可以細分為新生代和老生代,再具體一點可以分為Eden、Survivor(又可分為From Survivor和To Survivor)、Tenured;方法區和堆都是各個線程共用的記憶體地區,用於儲存已經被JVM載入的類資訊、常量、靜態變數、JIT編譯器編譯後的代碼等資料;程式中的字面量(literal)如直接書寫的100、”hello”和常量都是放在常量池中,常量池是方法區的一部分,。棧空間操作起來最快但是棧很小,通常大量的對象都是放在堆空間,棧和堆的大小都可以通過JVM的啟動參數來進行調整,棧空間用光了會引發StackOverflowError,而堆和常量池空間不足則會引發OutOfMemoryError。

14.介面和抽象類別的區別是什嗎?

從設計層面來說,抽象是對類的抽象,是一種模板設計,介面是行為的抽象,是一種行為的規範。
Java提供和支援建立抽象類別和介面。它們的實現有共同點,不同點在於:
介面中所有的方法隱含的都是抽象的。而抽象類別則可以同時包含抽象和非抽象的方法。
類可以實現很多個介面,但是只能繼承一個抽象類別
類可以不實現抽象類別和介面聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
抽象類別可以在不提供介面方法實現的情況下實現介面。
Java介面中聲明的變數預設都是final的。抽象類別可以包含非final的變數。
Java介面中的成員函數預設是public的。抽象類別的成員函數可以是private,protected或者是public。
介面是絕對抽象的,不可以被執行個體化。抽象類別也不可以被執行個體化,但是,如果它包含main方法的話是可以被調用的。
也可以參考JDK8中抽象類別和介面的區別。

15.用最有效率的方法計算2乘以8?

答: 2 << 3(左移3位相當於乘以2的3次方,右移3位相當於除以2的3次方)。

16.手寫單例模式(餓漢和飽漢模式)和原廠模式?

(1)單例餓漢模式://餓漢式單例類.在類初始化時,已經自行執行個體化
2 public class Singleton1 {
3 //私人的預設構造子
4 private Singleton1() {}
5 //已經自行執行個體化
6 private static final Singleton1 single = new Singleton1();
7 //靜態Factory 方法
8 public static Singleton1 getInstance() {
9 return single;
10 }
11 }

(2)懶漢模式://懶漢式單例類.在第一次調用的時候執行個體化
2 public class Singleton2 {
3 //私人的預設構造子
4 private Singleton2() {}
5 //注意,這裡沒有final
6 private static Singleton2 single=null;
7 //靜態Factory 方法
8 public synchronized static Singleton2 getInstance() {
9 if (single == null) {
10 single = new Singleton2();
11 }
12 return single;
13 }
14 }

(3)原廠模式:
interface IFactory{
public IProduct createProduct();}
Class Factory implements IFactory{
public IProduct createProduct(){return new Product();}}
Public class client{
Public Static void main (String [] args){IFactory factory=new Factory();
IProduct product=factory.createProduct();
product.ProductMethod();}}

17.String和StringBuilder、StringBuffer的區別?

Java平台提供了兩種類型的字串:String和StringBuffer/StringBuilder,它們可以儲存和操作字串。其中String是唯讀字串,也就意味著String引用的字串內容是不能被改變的。而StringBuffer/StringBuilder類表示的字串對象可以直接進行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,區別在於它是在單線程環境下使用的,因為它的所有方面都沒有被synchronized修飾,因此它的效率也比StringBuffer要高。

二、JAVA基礎篇-集合與數組

18.Java集合架構是什嗎?說出一些集合架構的優點

每種程式設計語言中都有集合,最初的Java版本包含幾種集合類:Vector、Stack、HashTable和Array。隨著集合的廣泛使用,Java1.2提出了囊括所有集合介面、實現和演算法的集合架構。在保證安全執行緒的情況下使用泛型和並發集合類,Java已經經曆了很久。它還包括在Java並發包中,阻塞介面以及它們的實現。集合架構的部分優點如下:
(1)使用核心集合類降低開發成本,而非實現我們自己的集合類。
(2)隨著使用經過嚴格測試的集合架構類,代碼品質會得到提高。
(3)通過使用JDK附帶的集合類,可以降低代碼維護成本。
(4)複用性和可操作性。

19.集合架構中的泛型有什麼優點?

Java1.5引入了泛型,所有的集合介面和實現都大量地使用它。泛型允許我們為集合提供一個可以容納的物件類型,因此,如果你添加其它類型的任何元素,它會在編譯時間報錯。這避免了在運行時出現ClassCastException,因為你將會在編譯時間得到報錯資訊。泛型也使得代碼整潔,我們不需要使用顯式轉換和instanceOf操作符。它也給運行時帶來好處,因為不會產生類型檢查的位元組碼指令。

20.Java集合架構的基礎介面有哪些?

Collection為集合層級的根介面。一個集合代表一組對象,這些對象即為它的元素。Java平台不提供這個介面任何直接的實現。## 標題 ##
Set是一個不能包含重複元素的集合。這個介面對數學集合抽象進行建模,被用來代表集合,就如一副牌。
List是一個有序集合,可以包含重複元素。你可以通過它的索引來訪問任何元素。List更像長度動態變換的數組。
Map是一個將key映射到value的對象.一個Map不能包含重複的key:每個key最多隻能映射一個value。
一些其它的介面有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

21.為何Collection不從Cloneable和Serializable介面繼承

Collection介面指定一組對象,對象即為它的元素。如何維護這些元素由Collection的具體實現決定。例如,一些如List的Collection實現允許重複的元素,而其它的如Set就不允許。很多Collection實現有一個公有的clone方法。然而,把它放到集合的所有實現中也是沒有意義的。這是因為Collection是一個抽象表現。重要的是實現。
當與具體實現打交道的時候,複製或序列化的語義和含義才發揮作用。所以,具體實現應該決定如何對它進行複製或序列化,或它是否可以被複製或序列化。
在所有的實現中授權複製和序列化,最終導致更少的靈活性和更多的限制。特定的實現應該決定它是否可以被複製和序列化。

22.為何Map介面不繼承Collection介面?

儘管Map介面和它的實現也是集合架構的一部分,但Map不是集合,集合也不是Map。因此,Map繼承Collection毫無意義,反之亦然。
如果Map繼承Collection介面,那麼元素去哪兒?Map包含key-value對,它提供抽取key或value列表集合的方法,但是它不適合“一組對象”規範。

23.什麼是迭代器(Iterator)?

Iterator介面提供了很多對集合元素進行迭代的方法。每一個集合類都包含了可以返回迭代器執行個體的迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素,但是不可以直接調用集合的remove(Object Obj)刪除,可以通過迭代器的remove()方法刪除。

24.Iterator和ListIterator的區別是什嗎?

下面列出了他們的區別:
Iterator可用來遍曆Set和List集合,但是ListIterator只能用來遍曆List。
Iterator對集合只能是前向遍曆,ListIterator既可以前向也可以後向。
ListIterator實現了Iterator介面,並包含其他的功能,比如:增加元素,替換元素,擷取前一個和後一個元素的索引,等等。

25.快速失敗(fail-fast)和安全失敗(fail-safe)的區別是什嗎?

快速失敗:當你在迭代一個集合的時候,如果有另一個線程正在修改你正在訪問的那個集合時,就會拋出一個ConcurrentModification異常。
在java.util包下的都是快速失敗。
安全失敗:你在迭代的時候會去底層集合做一個拷貝,所以你在修改上層集合的時候是不會受影響的,不會拋出ConcurrentModification異常。
在java.util.concurrent包下的全是安全失敗的。

 

java面試題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.