您的位置:首頁>正文

分享一些Java的練習題和麵試題

1、一個".java"原始檔案中是否可以包括多個類(不是內部類)?有什麼限制?

答:可以包括 但公共類只能有一個、且與原始檔案名相同

2、Java有沒有goto?

答:有、但是是作為保留字存在的。

3、說說&和&&的區別。

答:在java中, 這兩個符號都屬於邏輯運算子與的操作。 但&&表示的是短路運算, 所謂的短路運算是, 與運算中, 兩邊的運算式的布林值, 如果有一個為假, 另外一個就不需要進行判斷了。 最為常見的地方是, if(o!=null&&o.equals(s)) 如果第一個為false 那麼不會對第二個式子判斷, 但如果是非短路運算子& 會對第二個判斷, 但此時o為空, 會拋出NullPointerExcetption異常

而&還有取位址的作用 常用來對一個整數的後四bit位元計算(常和ox0f進行運算)。

4、在JAVA中如何跳出當前的多重嵌套迴圈?

答:關鍵字 常見的有return、ok標號和break。 用法上:ok是使用帶有ok標號的break語句 我最常用的不是這一種, 而是return和讓外層的迴圈條件運算式的結果可以受到內層迴圈代碼的控制。

5、switch語句能否作用在byte上, 能否作用在long上, 能否作用在String上?

答:可以作用在byte、short、int、char(及以上四種的包裝類)7.0之後支持String 和枚舉.可以理解為 expression值只能是整型運算式和枚舉常量

6、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

答:錯誤在於s1+1是一個短整型和一個1相加 1作為字面值是byte、short、int通用的, 但在進行剛才的加法運算時, 會被認為是一個整型。 整型和短整型相加會出現自動類型提升。 將提升後的整型值賦值給一個短整型會報錯 而直接給short賦值一個1不會被認為是整型,

只有在加法運算時會。 但s1+=1;這中寫法形式也不會出現自動類型提提升

7、char型變數中能不能存貯一個中文漢字?為什麼?

答:可以。 Char中放入的字元是以unicode編碼方式存入的。 Unicode編碼是包含漢字的。 但如果字元集沒有的話。 自然是不能存儲的。

8、用最有效率的方法算出2乘以8等於幾?

答:位運算 左移動幾位相當於乘以2的幾次方 右移動幾位相當於除以2的幾次方

9、使用final關鍵字修飾一個變數時, 是引用不能變, 還是引用的物件不能變?

答:是引用不能變。 所以將物件作為實參時, 有些人希望在形參上加修飾符final也是可以改變值的。 我目前見過final用的最爽的地方就是單例模式中的餓漢式模式 當出現時間片結束時,

縱然沒有new完物件, 再返回時, 也不會new出新對象。

10、"=="和equals方法究竟有什麼區別?

答:這兩個方法的區別主要是針對物件類型 ==表示兩個對象的引用是否相同 equals表示兩個物件的內容是否相同。 Equals常用在String的比較中, 另外所有的物件都是繼承自object類, equals方法是該類的一個方法, 換句話說, 所有的類都具備這個方法, 當對兩個物件調用equals比較時, 如果沒有Override的方法, 那麼就會調用object的方法, 而object中的Equals方法默認是使用==的。

11、靜態變數和執行個體變數的區別?

答:概念上, 兩種變數都是一個類的成員變數, 只不過兩種變數的修飾符一個有static一個沒有。 出現時機上:靜態變數的是出現在類載入時, 也就是說, 當物件沒有出現時, 它就已經出現了,

執行個體變數的出現是物件出現時的。 所屬範圍上說, 靜態變數它是屬於類, 所有物件的, 並不是一個單獨物件的屬性。 而執行個體變數是僅屬於一個物件的。

是否可以從一個static方法內部發出對非static方法的調用?

12、答:不可以。 Static方法是屬於一個類的, 不需要創建物件, 而非static是屬於一個物件的, 物件沒有創建, 它是沒有出現的, 所以當我們用static調用非static方法時, 物件可能還沒有出現。

13、Integer與int的區別

答:區別是integer是物件類型, int是基本類型。 Integer是為了將int物件化而設計出來的, 它支援int的語法操作, 包括直接賦值, 自增運算等等由於int等基本類型是有預設值的, 我們無法判斷出是否有賦值的情況。 例如一個學生有一門成績是一個整型值, 我們就無法得到他缺考的情況。

14、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

答:Math.round方法是對數進行四捨五入的操作。 就是將值加上0.5在向下取整。 而直接的向上和向下取整是使用math的ceil和floor的方法

15、請說出作用域public, private, protected, 以及不寫時的區別?

答:不寫時, 默認關鍵字是default。 這四個關鍵字, 從修飾對象和修飾範圍上說。

修飾對象上:public 可以修飾類, 方法、構造方法和屬性。 Private可以修飾方法和屬性、構造方法 default可以修飾類、方法和屬性、構造方法。 Protected可以修飾、構造方法、方法和屬性。

修飾範圍:public是本包和導入包均可見 private是本類可見 default是本包可見protected是對繼承體系可見(本包和導入包的子類型)

16、Overload和Override的區別。 Overloaded的方法是否可以改變返回值的類型?

答:OverLoad是重載。 Override是重寫。 Override是發生在繼承體系中, 子類對父類的方法進行重寫, 語法要求是:返回值,方法名,參數列表要一致,修飾許可權要高於父類,拋出被父類更安全、更具體的異常,至少是相同的。比如拋出父類異常的子異常。

OverLoad是本類中,同一方法的不同實現,它要求方法名相同。參數清單不同(個數,順序,類型),返回值不做要求,但最好不同,因為我們在調用方法是常常不接收返回值,如果這種情況出現,而重載的方法的僅僅是返回值不同的話,編譯器會分不出調用哪個方法。但5.0後返回值可以不同在異常時常用。即在返回值、異常和返回類型上有重載。方法的異常類型和數目不會對重載有影響。

而以上兩種如果原方法都是private的話,那麼新的方法都可以視為寫了一個新方法,所以沒有重載和重寫的概念在裡頭了。

17、構造器Constructor是否可被override?

答:構造器不能被繼承,所以不能重寫,但可以重載。

18、介面是否可繼承介面? 抽象類別是否可實現(implements)介面? 抽象類別是否可繼承具體類(concrete class)? 抽象類別中是否可以有靜態的main方法?

答:介面可以繼承介面,抽象類別可以實現介面,抽象類別可以繼承具體的類,抽象類別可以有靜態的main方法。抽象類別不可以產生實體和擁有abstract的方法。

19、物件導向的特徵有哪些方面?

答:封裝、多態、繼承、抽象。

20、java中實現多態的機制是什麼?

答:父類或者介面的引用可以指向子類或者實現類的物件。在編譯時,分析引用變數中的類型方法,運行時綁定實際的類。

21、abstract class和interface有什麼區別?

答:interface是特殊的抽象類別。Abstract類包含抽象方法,沒有抽象靜態方法可以有普通方法和構造方法,但不能有抽象構造方法,沒有構造方法。不能被產生實體,只能被繼承。

Interface中,所有的抽象方法是公開,抽象的,屬性時公開、靜態、常量的。且沒有構造方法。

23、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

24、什麼是內部類?Static Nested Class 和 Inner Class的不同。

25、內部類可以引用它的包含類的成員嗎?有沒有什麼限制?

答:可以,但要求是用final修飾的。

26、Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?

答:可以,沒有問題。而且必須是某個類的子類或者介面的實現類。

27、String是最基本的資料類型嗎?

答:不是,String是較為常見的對象類型。而基本類型只有八種:byte,short,int,long,char,boolean,double,float。

28、String s = "Hello";s = s + " world!";這兩行代碼執行後,原始的String物件中的內容到底變了沒有?

答:沒有,這個過程實際上是創建了新的物件,將s的引用指向了一個新的物件。String是一個不可變的類immutable。

29、是否可以繼承String類?

答:不可以。它是一個final類,是不能被繼承的。

30、String s = new String("xyz");創建了幾個物件? 二者之間有什麼區別?

答:如果"xyz"是第一次出現,那麼應該是兩個物件,如果已經出現過,應該是一個物件。New出現的地方一定會有一個物件。而"xyz"的出現也會生成一個物件,放入到串池中,以方便下次使用。

31、String 和StringBuffer的區別

答:構造方式不同,String是提供數值不可改變的,而StringBuffer字元可以改變的。StringBuffer的出現是為了解決String在做字元串連接時,造成的過多記憶體消耗。僅僅通過一個StringBuffer物件就可以完成字元串連接。而不是想String一樣,每進行一次字元串連接就開闢一個空間存放物件。

32、如何把一段逗號分割的字串轉換成一個陣列?

答:直接調用String類中的靜態方法Spilt(",");這個方法是將字串按照指定的字元進行劈分。

33、陣列有沒有length()這個方法? String有沒有length()這個方法?

答:陣列中是屬性,陣列中表示陣列元素的個數,String中表示字元的個數。

34、下面這條語句一共創建了多少個物件:String s="a"+"b"+"c"+"d";

答:7個。每一個字元是一個物件,運算時,+號左邊是一個新的物件

35、try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後?

答:finally中的語句是在try語句結束前執行的,當try中要結束時。會跳到finally中執行裡邊的語句,是在return之前。如果finally中也有return那麼不會再回去執行try語句。

36、final, finally, finalize的區別。

答:final是修飾符 用來對方法,類和變數修飾的,修飾的方法不能被重寫,只能繼承,修飾的類不能被繼承,變數時常量,一旦賦值不可更改。Finally是try語句的一部分,主要用來對資源進行回收的,許可權大於try和Catch,finalize是Object的方法,是對記憶體中垃圾資源回收的,有JVM調用。

37、運行時異常與一般異常有何異同?

答:異常分為兩類:已檢查異常和未檢查異常。前者是無法避免但可以處理的屬於一般異常。常見的有EOFException。而未檢查異常是可以避免,可以處理的。是運行時異常。常見的有NullPointerException。異常表示程式運行時出現的非正常情況。運行時異常,表示JAVA虛擬機器的通常操作中可能遇到的情況。是一種常見的異常。Java虛擬機器要求必須拋出非運行的異常。而對運行異常不做要求。

38、error和exception有什麼區別?

答:error是錯誤,往往是系統原因,不可避免,無法處理。而Exception是程式運行中出現的非正常情況。往往是由於設計和實現的問題,人為因素較大。

39、Java中的異常處理機制的簡單原理和應用。

答:異常是指程式運行過程中出現的非正常情況。現實生活中,一個異常包含許多資訊,JAVA將其抽象出來形成一個類,不同的類用來表示不同的異常。所有異常的根類是throwable。下有兩個子類error和exceptione。Error往往是程式無法克服和恢復的錯誤,通常會死掉。而excepiton中異常也分為兩類,未檢查異常和已檢查異常。已檢查異常是由於程式環境發生變化,是用戶能夠解決,但忽略的。例如網線斷了,磁碟空間不夠等等。對這種異常是要處理或者拋出的。以防程式中斷。未檢查異常是設計者設計和實現不全面導致的,不要求拋出或者處理。

40、請寫出你最常見到的5個runtime exception。

答:NullPointerExcepiton ClassCastException

41、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以拋出異常嗎?

答:throws是將異常拋給上一級調用者,throw是將異常拋出,try-catch-finally一般一起使用,用來捕捉處理異常,finally最後用來對資源回收。Try中的異常拋出會被catch捕捉並進一步處理。

42、java中有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法?

答:兩種方法,一種是繼承thread的子類,一種是實現runnable介面的類。通過產生實體這兩個物件來實現一個進程。而修飾同步方法的關鍵字是Synchronized。用來枷鎖的。

43、sleep() 和 wait() 有什麼區別?

答:首先方法屬於這不同,sleep是屬於thread。Wait是屬於object()。如果不考慮thread的父類也是object。第二是放鎖:sleep只是將cpu交出,進入阻塞。Wait也是將cpu交出,但同時也會釋放鎖。

44、同步和非同步有何異同,在什麼情況下分別使用他們?舉例說明。

答:同步是執行緒間資料共用。一個資料被一個執行緒使用但同時也被另外一個執行緒使用就要用到同步。非同步是一個物件在調用一個方法時會等很長時間,這是就需要非同步的處理了。

45、多執行緒有幾種實現方法?同步有幾種實現方法?

答:有兩種實現多執行緒的方法 分別是實現thread和runnale介面,同步也有兩種使用synchronized關鍵字和notify和wait方法。

46、啟動一個執行緒是用run()還是start()?

答:調用start方法。是執行緒進入就緒狀態。以後可以被調用為運行狀態。一個必須關聯具體執行的代碼,而run中放入的就是要具體執行的代碼。

47、介紹Collection框架的結構

答:List Map ArrayList Set Vector LinkedList HashSet LinkedSet SortedSet treeSet HashMap linkedMap SortedMap treeMap hashtable properties

48、Collection框架中實現比較要實現什麼介面

答:comparable

49、ArrayList和Vector的區別

答:版本不同,前者執行緒不安全,後者執行緒安全。

50、HashMap和Hashtable的區別

答:版本不同,前者執行緒不安全,後者執行緒安全。

51、List 和 Map 區別?

答:一個存放單列資料的集合,一個是存放鍵值的。

52、List, Set, Map是否繼承自Collection介面?

答:List set是 Map不是

53、List、Map、Set三個介面,存取元素時,各有什麼特點?

答:list存放元素不要求元素有順序 可以重複 set沒有重複值 map存放的元素是鍵值。

54、說出ArrayList,Vector, LinkedList的存儲性能和特性

答:ArrayList 底層是以陣列的形式存儲的 所以特性是遍歷查詢較快

linkedList底層是以鏈表形式存儲的 所以特性是插入刪除較快

Vector每個方法都使用了synchronized方法 是一個執行緒安全的類 但卻影響了效率。

55、去掉一個Vector集合中重複的元素

答:可以充分利用hashSet類。

56、Collection 和 Collections的區別。

答:collections是collection的一個工具類 幫助collection完成一些功能,例如反轉,倒敘和排序等等

57、Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?

答:是使用equals來判斷的 hashSet中是使用hashCode和equals結合判斷的。==是不行的之前已經說過==表示的是兩個物件的引用是否相同。而內部判斷是add方法中自動調用的。

58、你所知道的集合類都有哪些?主要方法?

答:集合 容器 用來儲存,管理物件的物件

Collection

介面特點: 元素是Object

常用方法:

add(Object o):將物件o添加到集合中

addAll(Collection c):將集合c中所有的元素添加到集合中

clear():清空集合

contains(Object o):判斷集合中是否存在元素o

remove(Object o):從集合中刪除元素o

size():返回集合的長度

toArray():將集合轉為陣列

遍歷:

反覆運算遍歷 for-each

實現類:無

List Collection的子介面

介面特點: 元素是Object 有順序(下標) 元素可以重複

常用方法:

add(int pos,Object o):將對象o插入到pos下標

get(int pos):獲得pos下標的元素

indexOf(Object o):獲得o在集合中的下標

remove(int pos):刪除pos下標的元素

set(int pos,Object o):將pos下標位置替換為物件o

遍歷:

1.下標遍歷

2.反覆運算遍歷 for-each

實現類:

1. ArrayList 陣列實現 查詢快 增刪慢 1.2 執行緒不安全 快

2. LinkedList 鏈表實現 查詢慢 增刪快

3. Vector 陣列實現 1.0 執行緒安全 慢

泛型:JDK5.0

用在集合上:實現類型安全的集合,指定集合中元素的類型

Collections 工具類

reverse(List list):將list中的元素反轉排列

shuffle(List list):將list中的元素隨機打亂次序

sort(List list):為list中的元素排序 元素要實現Comparable介面,實現排序規則

Set Collection的子介面

介面特點: 元素是Object 無順序 元素內容不可重複

常用方法: 無

遍歷: 反覆運算遍歷 for-each

實現類:

HashSet

自訂的物件放入HashSet,為了元素內容不重複,應該:

1)覆蓋hashCode()方法,保證內容相同的物件返回相同的int

為了提高效率, 儘量保證內容不同的物件返回不同的int

2)覆蓋equals()方法,保證內容相同的物件返回true

LinkedHashSet HashSet的子類 維護元素添加到集合中的順序

TreeSet SortedSet(Set的子介面)的實現類 自動排序

Map

介面特點:

元素是鍵值對(key-value) key:無順序 不可重複 唯一 value:可以重複

常用方法:

put(K key,V value):把key-value放入Map 如果key已存在,新的value替換舊的value

get(K key):通過key查找對應的value

remove(K key):刪除key所對應的鍵值對

size():返回Map中鍵值對的數量

containsKey/containsValue : 判斷Map中是否存在key/value

clear():清空Map

遍歷:

鍵遍歷 keySet() 返回Map中所有key的集合 Set

值遍歷 values() 返回Map中所有value的集合 Collection

實現類:

HashMap 1.2 執行緒不安全 快 允許用null作為key或者value

LinkedHashMap HashMap子類 維護元素添加到Map中的順序

TreeMap SortedMap(Map的子介面)的實現類 自動對key排序

Hashtable 1.0 執行緒安全 慢 不允許用null作為key或者value

Properties Hashtable子類 key和value都是String 用於讀取設定檔

59、兩個物件值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

答:對的,equals和hashcode可以是子類重寫的,重寫的標準完全有子類決定,完全可能出現不同的 hashcode。 另外,hashcode一般用在hashMap hashSet中,此時有可能相同。不在這兩個的時候,可能完全不同。

60、TreeSet裡面放物件,如果同時放入了父類和子類的實例物件,那比較時使用的是父類的compareTo方法,還是使用的子類的compareTo方法,還是拋異常!

答:子類重寫了就使用子類的,沒寫就使用父類的。有異常,父類和子類只有一個能實現。

61、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類別以供繼承,請說出他們分別是哪些類?

答:從方向上分為輸入流和輸出流,從資料單元上說分為位元組流和字元流,從功能上說分為分為節點流和過濾流。位元組流的抽象父類是inputStream/OutputStream 字元流的抽象父類是:inputStreamreader/outPutStreamwriter.

62、位元組流與字元流的區別

答:處理物件不同,位元組流可以處理任何檔,而字元流主要處理文字檔。字元流處理文字檔時需要注意文本的編碼格式。

63、什麼是java序列化,如何實現java序列化?或者請解釋Serializable介面的作用。

答:在JAVA中,要將一個物件進行讀入或者輸出操作,這個過程中,就要將物件序列化以便完成這個過程。實現序列化要實現一個JAVA提供的介面serializable介面,這是一個空介面,但實現這個介面的物件都可以產生實體。對於被transient關鍵字修飾的屬性除外。

64、描述一下JVM載入class檔的原理機制?

答:java的類載入是又一個類classloader和它的子類完成的,這個類本身是作為一個系統元件存在的,主要負責在運行過程中裝入和查找檔。

65、GC是什麼? 為什麼要有GC?

答:是System提供的一個靜態方法,也是用來對垃圾回收的。它可以理解為用戶手動調用垃圾回收器回收垃圾。

66、垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收記憶體嗎?有什麼辦法主動通知虛擬機器進行垃圾回收?

答:垃圾回收期一般是當記憶體快要消耗光的時候,垃圾回收器就回檔用finalize()方法的。主動調用是使用System.GC的方法。

67、java中會存在記憶體洩漏嗎,請簡單描述。

答:記憶體洩露可以理解為有物件沒有釋放,有引用還在指向它,造成我們覺得記憶體有丟失的現象。我們常會遇到的一個例子就是:HashSet的使用中,我們常常remove一個物件,

但這個物件的hashCode我們常常是自己重載的,如果出現移除之前和添加之後,對參與hashCode的屬性進行了更改,那麼實際上我們並沒有移除掉這個物件,它就一直存在,造成了記憶體洩露。

不關流的時候,可能造成記憶體洩露。但這個洩露可能是系統資源沒被釋放。

例如:用java生成一個windows視窗,實際上這時在記憶體中有兩個物件,java的物件被釋放掉了,但記憶體中的windows資源並沒有被釋放掉。造成記憶體洩露。

語法要求是:返回值,方法名,參數列表要一致,修飾許可權要高於父類,拋出被父類更安全、更具體的異常,至少是相同的。比如拋出父類異常的子異常。

OverLoad是本類中,同一方法的不同實現,它要求方法名相同。參數清單不同(個數,順序,類型),返回值不做要求,但最好不同,因為我們在調用方法是常常不接收返回值,如果這種情況出現,而重載的方法的僅僅是返回值不同的話,編譯器會分不出調用哪個方法。但5.0後返回值可以不同在異常時常用。即在返回值、異常和返回類型上有重載。方法的異常類型和數目不會對重載有影響。

而以上兩種如果原方法都是private的話,那麼新的方法都可以視為寫了一個新方法,所以沒有重載和重寫的概念在裡頭了。

17、構造器Constructor是否可被override?

答:構造器不能被繼承,所以不能重寫,但可以重載。

18、介面是否可繼承介面? 抽象類別是否可實現(implements)介面? 抽象類別是否可繼承具體類(concrete class)? 抽象類別中是否可以有靜態的main方法?

答:介面可以繼承介面,抽象類別可以實現介面,抽象類別可以繼承具體的類,抽象類別可以有靜態的main方法。抽象類別不可以產生實體和擁有abstract的方法。

19、物件導向的特徵有哪些方面?

答:封裝、多態、繼承、抽象。

20、java中實現多態的機制是什麼?

答:父類或者介面的引用可以指向子類或者實現類的物件。在編譯時,分析引用變數中的類型方法,運行時綁定實際的類。

21、abstract class和interface有什麼區別?

答:interface是特殊的抽象類別。Abstract類包含抽象方法,沒有抽象靜態方法可以有普通方法和構造方法,但不能有抽象構造方法,沒有構造方法。不能被產生實體,只能被繼承。

Interface中,所有的抽象方法是公開,抽象的,屬性時公開、靜態、常量的。且沒有構造方法。

23、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

24、什麼是內部類?Static Nested Class 和 Inner Class的不同。

25、內部類可以引用它的包含類的成員嗎?有沒有什麼限制?

答:可以,但要求是用final修飾的。

26、Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?

答:可以,沒有問題。而且必須是某個類的子類或者介面的實現類。

27、String是最基本的資料類型嗎?

答:不是,String是較為常見的對象類型。而基本類型只有八種:byte,short,int,long,char,boolean,double,float。

28、String s = "Hello";s = s + " world!";這兩行代碼執行後,原始的String物件中的內容到底變了沒有?

答:沒有,這個過程實際上是創建了新的物件,將s的引用指向了一個新的物件。String是一個不可變的類immutable。

29、是否可以繼承String類?

答:不可以。它是一個final類,是不能被繼承的。

30、String s = new String("xyz");創建了幾個物件? 二者之間有什麼區別?

答:如果"xyz"是第一次出現,那麼應該是兩個物件,如果已經出現過,應該是一個物件。New出現的地方一定會有一個物件。而"xyz"的出現也會生成一個物件,放入到串池中,以方便下次使用。

31、String 和StringBuffer的區別

答:構造方式不同,String是提供數值不可改變的,而StringBuffer字元可以改變的。StringBuffer的出現是為了解決String在做字元串連接時,造成的過多記憶體消耗。僅僅通過一個StringBuffer物件就可以完成字元串連接。而不是想String一樣,每進行一次字元串連接就開闢一個空間存放物件。

32、如何把一段逗號分割的字串轉換成一個陣列?

答:直接調用String類中的靜態方法Spilt(",");這個方法是將字串按照指定的字元進行劈分。

33、陣列有沒有length()這個方法? String有沒有length()這個方法?

答:陣列中是屬性,陣列中表示陣列元素的個數,String中表示字元的個數。

34、下面這條語句一共創建了多少個物件:String s="a"+"b"+"c"+"d";

答:7個。每一個字元是一個物件,運算時,+號左邊是一個新的物件

35、try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後?

答:finally中的語句是在try語句結束前執行的,當try中要結束時。會跳到finally中執行裡邊的語句,是在return之前。如果finally中也有return那麼不會再回去執行try語句。

36、final, finally, finalize的區別。

答:final是修飾符 用來對方法,類和變數修飾的,修飾的方法不能被重寫,只能繼承,修飾的類不能被繼承,變數時常量,一旦賦值不可更改。Finally是try語句的一部分,主要用來對資源進行回收的,許可權大於try和Catch,finalize是Object的方法,是對記憶體中垃圾資源回收的,有JVM調用。

37、運行時異常與一般異常有何異同?

答:異常分為兩類:已檢查異常和未檢查異常。前者是無法避免但可以處理的屬於一般異常。常見的有EOFException。而未檢查異常是可以避免,可以處理的。是運行時異常。常見的有NullPointerException。異常表示程式運行時出現的非正常情況。運行時異常,表示JAVA虛擬機器的通常操作中可能遇到的情況。是一種常見的異常。Java虛擬機器要求必須拋出非運行的異常。而對運行異常不做要求。

38、error和exception有什麼區別?

答:error是錯誤,往往是系統原因,不可避免,無法處理。而Exception是程式運行中出現的非正常情況。往往是由於設計和實現的問題,人為因素較大。

39、Java中的異常處理機制的簡單原理和應用。

答:異常是指程式運行過程中出現的非正常情況。現實生活中,一個異常包含許多資訊,JAVA將其抽象出來形成一個類,不同的類用來表示不同的異常。所有異常的根類是throwable。下有兩個子類error和exceptione。Error往往是程式無法克服和恢復的錯誤,通常會死掉。而excepiton中異常也分為兩類,未檢查異常和已檢查異常。已檢查異常是由於程式環境發生變化,是用戶能夠解決,但忽略的。例如網線斷了,磁碟空間不夠等等。對這種異常是要處理或者拋出的。以防程式中斷。未檢查異常是設計者設計和實現不全面導致的,不要求拋出或者處理。

40、請寫出你最常見到的5個runtime exception。

答:NullPointerExcepiton ClassCastException

41、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以拋出異常嗎?

答:throws是將異常拋給上一級調用者,throw是將異常拋出,try-catch-finally一般一起使用,用來捕捉處理異常,finally最後用來對資源回收。Try中的異常拋出會被catch捕捉並進一步處理。

42、java中有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法?

答:兩種方法,一種是繼承thread的子類,一種是實現runnable介面的類。通過產生實體這兩個物件來實現一個進程。而修飾同步方法的關鍵字是Synchronized。用來枷鎖的。

43、sleep() 和 wait() 有什麼區別?

答:首先方法屬於這不同,sleep是屬於thread。Wait是屬於object()。如果不考慮thread的父類也是object。第二是放鎖:sleep只是將cpu交出,進入阻塞。Wait也是將cpu交出,但同時也會釋放鎖。

44、同步和非同步有何異同,在什麼情況下分別使用他們?舉例說明。

答:同步是執行緒間資料共用。一個資料被一個執行緒使用但同時也被另外一個執行緒使用就要用到同步。非同步是一個物件在調用一個方法時會等很長時間,這是就需要非同步的處理了。

45、多執行緒有幾種實現方法?同步有幾種實現方法?

答:有兩種實現多執行緒的方法 分別是實現thread和runnale介面,同步也有兩種使用synchronized關鍵字和notify和wait方法。

46、啟動一個執行緒是用run()還是start()?

答:調用start方法。是執行緒進入就緒狀態。以後可以被調用為運行狀態。一個必須關聯具體執行的代碼,而run中放入的就是要具體執行的代碼。

47、介紹Collection框架的結構

答:List Map ArrayList Set Vector LinkedList HashSet LinkedSet SortedSet treeSet HashMap linkedMap SortedMap treeMap hashtable properties

48、Collection框架中實現比較要實現什麼介面

答:comparable

49、ArrayList和Vector的區別

答:版本不同,前者執行緒不安全,後者執行緒安全。

50、HashMap和Hashtable的區別

答:版本不同,前者執行緒不安全,後者執行緒安全。

51、List 和 Map 區別?

答:一個存放單列資料的集合,一個是存放鍵值的。

52、List, Set, Map是否繼承自Collection介面?

答:List set是 Map不是

53、List、Map、Set三個介面,存取元素時,各有什麼特點?

答:list存放元素不要求元素有順序 可以重複 set沒有重複值 map存放的元素是鍵值。

54、說出ArrayList,Vector, LinkedList的存儲性能和特性

答:ArrayList 底層是以陣列的形式存儲的 所以特性是遍歷查詢較快

linkedList底層是以鏈表形式存儲的 所以特性是插入刪除較快

Vector每個方法都使用了synchronized方法 是一個執行緒安全的類 但卻影響了效率。

55、去掉一個Vector集合中重複的元素

答:可以充分利用hashSet類。

56、Collection 和 Collections的區別。

答:collections是collection的一個工具類 幫助collection完成一些功能,例如反轉,倒敘和排序等等

57、Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?

答:是使用equals來判斷的 hashSet中是使用hashCode和equals結合判斷的。==是不行的之前已經說過==表示的是兩個物件的引用是否相同。而內部判斷是add方法中自動調用的。

58、你所知道的集合類都有哪些?主要方法?

答:集合 容器 用來儲存,管理物件的物件

Collection

介面特點: 元素是Object

常用方法:

add(Object o):將物件o添加到集合中

addAll(Collection c):將集合c中所有的元素添加到集合中

clear():清空集合

contains(Object o):判斷集合中是否存在元素o

remove(Object o):從集合中刪除元素o

size():返回集合的長度

toArray():將集合轉為陣列

遍歷:

反覆運算遍歷 for-each

實現類:無

List Collection的子介面

介面特點: 元素是Object 有順序(下標) 元素可以重複

常用方法:

add(int pos,Object o):將對象o插入到pos下標

get(int pos):獲得pos下標的元素

indexOf(Object o):獲得o在集合中的下標

remove(int pos):刪除pos下標的元素

set(int pos,Object o):將pos下標位置替換為物件o

遍歷:

1.下標遍歷

2.反覆運算遍歷 for-each

實現類:

1. ArrayList 陣列實現 查詢快 增刪慢 1.2 執行緒不安全 快

2. LinkedList 鏈表實現 查詢慢 增刪快

3. Vector 陣列實現 1.0 執行緒安全 慢

泛型:JDK5.0

用在集合上:實現類型安全的集合,指定集合中元素的類型

Collections 工具類

reverse(List list):將list中的元素反轉排列

shuffle(List list):將list中的元素隨機打亂次序

sort(List list):為list中的元素排序 元素要實現Comparable介面,實現排序規則

Set Collection的子介面

介面特點: 元素是Object 無順序 元素內容不可重複

常用方法: 無

遍歷: 反覆運算遍歷 for-each

實現類:

HashSet

自訂的物件放入HashSet,為了元素內容不重複,應該:

1)覆蓋hashCode()方法,保證內容相同的物件返回相同的int

為了提高效率, 儘量保證內容不同的物件返回不同的int

2)覆蓋equals()方法,保證內容相同的物件返回true

LinkedHashSet HashSet的子類 維護元素添加到集合中的順序

TreeSet SortedSet(Set的子介面)的實現類 自動排序

Map

介面特點:

元素是鍵值對(key-value) key:無順序 不可重複 唯一 value:可以重複

常用方法:

put(K key,V value):把key-value放入Map 如果key已存在,新的value替換舊的value

get(K key):通過key查找對應的value

remove(K key):刪除key所對應的鍵值對

size():返回Map中鍵值對的數量

containsKey/containsValue : 判斷Map中是否存在key/value

clear():清空Map

遍歷:

鍵遍歷 keySet() 返回Map中所有key的集合 Set

值遍歷 values() 返回Map中所有value的集合 Collection

實現類:

HashMap 1.2 執行緒不安全 快 允許用null作為key或者value

LinkedHashMap HashMap子類 維護元素添加到Map中的順序

TreeMap SortedMap(Map的子介面)的實現類 自動對key排序

Hashtable 1.0 執行緒安全 慢 不允許用null作為key或者value

Properties Hashtable子類 key和value都是String 用於讀取設定檔

59、兩個物件值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

答:對的,equals和hashcode可以是子類重寫的,重寫的標準完全有子類決定,完全可能出現不同的 hashcode。 另外,hashcode一般用在hashMap hashSet中,此時有可能相同。不在這兩個的時候,可能完全不同。

60、TreeSet裡面放物件,如果同時放入了父類和子類的實例物件,那比較時使用的是父類的compareTo方法,還是使用的子類的compareTo方法,還是拋異常!

答:子類重寫了就使用子類的,沒寫就使用父類的。有異常,父類和子類只有一個能實現。

61、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類別以供繼承,請說出他們分別是哪些類?

答:從方向上分為輸入流和輸出流,從資料單元上說分為位元組流和字元流,從功能上說分為分為節點流和過濾流。位元組流的抽象父類是inputStream/OutputStream 字元流的抽象父類是:inputStreamreader/outPutStreamwriter.

62、位元組流與字元流的區別

答:處理物件不同,位元組流可以處理任何檔,而字元流主要處理文字檔。字元流處理文字檔時需要注意文本的編碼格式。

63、什麼是java序列化,如何實現java序列化?或者請解釋Serializable介面的作用。

答:在JAVA中,要將一個物件進行讀入或者輸出操作,這個過程中,就要將物件序列化以便完成這個過程。實現序列化要實現一個JAVA提供的介面serializable介面,這是一個空介面,但實現這個介面的物件都可以產生實體。對於被transient關鍵字修飾的屬性除外。

64、描述一下JVM載入class檔的原理機制?

答:java的類載入是又一個類classloader和它的子類完成的,這個類本身是作為一個系統元件存在的,主要負責在運行過程中裝入和查找檔。

65、GC是什麼? 為什麼要有GC?

答:是System提供的一個靜態方法,也是用來對垃圾回收的。它可以理解為用戶手動調用垃圾回收器回收垃圾。

66、垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收記憶體嗎?有什麼辦法主動通知虛擬機器進行垃圾回收?

答:垃圾回收期一般是當記憶體快要消耗光的時候,垃圾回收器就回檔用finalize()方法的。主動調用是使用System.GC的方法。

67、java中會存在記憶體洩漏嗎,請簡單描述。

答:記憶體洩露可以理解為有物件沒有釋放,有引用還在指向它,造成我們覺得記憶體有丟失的現象。我們常會遇到的一個例子就是:HashSet的使用中,我們常常remove一個物件,

但這個物件的hashCode我們常常是自己重載的,如果出現移除之前和添加之後,對參與hashCode的屬性進行了更改,那麼實際上我們並沒有移除掉這個物件,它就一直存在,造成了記憶體洩露。

不關流的時候,可能造成記憶體洩露。但這個洩露可能是系統資源沒被釋放。

例如:用java生成一個windows視窗,實際上這時在記憶體中有兩個物件,java的物件被釋放掉了,但記憶體中的windows資源並沒有被釋放掉。造成記憶體洩露。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示