百問百答

如果我們說另一種不同的語言,那麼我們就會發覺有一個不同的世界

                      ——Luduing Wittgerstein

 

1、面向對象的特徵有哪些
封裝
最常見的是把屬性私有化封裝在一個類裏面,只能通過方法去訪問
繼承
子類繼承父類,從而繼承了父類的方法和屬性
抽象
比如一個英雄類,抽象出了name、hp這些屬性,使得開發過程中更加易於理解
多態
多態分操作符的多態和類的多態,類的多態指父類引用指向子類對象,並且有繼承,有重寫
 
2、String是最基本的數據類型嗎
不是,String 是類類型
基本數據類型有四類八種
整型 byte short int long
字符 char
浮點 double float
布爾 boolean

 

 

 
3、int 和integer有什麼區別
int是基本數據類型32位證書
Integer是類類型,是int的包裝類
int和integer之間可以通過自動裝箱、自動拆箱互相轉換
自動裝箱:不需要調用構造方法,通過=符號把基本類型轉換爲類類型就叫裝箱
自動拆箱:不需要調用integer的intvalue方法,通過=就自動轉換爲int類型,就叫拆箱
 
4、String和StringBuffer的區別
String是immutable的,其內容一旦創建好之後,就不可以發生改變
StringBufffer是可以變長的,內容也可以發生改變
改變的原理是StringBuffer內部採用了字符數組存放數據,在需要增加長度的時候,創建新的數組,並且把原來的數據複製到新的數組這樣的辦法實現
 
5、爲什麼String類型不可變
String的成員變量都是private final的,初始化之後不可變。
不可變的好處:最主要還是安全問題
·便於實現字符串池
在java中會大量的使用String常量,如果每一次聲明一個String都要創建一個String
對象,那將會造成極大的空間資源浪費。於是提出了String pool的概念,在堆中開闢一塊存儲空間String tool,當初始化String變量時,如果該字符串已經存在了,就不會創建一個新的字符串變量,而是會返回已經存在了的字符串的引用
· 使線程安全
· 避免安全問題
· 加快字符串處理速度
可通過反射破壞String的不可變性
 
6、運行時異常與一般異常有什麼區別?
運行時異常又叫做非可排查異常,在編譯過程中,不要求必須進行顯示捕捉
一般異常又叫做可排查異常,在編譯過程中,必須進行處理,要麼捕捉,要麼通過throws拋出去
 
7、說出ArrayList,Vector,LinkedList的存儲性能和特性
ArrayList和Vector,兩者都繼承了抽象類AbstractList,但是Vector是線程安全的,而ArrayList是非線程安全的
ArrayList和LinkedList區別,參見8
 
 
8、ArrayList和LinkedList的區別
· ArrayList的實現是基於數組,LinkedList的實現是基於雙向鏈表
· 對於隨機訪問,ArrayList優於LinkedList,ArrayList可以根據下標O(1)時間複雜度對元素進行隨機訪問。而LinkedList的每一個元素都依靠地址指針和它後一個元素連接在一起,在這種情況下,查找某個元素的時間複雜度是O(n)
· 對於插入和刪除操作,LinkedList優於ArrayList,因爲當勻速被添加在LinkedList任意位置的時候,不需要像ArrayList那樣重新計算大小或者更新索引
· LinkedList比ArrayList更佔內存,因爲LinkedList的節點除了存儲數據,還存儲了兩個引用,一個指向前一個元素,一個指向後一個元素
 
9、Collection和Collections的區別
Collection是接口,是List和Set的父接口
Collections是工具類,提供了排序、混淆等等實用方法
 
10、&和&&的區別
&有兩個作用,分別是位與和邏輯與
&& 就是邏輯與
作爲邏輯與,& 和 &&分別表示長路與和短路與
長路與兩次都會被運損
短路與 只要第一個是false,第二個就不進行運算了
 
11、HashMap和Hashtable的區別
HashMap和Hashtable都實現了Map接口,都是鍵值對保存數據的方式
區別1:HashMap可以存放null,Hashtable不能
區別2:HashMap不是線程安全的類,Hashtable是
 
12、final、finally、finalize的區別
final
final修飾類、方法、基本類型變量
修飾類,表示該類不能被繼承
修飾方法,表示該方法不能被重寫
修飾基本類型變量,表示該變量只能被賦值一次
修飾引用 表示引用只有一次指向對象的機會
finally
finally用於異常處理的場面,無論是否有異常拋出,都會執行
finalize
finalize是Object的方法,所有類都繼承了該方法。當一個對象滿足垃圾回收的條件,並且被回收的時候,其finalize()方法就會被調用
 
13、Overload和Override的區別,即重載和重寫的區別,OverLoaded的方法是否可以改變返回值的類型?
OverLoad。重載
Override 重寫
可以,重載其實本質上就是完全不同的方法,只是恰好取了相同的名字
 
14、Error和Exception的區別
Error和Exception都實現了Throwable接口
Error指的是JVM層面的錯誤,比如內存不足OOM
Exception指的是代碼邏輯的異常,比如數組下表越界等
 
15、abstract 、class、抽象類和interface接口的區別
使用方式:
抽象類只能通過繼承被使用
接口必須通過實現被使用
 
實現方法:
抽象類不近可以提供抽象方法,也可以提供實現方法
接口只能提供抽象方法,不能提供實現方法,但從1.8開始,接口可以提供實現方法了,前提是要在方法前加一個default修飾符
 
16、heap和stack有什麼區別
heap:堆
stack:棧
存放的內容不一樣:
heap是存放對象的
stack是存放基本類型,引用、方法調用的
 
存取方式不一樣:
heap是自動增加大小的,所以不需要指定大小,但是存取相對較慢
stack是固定大小,並且是FILO陷入後廚的順序,並且存取速度比較快
 
17、GC是什麼?爲什麼要有GC
GC是垃圾回收英文的縮寫
所謂的垃圾,指的是哪些不再被使用的對象,JVM的垃圾回收機制使得開發人員從無聊、容易犯錯的手動釋放內存資源的過程中解放出來,開發人員可以專注進行業務開發,而資源回收的工作交由更加專業的垃圾回收機制自動完成
 
18、short s1=1,s1=s1+1,有什麼錯誤
short s1=1 無錯誤,1最終爲short類型
s1=s1+1,會出現強制轉換錯誤
 
19、Math.round(11.5)等於多少,Math,round(-11.5)等於多少?
Math.round取整數,四捨五入,第一步爲12,第二部爲-11
 
20、String s = new String(“xyz”)創建了幾個String Object?
構造方法本身就是一個字符串對象
然後new'關鍵字一定會創建一個對象
所以總共創建了兩個String對象
 
21、接口是否可繼承接口?抽象類是否可實現接口?抽象類是否可繼承實體類?
1>可以,比如List就是繼承了Collection
2>可以
3>可以,所有抽象類都繼承了Object
 
22、List、Set、Map是否繼承自Collection接口
List和Set繼承了Collection接口
Map和Collection之間沒有繼承關係,一個是鍵值對,一個是單值,無法兼容
 
23、abstract的method是否可同時是static,是否可同時是synchroized?
都不可以
 
24、數組沒有length()方法?String有沒有該方法?
數組獲取長度的手段是.length屬性
String獲取長度的手段是length()方法
集合獲取長度的手段是size()方法
文件獲取長度的手段是length()方法
 
25、Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢?
以hashSet爲例,判斷重複的邏輯是:
1>首先看hashcode是否相同,如果不同,就是不重複的
2>如果hashcode一樣,再比較equals,如果不同就是不重複的,否則就是重複的
 
26、構造器Constructor是否可被override?是否可繼承String類?
子類不能繼承父類構造方法,所以就不存在重寫父類的構造方法
 
27、switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch可以作用在byte、short、int、String、ENUM上,但是不能作用在long上面
 
28、try{}裏有一個return語句,那麼緊跟在這個try後的finally{}李的code會不會被執行,什麼時候執行,在return前還是後?
try裏的return和 finally裏的return都會執行,但是當前方法知會採納finally中return的值
 
29、兩個對象值相同(x.equals(y)==true),但卻可有不同的hash code,這句話對不對?
因爲hashcode()方法和equals()方法都可以通過自定義重寫,是可以做到equals相同,但是hashcode不同的
 
30、垃圾回收的有點和原理。並考慮2種回收機制
java提供垃圾回收機制,自行GC,將開發人員從容易犯錯的內存管理中解放出來
原理:當某一個對象,沒有任何引用指向它的時候,那麼它就滿足垃圾回收的條件,在適當的時候,jvm虛擬機進行GC將其回收,釋放空間,以便後續再利用
常見回收機制:
1>定時回收
每隔30分鐘進行一次回收,這種機制的弊端是如果垃圾產生的較快,有可能30分鐘內垃圾已經把內存佔用光了,導致性能變慢
2>當垃圾佔到某個百分比的時候,進行回收
比如當垃圾佔用到70%的時候,進行回收。這種機制的弊端是,如果垃圾產生的頻率很快,那麼jvm就必須高頻率的進行垃圾回收。而在垃圾回收的過程中,jvm會停頓下來,只做垃圾回收,而影響業務功能的正常運行。
一般來說會將兩種機制結合使用
 
31、你所知道的集合類有哪些?主要方法
常見的集合:ArrayList、LinkedList、HashSet、HashMap等等
常見方法:size(),add(),remove()等等
 
32、char型變量中能不能存儲一箇中文漢字?
char是16位的,佔用2個字節。
漢字通常使用GBK編碼,也是使用兩個字節
所以可以存放漢字
 
33、解析XML文檔有集中方式
SAX和DOM
SAX是逐行讀取,直到找到目標爲止
DOM是先全文檔加載,然後讀取
 
34、關鍵字:throws、throw、try~catch、finally分表代表什麼意義,在try塊中可以拋出異常嗎?
throws:用在方法聲明上面,表示該方法有可能拋出某個異常
throw:拋出一個指定異常
try~catch:在try中有可能會拋出某個異常,一旦某個異常拋出後,就會在catch中進行捕捉,一般是一起用的
finally:表示無論是否捕捉住異常,都會執行
 
35、java源文件中是否包括多個類?有什麼限制
可以包括多個類,但是隻能出現一個public修飾的類,但是可以出現多個非public修飾的類
 
36、java中有集中類型的流?
所有的流都是基於字節流,所以最基本的流是:
輸入輸出字節流:InputStream、OutputStream
在字節流的基礎上,封裝了字符流:Reader、Writer
進一步又封裝了緩存流:BufferedReader、PrintWriter
以及數據流:DataInputStream、DataOutputStream
對象流:ObjectInputStream、ObjectOutputStream
等等
 
37、會出現內存泄露嗎,具體說明
會的
當某些對象不被使用,但是又有非直接引用指向的時候,那麼就不滿足垃圾回收的條件,從而形成內存泄露
demo:
static ArrayList<Object> al = new ArrayList<Object>();
public static void main(String[] args){
for(int i = 0; i < 100; i++){
Object o = new Object();
al.add(o);
}
}

 

 
38、多態實現的機制是什麼?
· 父類引用指向子類對象
· 重寫
 
39、靜態變量和實例變量的區別
靜態變量直接通過類就可以訪問,無需實例
示例變量,比如通過類的具體實例,纔可以訪問
 
40、什麼是java序列化?如何實現java序列化
序列化就是把一個java對象,通過某種介質進行傳輸,比如Socket輸入輸出流,或者保存在一個文件裏
實現java序列化的手段是讓該類實現接口Serializable,這個接口是一個標識性接口,沒有任何方法,僅僅用於表示該例可以序列化
 
41、是否可以從一個static方法內部發出對非static方法的調用?
不行,因爲非static方法需要一個具體的實例纔可以調用,而調用static方法的時候,不一定存在一個實例
 
42、List、Map、Set三個接口,存取元素的時候,各有什麼特點?
List是有順序的,並且可以重複的
Set是無序的,不可以重複
Map保存數據的方式是鍵值對
 
43、Anonymous Inner Class(匿名內部類)是否可以extends其他類,是否可以實現接口?
匿名內部類本質上就是在繼承其他的類,實現其他的接口
 
44、內部類可以應用外部類的成員嗎?有沒有什麼限制?
可以使用
如果是非靜態內部類,可以使用外部類的所有成員
如果使靜態內部類,只能使用外部類的靜態成員
 
45、多線程有幾種實現方式,都是什麼?
三種
· 繼承一個Thread類
· 實現Runnable接口
· 匿名內部類
 
46、sleep和wait有什麼區別
這二者之間沒有任何關係
sleep是Thread類的方法,指的是當前線程暫停
wait是Object類的方法,指的佔用當前對象的線程臨時釋放對當前對象的佔用,以使得其他線程有機會佔用當前對象。所以調用wait方法一定是在synchronized中進行的
 
47、說說數據連接池的工作機制是什麼
連接原理:因爲創建鏈接和關閉連接的行爲是非常耗時的。會顯著降低軟件的性能表現,解決辦法就是先創建N條數據庫連接Connection,循環使用,但是不進行關閉,這樣再執行SQL語句,就不需要額外創建鏈接了,直接使用。現成的連接就可以,從而節約了創建鏈接和關閉連接的時間開銷
 
48、簡述synchronized和java,util,concurrent.locks.Lock的異同
·Lock是一個接口,而synchronized是java中的關鍵字,synchronized是內置的語言實現,Lock是代碼層面的實現
·Lock可以選擇性的獲取鎖,如果一段時間獲取不到,可以放棄。synchronized不行,會一直獲取下去,藉助Lock這個特性,就能夠規避死鎖,synchronized必須通過謹慎和良好的設計,才能減少死鎖的發生
·synchronized在發生異常和同步快結束的時候,會自動釋放鎖。而Lock必須手動釋放,如果忘記釋放鎖,一樣會造成死鎖
 
49、Class.forName的作用,爲什麼要這麼用
Class.forName常見場景是在數據庫驅動初始化的時候調用
Class.forName本身的意義是加載類到JVM中,一旦一個類被加載到JVM中,它的靜態屬性就會被初始化,在初始化的過程中就會執行相關代碼,從而達到“加載驅動的效果”
 
50、當一個線程進入到一個對象的一個synchronized方法後,其他線程是否可進入此對象的其他方法
視情況而定,如果該對象的其他方法也是有synchronized修飾的,那麼其他線程就會被擋在外面,否則其他線程就可以進入其他方法
 
51、舉例常見的runtime exception
NullpointException 空指針
ArithMeiticException 算數
ClassCastException 類型轉換
ConcurrentModificationException 同步修改
IndexOutOfBoundsException 數組越界
NegativeArraySizeException 爲數組分配的空間是負數
 
52、進程、線程和任務之間的區別是什麼?

  進程:是一個OS的抽象概念,是用來執行程序的環境,程序通常運行在用戶模式,通過系統調用或自陷來進入內核模式。

  線程:可被調度的運行在CPU上的可執行上下文,內核擁有多個線程,一個進程有一個或多個線程。

  任務:一個Linux的可運行實體,可以指一個進程(含有單個線程),或一個多線程的進程裏的一個線程,或內核線程。

 

53、什麼是上下文切換?

  內核程序切換CPU讓其在不同的地址空間上做操作(上下文)。

  有時也稱做進程切換或任務切換,是指CPU 從一個進程或線程切換到另一個進程或線程。(百度百科)

 

54、paging和swapping之間的區別是什麼?

  內存和 SWAP 的這種交換過程稱爲頁面交換(Paging),值得注意的是 paging 和 swapping 是兩個完全不同的概念,國內很多參考書把這兩個概念混爲一談,swapping 也翻譯成交換,在操作系統裏是指把某程序完全交換到硬盤以騰出內存給新程序使用,和 paging 只交換程序的部分(頁面)是兩個不同的概念。純粹的 swapping 在現代操作系統中已經很難看到了,因爲把整個程序交換到硬盤的辦法既耗時又費力而且沒必要,現代操作系統基本都是 paging 或者 paging/swapping 混合,swapping 最初是在 Unix system V 上實現的。(阿里雲PTS)

 

55、說說進程和線程  

    進程是程序分配靜態資源的基本單位
  線程是程序動態執行的基本單位
 
56、緩存行大小標準以及一致性
  64個字節
  沒有一致性標準
 
57、抽象類和接口的區別
  相同點:
    ·都不能被實例化
    ·接口的實現類或者抽象類的子類都只有實現了接口或抽象類中的方法後才能實例化
  不同點:
    ·接口只有定義,不能有方法的實現,1.8之後可以定義default,而抽象類可以有定義與實現,方法可在抽象類中實現
    ·實現接口的關鍵字未implements,繼承抽象類的關鍵字爲extends。一個類可以實現多個接口,但一個類只能繼承一個抽象類。所以使用接口可以間接實現多重繼承
    ·接口強調特定功能的實現,而抽象類強調所述關係
    ·接口成員默認爲public static final,必須賦初始值,不能被修改;其他所有的成員方法都是public、abstract的。抽象類中成員變量默認爲default,可以在子類中被重新定義,也可以被重新賦值;抽象方法被abstrace修飾,不能被private、static、synchronized和native等修飾,必須以分號結尾,不帶花括號

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