java基礎面試題題庫一(傳智專修學院2017級Java4班)

血色琉璃發表於2019-01-07

-------------------------------------------------------------

本面試題由傳智專修學院2017級java4班所有同學合作完成

-------------------------------------------------------------

1.char型變數中能不能儲存一箇中文漢字?(黎珊珊)

答:能, 可以儲存一箇中文漢字,因為在Java中,char型別佔2個位元組,而且Java預設採用Unicode編碼,一個Unicode碼是16位,所以一個Unicode碼佔兩個位元組,Java中無論漢字還是英文字母都是用Unicode編碼來表示的。所以,在Java中,char型別變數可以儲存一箇中文漢字。

2.String s=new String("xyz")建立了幾個String Object? 二者之間有什麼區別?(李源AND葉元林)

答:建立了兩個物件

答案一:

區別:

第一個:

   String s=xyz;

  1. 第一個

當類被載入時,String s=new String("xyz")進入棧中,JVM會自動根據棧中資料的實際情況來決定是否有必要建立新物件, String s=new String("xyz")執行後首先在常量池建立一個共享的字串物件"xyz"

  1. 第二個:

  String s=new String(xyz);

  程式中只要出現了new關鍵字,就會在堆記憶體中分配空間,建立物件,值是引用常量池之前建立的字串物件“xyz”。

答案二:

這個跟常量池沒有關係只要是new都是重新分配堆空間如果不區分棧和堆這裡建立了1String Object。如果是從jvm角度來說的話,它是建立了兩個物件,String s是在棧裡建立了一個變數,new String("xyz")是在堆裡建立了一個物件並被s引用到。

如果是String s = "xyz",那就要看常量池裡有沒有"xyz",如果有直接引用,如果沒有則建立再引用

3. Collection和collections的區別(邱滿緒)

1Collection 是一個集合介面。它提供了對集合物件進行基本操作的通用介面方法。Collection介面在Java 類庫中有很多具體的實現。例如: list介面, set介面,ArrayList  hashSet

2Collections 是一個包裝類。它包含有各種有關集合操作的靜態多型方法。此類不能例項化就像一個工具類服務於JavaCollection框架。 

4. GC是什麼?為什麼要有GC?(馮鬆年)

GC是垃圾收集器

作用是:用來回收記憶體,當資源緊張時自動清除記憶體堆中死亡或長期沒有使用的物件釋放資源

為什麼要有GC

如果沒有GC,程式執行時死掉的物件或長期用不到的物件,會大量的佔用資源,會使記憶體溢位,導致程式崩潰。因為程式設計師不能實時的呼叫垃圾回收器對記憶體堆中死亡或長期沒有使用的物件進行回收。

所以出現了GC ,GC可以自動進行管理程式執行記憶體,要使用GC可以呼叫System.gc()和Runtime.getRuntime.GC()方法

GC可以有效的防止記憶體洩露,有效的使用記憶體。

5. 通過迭代器遍歷list的時候,如果想修改集合物件是否會報錯,會報什麼錯誤?如何解決這個錯誤?(張宇)

併發修改異常ConcurrentModificationException

1、在使用迭代器進行遍歷集合時會獲取到當前集合的迭代物件

2、獲取到的物件中封裝了迭代器的remove方法與集合本身自帶的remove方法

3、當呼叫迭代器物件的remove方法是沒問題的,但呼叫集合自帶的remove方法就會報錯

4、總的來說,通過迭代器進行遍歷集合的時候,是不允許集合本身在結構上進行修改的

解決方式:

方法一:迭代器迭代元素,迭代器修改元素由於Iterator迭代器沒有新增功能,所以使用其子類ListIterator                                     

方式二, 如果想修改集合物件使用for迴圈的方式

6. 如何對list集合中的資料去重?(尤寶鬆)

答:

1.採用set集合進行去重,set有一個特性就是元素不重複

2.我們先建立一個set物件

3.把一個資料重複的list集合,放入set中

4.因為set集合不能儲存重複的資料,所以可以完成去重

7. loatfloat f=3.4是否正確?(陳紫嫣)

答:錯誤!因為float需要被宣告!在java中整數預設為int資料型別,小數預設為double資料型別,所以如果需要建立float型別的資料,則需要按照float的定義語法進行定義,在定義的小數後面新增f來標識該資料的型別是float型別   

8. error和exception有什麼區別?(曹澤倫)

首先,Throwable類是所有異常的根類,Error類和Exception類是Throwable類兩個重要的子類。

    Error(錯誤)是系統中的錯誤,程式設計師是不能改變的和處理的,只能通過修改程式才能修正,如系統崩潰,記憶體溢位。

    Exception(異常)表示程式可以處理的異常,可以捕獲且可能恢復。

舉個簡單的例子

Error和Exception就像是水池和水池裡的水的區別

“水池”,就是程式碼正常執行的外部環境,如果水池崩潰(系統崩潰),或者池水溢位(記憶體溢位)等,這些都是跟水池外部環境有關。這些就是java中的error

“水池裡的水”,就是正常執行的程式碼,水汙染了、有雜質了,渾濁了,這些影響水質的因素就是Exception。

9. 陣列有沒有length()這個方法?String有沒有length()方法?(邱滿緒)

java中陣列是沒有length()方法的只有length屬性陣列length屬性返回的是該陣列的長度。

字串Stringlength()方法,字串的 length()返回的是該字串的長度。

例如

陣列:

    int[] array = {1,2,3,4,5};

    int a = array.length//求陣列中元素的個數 5

字串:

   String str = "he"

   int a = str.length(); //求字串中字元的個數 2

10. JDK,JREJVM是什麼?(張雨豪)

jdk jre jvm是什麼

    答:JDKjdk java語言開發最基礎的工具包,jdk是整個Java的核心,包括了Java執行環境JREJava開發工具包和Java基礎類庫

           JREjre是執行基於Java語言編寫的程式所不可缺少的執行環境。也是通過它,Java的開發者才得以將自己開發的程式釋出到使用者手中,讓使用者使用。與大家熟知的JDK不同,

JREJava執行環境,並不是一個開發環境,所以沒有包含任何開發工具。

           JVMjvmjava虛擬機器,它是整個java實現跨平臺的最核心的部分,所有的java程式會首先被編譯為位元組碼的類檔案,這種類檔案可以在虛擬機器上執行。

只有JVM還不能成class的執行,因為在解釋class的時候JVM需要呼叫解釋所需要的類庫lib,而jre包含lib類庫。

          JVM遮蔽了與具體作業系統平臺相關的資訊,使得Java程式只需生成在Java虛擬機器上執行的目的碼,就可以在多種平臺上不加修改地執行。

11. 說說&和&&區別?(李源)

&&&都可以用作邏輯運算子,表示邏輯與。當運算子兩邊的表示式都為true時,結果才為true;否則,結果為false

&&&:(與,短路與):一樣的地方就是二者執行最後的結果是一樣的(truefalse),但是執行的過程有區別,

對於&:無論&左邊是否為false,他都會繼續檢驗右邊的boolean值。

對於&&:只要檢測到左邊Boolean值為false時,就會直接判斷結果為false,不會在檢驗右邊的值(因為"短路與:&&"有一個false最後結果就是false了)

所以&&的執行效率更高,所以一般都是使用&&.

12. this和super的區別(張大偉)

this表示當前類物件,super表示對當前類父類的引用

例如:

一個A類與B類,A類繼承了B類,那麼B類就是A的父類。如果A類中有個方法test(),B類中也有方法test (),A中使用this. test ()呼叫的就是A中的test()方法,如果要在A類中呼叫B類中的test方法,是super.test();

13.JAVA中的棧和堆的區別(常兆祥)

概述:在Java中,常用的記憶體分為兩種,一種是棧記憶體,另一種是堆記憶體。

區別:

(1)存放內容不同:

棧記憶體:用來存放基本資料型別變數和引用型別變數。

堆記憶體:用來存放執行時建立的物件。

(2)生命週期不同:

棧的生命週期與執行緒相同,隨執行緒而生,隨執行緒而亡,是執行緒私有的。

堆的生命週期與JVM相同,JVM啟動時建立,JVM停止時銷燬,是執行緒共享的。

(3)記憶體回收管理不同:

棧是執行緒私有的記憶體區域

堆是執行緒共享的記憶體區域

(4)存取速度不同:

棧的存取速度較快,僅次於暫存器,但棧的資料大小與生存期必須是確定的,缺乏靈活性。另外,棧資料可以共享。

堆在執行時動態分配記憶體,生存期不用提前告訴編譯器,但這也導致了堆的存取速度較慢。

14. 普通的for迴圈和增強for那個遍歷list集合更快?(程大力)

增強for迴圈是普通for迴圈的簡寫形式

相同點(作用):普通for迴圈和增強for作用 遍歷集合或陣列

不同點(場景)1.普通for迴圈 

              1.1普通for是遍歷ArrayList,採用陣列的形式儲存物件的這類方式,這種方式將物件放在連續的記憶體塊中, 因為連續,所以插入和刪除時效率低,因為有索引,所以查詢效率高。(側重於有索引)

              2.增強for迴圈

              2.1:對於陣列,是在編譯期把增強for還原成簡單的for迴圈

              2.2:實現 Iterable 介面的物件,最終java會通過迭代器的形式來遍歷它              

              2.3:增強forLinkList採用連結串列的結構將物件放在獨立的空間中的遍歷,每個空間中還儲存下一個空間的索引,也就是資料結構中的連結串列結構,插入和刪除比較方便,但是查詢很麻煩,要從第一個開始遍歷。(側重於無索引)

效能對比:迴圈陣列結構的資料---普通for迴圈(普通for迴圈採用索引訪問)

         迴圈連結串列結構的資料---增強for迴圈(使用普通for資料量大可能會導致系統崩潰)

注意:在增強for迴圈中 add/remove 集合元素,會丟擲 ConcurrentModificationException(併發修改異常) 異常 

15. 物件導向的基本特徵是什麼? (馮鬆年)

物件導向有三大基本特徵:封裝、繼承、多型

封裝:

封裝是把物件(可以理解為程式碼中的私有屬性)的實現過程隱藏起來然後通過公用方法(getset方法)體現出該物件的功能。

繼承:

主要用來實現程式碼複用,繼承就是父子類的一種關係 (繼承關係) 子類可以繼承父類的方法和屬性(父類的私有屬性可以被繼承但私有方法不能)java是單繼承。一個子類只能繼承一個父類。

多型:

父類引用或介面的引用指向自己的子類物件,這就是多型,多型提高了程式的擴充套件性。

但是隻能訪問父類中具備的方法不能訪問子類中特有的方法。實現多型兩個類中必須有關係比如 繼承或實現關係。

16. 什麼是值傳遞和引用傳遞?(劉曉龍)

值傳遞:值傳遞是指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,就不會影響到實際參                數

例如:

 Public static void main(String [] args){

  Int a=2;

   add(a);

}

public void add(int a) {

  a=10;//此時對a進行更改,不會影響到main方法中a的值,表示只是將main中a的值複製發一份到add方法中

}

這個可以看作是值傳遞,a是基本資料型別,重新給a賦值10 

 

引用傳遞:指的是在方法呼叫時,傳遞的引數是變數引用的地址值,傳遞前和傳遞後都指向同一個記憶體空間

例如:

 Public static void main(String [] args){

  Person p=new Person();//此時p的name值為:李四

   add(p);

}

public void add(Person p) {

 p.setName(張三);//此時main方法中的p和add方法中的p指向同一片空間,所以其中的值回收到影響,結果由李四變成了張三。

 }

總結:

物件傳遞是引用傳遞,基礎型別資料傳遞是值傳遞

17. int和Integer的區別(戴光輝)

(1)Integer是int的包裝類,是引用資料型別,int則是java的一種基本資料型別 
(2)Integer實際是物件的引用,當new一個Integer時,實際上是生成一個指標指向此物件;而int則是直接儲存資料值 
(3)Integer的預設值是null,int的預設值是0

18. 四類八種,以及取值範圍(袁樹清)

 四類:

  整數型,浮點型,字元型,布林型

 八種:

   byte,short,int,long,float,double,char,boolean

 取值範圍:

四類

八種

資料表示範圍

整型

byte

-128~127(重點記)

short

-32768~32767

int

-2147483648~2147483648

long

-263~263-1

浮點型

float

-3.403E38~3.403E38

double

-1.798E308~1.798E308

字元型

char

表示一個字元,如('a','A','0','家')

布林型

boolean

只有兩個值true與false

19. 異常處理的時候 finally程式碼塊的重要性是什麼(盧夢豪)

finally 程式碼塊

是異常處理的一部分,用於釋放資源  一般來說的話,finally控制的程式碼一定會執行

重要性:

不管catch語句拋不丟擲異常,finally程式碼塊總是會被執行.

就算是沒有catch語句的同時,丟擲異常的話,finally程式碼塊仍然會被執行。

20. 在java中,物件什麼時候被垃圾回收(盧夢豪)

1)Java中垃圾收集器自動地定期掃描Java物件的動態記憶體,並將所有的引用的物件加上標記,在物件執行結束後(沒有變數對該物件進行應用),清除其標記,並將所有無標記的物件作為垃圾進行回收,釋放垃圾物件所佔的記憶體空間。

2)物件執行結束後或生命週期結束時,將成為垃圾物件,但並不意味著就立即會被回收,僅當垃圾收集器空閒或記憶體不足時,才會回收他們。

                                                                                                                                                                     2019.1.7

相關文章