java面试题-精心准备
生活随笔
收集整理的這篇文章主要介紹了
java面试题-精心准备
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、接口和抽象類的區別是什么?
Java 提供和支持創建抽象類和接口。它們的實現有共同點,不同點在于:?
接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。?
類可以實現很多個接口,但是只能繼承一個抽象類?
類如果要實現一個接口,它必須要實現接口聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。?
抽象類可以在不提供接口方法實現的情況下實現接口。?
Java 接口中聲明的變量默認都是 final 的。抽象類可以包含非 final 的變量。?
Java 接口中的成員函數默認是 public 的。抽象類的成員函數可以是 private , protected 或者是 public 。?
接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含 main 方法的話是可以被調用的。?
2、創建線程有幾種不同的方式?你喜歡哪一種?為什么?
繼承 Thread 類?
實現 Runnable 接口?
應用程序可以使用 Executor 框架來創建線程池?
實現 Runnable 接口這種方式更受歡迎,因為這不需要繼承 Thread 類。在應用設計中已經繼承了別的對象的情況下,這需要多繼承(而 Java 不支持多繼承),只能實現接口。同時,線程池也是非常高效的,很容易實現和使用。
3、為什么集合類沒有實現Cloneable和Serializable接口?
克隆 (cloning) 或者是序列化 (serialization) 的語義和含義是跟具體的實現相關的。因此,應該由集合類的具體實現來決定如何被克隆或者是序列化。
4、Iterator和ListIterator的區別是什么?
Iterator 可用來遍歷 Set 和 List 集合,但是 ListIterator 只能用來遍歷 List 。?
Iterator 對集合只能是前向遍歷, ListIterator 既可以前向也可以后向。?
ListIterator 實現了 Iterator 接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個和后一個元素的索引,等等。
5、Java中的HashMap的工作原理是什么?
Java 中的 HashMap 是以鍵值對 (key-value) 的形式存儲元素的。 HashMap 需要一個 hash 函數,它使用 hashCode() 和 equals() 方法來向集合 / 從集合添加和檢索元素。當調用 put() 方法的時候, HashMap 會計算 key 的 hash 值,然后把鍵值對存儲在集合中合適的索引上。如果 key 已經存在了, value 會被更新成新值。 HashMap 的一些重要的特性是它的容量 (capacity) ,負載因子 (load factor) 和擴容極限 (threshold resizing)
6、hashCode()和equals()方法的重要性體現在什么地方?
Java 中的 HashMap 使用 hashCode() 和 equals() 方法來確定鍵值對的索引,當根據鍵獲取值的時候也會用到這兩個方法。如果沒有正確的實現這兩個方法,兩個不同的鍵可能會有相同的 hash 值,因此,可能會被集合認為是相等的。而且,這兩個方法也用來發現重復元素。所以這兩個方法的實現對 HashMap 的精確性和正確性是至關重要的。
7、HashMap和Hashtable有什么區別?
HashMap 和 Hashtable 都實現了 Map 接口,因此很多特性非常相似。但是,他們有以下不同點:?
HashMap 允許鍵和值是 null ,而 Hashtable 不允許鍵或者值是 null 。?
Hashtable 是同步的,而 HashMap 不是。因此, HashMap 更適合于單線程環境,而 Hashtable 適合于多線程環境。?
HashMap 提供了可供應用迭代的鍵的集合,因此, HashMap 是快速失敗的。另一方面, Hashtable 提供了對鍵的列舉 (Enumeration) 。?
一般認為 Hashtable 是一個遺留的類。
8、ArrayList和LinkedList有什么區別?
ArrayList 和 LinkedList 都實現了 List 接口,他們有以下的不同點:?
ArrayList 是基于索引的數據接口,它的底層是數組。它可以以 O(1) 時間復雜度對元素進行隨機訪問。與此對應, LinkedList 是以元素列表的形式存儲它的數據,每一個元素都和它的前一個和后一個元素鏈接在一起,在這種情況下,查找某個元素的時間復雜度是 O(n) 。?
相對于 ArrayList , LinkedList 的插入,添加,刪除操作速度更快,因為當元素被添加到集合任意位置的時候,不需要像數組那樣重新計算大小或者是更新索引。?
LinkedList 比 ArrayList 更占內存,因為 LinkedList 為每一個節點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。
9、HashSet和TreeSet有什么區別?
HashSet 是由一個 hash 表來實現的,因此,它的元素是無序的。 add() , remove() , contains() 方法的時間復雜度是 O(1) 。?
另一方面, TreeSet 是由一個樹形的結構來實現的,它里面的元素是有序的。因此, add() , remove() , contains() 方法的時間復雜度是 O(logn) 。?
垃圾收集器 (Garbage Collectors)
10、在Java中,對象什么時候可以被垃圾回收?
當對象對當前使用這個對象的應用程序變得不可觸及的時候,這個對象就可以被回收了。
11、Java中的兩種異常類型是什么?他們有什么區別?
Java 中有兩種異常:受檢查的 (checked) 異常和不受檢查的 (unchecked) 異常。不受檢查的異常不需要在方法或者是構造函數上聲明,就算方法或者是構造函數的執行可能會拋出這樣的異常,并且不受檢查的異常可以傳播到方法或者是構造函數的外面。相反,受檢查的異常必須要用 throws 語句在方法或者是構造函數上聲明。這里有 Java 異常處理的一些小建議。 檢查異常: ( 編譯器必須處理的異常)除 error,runtimeexception 及其子類以外,其他的 Exception 類及其子類都是檢查異常。該異常特點是 java 編譯器檢查,即當程序中出現異常時,要么用 try-catch 語句捕獲,要么用 throws 子句聲明拋出,否則編譯不通過。 非檢查異常:(編譯器不要求處置的異常),包括運行時異常( runtimeexception 及其子類)和錯誤( error )
12、Java中Exception和Error有什么區別?
Exception 和 Error 都是 Throwable 的子類。 Exception 用于用戶程序可以捕獲的異常情況。 Error 定義了不期望被用戶程序捕獲的異常。
13、t hrow和throws有什么區別?
throw 關鍵字用來在程序中明確的拋出異常,相反, throws 語句用來表明方法不能處理的異常。每一個方法都必須要指定哪些異常不能處理,所以方法的調用者才能夠確保處理可能發生的異常,多個異常是用逗號分隔的。?
45. 異常處理的時候, finally 代碼塊的重要性是什么? ( 譯者注:作者標題的序號弄錯了 )?
14、什么是JDBC?
JDBC 是允許用戶在不同數據庫之間做選擇的一個抽象層。 JDBC 允許開發者用 JAVA 寫數據庫應用程序,而不需要關心底層特定數據庫的細節。
15、什么是cookie?session和cookie有什么區別?
cookie 是 Web 服務器發送給瀏覽器的一塊信息。瀏覽器會在本地文件中給每一個 Web 服務器存儲 cookie 。以后瀏覽器在給特定的 Web 服務器發請求的時候,同時會發送所有為該服務器存儲的 cookie 。下面列出了 session 和 cookie 的區別:?
無論客戶端瀏覽器做怎么樣的設置, session 都應該能正常工作。客戶端可以選擇禁用 cookie ,但是, session 仍然是能夠工作的,因為客戶端無法禁用服務端的 session 。?
在存儲的數據量方面 session 和 cookies 也是不一樣的。 session 能夠存儲任意的 Java 對象, cookie 只能存儲 String 類型的對象。
16、concurrenthashmap如何實現
ConcurrentHashMap允許多個修改操作并發進行,其關鍵在于使用了鎖分離技術。它使用了多個鎖來控制對hash表的不同部分進行的修改。ConcurrentHashMap內部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的hash table,它們有自己的鎖。只要多個修改操作發生在不同的段上,它們就可以并發進行。
17、synchronized與volatile異同?
1.volatile本質是在告訴jvm當前變量在寄存器(工作內存)中的值是不確定的,需要從主存中讀取;synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住。?
2.volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的?
3.volatile僅能實現變量的修改可見性,并能保證原子性;而synchronized則可以保證變量的修改可見性和原子性?
4.volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。?
5.volatile標記的變量不會被編譯器優化;synchronized標記的變量可以被編譯器優化?
18、Java內存模型
Java內存模型的抽象在java中,所有實例域、靜態域和數組元素存儲在堆內存中,堆內存在線程之間共享(本文使用“共享變量”這個術語代指實例域,靜態域和數組元素)。局部變量(Local variables),方法定義參數(java語言規范稱之為formal method parameters)和異常處理器參數(exception handler parameters)不會在線程之間共享,它們不會有內存可見性問題,也不受內存模型的影響。
19、hashCode() 和equals() 區別和作用
equals(Object obj)方法用來判斷兩個對象是否“相同”,如果“相同”則返回true,否則返回false。?
hashcode()方法返回一個int數,在Object類中的默認實現是“將該對象的內部地址轉換成一個整數返回”。?
接下來有兩個個關于這兩個方法的重要規范(我只是抽取了最重要的兩個,其實不止兩個):?
規范1:若重寫equals(Object obj)方法,有必要重寫hashcode()方法,確保通過equals(Object obj)方法判斷結果為true的兩個對象具備相等的hashcode()返回值。說得簡單點就是:“如果兩個對象相同,那么他們的hashcode應該 相等”。不過請注意:這個只是規范,如果你非要寫一個類讓equals(Object obj)返回true而hashcode()返回兩個不相等的值,編譯和運行都是不會報錯的。不過這樣違反了Java規范,程序也就埋下了BUG。?
規范2:如果equals(Object obj)返回false,即兩個對象“不相同”,并不要求對這兩個對象調用hashcode()方法得到兩個不相同的數。說的簡單點就是:“如果兩個對象不相同,他們的hashcode可能相同”。?
這樣我們就可以推斷Java運行時環境是怎樣判斷HashSet和HastMap中的兩個對象相同或不同了。我的推斷是:先判斷hashcode是否相等,再判斷是否equals。?
20、你對線程優先級的理解是什么?
每一個線程都是有優先級的,一般來說,高優先級的線程在運行時會具有優先權,但這依賴于線程調度的實現,這個實現是和操作系統相關的(OS dependent)。我們可以定義線程的優先級,但是這并不能保證高優先級的線程會在低優先級的線程前執行。線程優先級是一個int變量(從1-10),1代表最低優先級,10代表最高優先級。
21、 什么是ThreadLocal?
ThreadLocal用于創建線程的本地變量,我們知道一個對象的所有線程會共享它的全局變量,所以這些變量不是線程安全的,我們可以使用同步技術。但是當我們不想使用同步的時候,我們可以選擇ThreadLocal變量。
23、Java Concurrency API中的Lock接口(Lock interface)是什么?對比同步它有什么優勢?
Lock接口比同步方法和同步塊提供了更具擴展性的鎖操作。他們允許更靈活的結構,可以具有完全不同的性質,并且可以支持多個相關類的條件對象。
它的優勢有:
可以使鎖更公平
可以使線程在等待鎖的時候響應中斷
可以讓線程嘗試獲取鎖,并在無法獲取鎖的時候立即返回或者等待一段時間
可以在不同的范圍,以不同的順序獲取和釋放鎖
24、spring的IOC,AOP原理
就是由IoC容器在運行期間,動態地將某種依賴關系注入到對象之中。
一個對象想使用另一個對象的方法不用new關鍵字去創建,而是把new的
過程交給spring容器,然后在需要在需要用的類中寫上要使用對象的set方法
這就是依賴注入
AOP原理,aop就是面向切面編程
25、如何選擇使用hashmap還是使用treemap
當要遍歷是就使用treemap
當要刪除,插入,定位元素的操作是使用hashmap
26、synchronized 和 ReentrantLock 的 區別
使用synchronized時候,如果程序運行出錯,就會拋出異常,但是不會去做清理工作。使用ReentrantLock允許你嘗試著獲取但最終未獲取的鎖,這樣如果其他人已經獲得這個鎖,那你就可以離開去執行別的事情,而不是等待直到這個鎖被釋放。
27、java都有哪些加鎖方式(synchronized、ReentrantLock、共享鎖、讀寫鎖等)
28、springMVC的工作原理圖:
1、客戶端發出一個http請求給web服務器,web服務器對http請求進行解析,如果匹配DispatcherServlet的請求映射路徑(在web.xml中指定),web容器將請求轉交給DispatcherServlet.
2、DipatcherServlet接收到這個請求之后將根據請求的信息(包括URL、Http方法、請求報文頭和請求參數Cookie等)以及HandlerMapping的配置找到處理請求的處理器(Handler)。
3-4、DispatcherServlet根據HandlerMapping找到對應的Handler,將處理權交給Handler(Handler將具體的處理進行封裝),再由具體的HandlerAdapter對Handler進行具體的調用。
5、Handler對數據處理完成以后將返回一個ModelAndView()對象給DispatcherServlet。
6、Handler返回的ModelAndView()只是一個邏輯視圖并不是一個正式的視圖,DispatcherSevlet通過ViewResolver將邏輯視圖轉化為真正的視圖View。
7、Dispatcher通過model解析出ModelAndView()中的參數進行解析最終展現出完整的view并返回給客戶端。
29、什么是死鎖(Deadlock)?如何分析和避免死鎖?
死鎖是指兩個以上的線程永遠阻塞的情況,這種情況產生至少需要兩個以上的線程和兩個以上的資源。
分析死鎖,我們需要查看Java應用程序的線程轉儲。我們需要找出那些狀態為BLOCKED的線程和他們等待的資源。每個資源都有一個唯一的id,用這個id我們可以找出哪些線程已經擁有了它的對象鎖。
30、飽漢和餓漢的區別
餓漢式是線程安全的,在類創建的同時就已經創建好一個靜態的對象供系統使用,以后不在改變
? ? ? ? ? 懶漢式如果在創建實例對象時不加上synchronized則會導致對對象的訪問不是線程安全的
? ? ? ? ? 推薦使用第一種?
從實現方式來講他們最大的區別就是懶漢式是延時加載,
他是在需要的時候才創建對象,而餓漢式在虛擬機啟動的時候就會創建,
HashMap通過hashcode對其內容進行快速查找,而 TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。?
31、Java中HashMap和TreeMap的區別深入理解
HashMap 非線程安全 TreeMap 非線程安全?
hashmap適用于插入修改
而treemap適用于排序
32、淺拷貝與深拷貝的區別
簡單的來說就是,在有指針的情況下,淺拷貝只是增加了一個指針指向已經存在的內存,而深拷貝就是增加一個指針并且申請一個新的內存,使這個增加的指針指向這個新的內存,采用深拷貝的情況下,釋放內存的時候就不會出現在淺拷貝時重復釋放同一內存的錯誤!
33.HashSet的實現:
對于HashSet而言,它是基于HashMap實現的,HashSet底層使用HashMap來保存所有元素,更確切的說,HashSet中的元素,只是存放在了底層HashMap的key上, 而value使用一個static final的Object對象標識。因此HashSet 的實現比較簡單,相關HashSet的操作,基本上都是直接調用底層HashMap的相關方法來完成,
34、線程同步(5種同步方式)
1.同步方法?
? ? 即有synchronized關鍵字修飾的方法。
? ? public synchronized void save(){}
2.同步代碼塊?
? ? 即有synchronized關鍵字修飾的語句塊。?
? ? 被該關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步
? ? synchronized(object){?
? ? }
3.使用特殊域變量(volatile)實現線程同步
//需要同步的變量加上volatile
? ? ? ? ? ? private volatile int account = 100;
4.使用重入鎖實現線程同步
? ? 在JavaSE5.0中新增了一個java.util.concurrent包來支持同步。?
? ? ReentrantLock類是可重入、互斥、實現了Lock接口的鎖
5.使用局部變量實現線程同步?
? ? 如果使用ThreadLocal管理變量,則每一個使用該變量的線程都獲得該變量的副本,?
? ? 副本之間相互獨立,這樣每一個線程都可以隨意修改自己的變量副本,而不會對其他線程產生影響。
35、volatile與synchronized
volatile本質是在告訴jvm當前變量在寄存器中的值是不確定的,需要從主存中讀取,synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住.
volatile僅能使用在變量級別,synchronized則可以使用在變量,方法.
volatile僅能實現變量的修改可見性,但不具備原子特性,而synchronized則可以保證變量的修改可見性和原子性.
volatile不會造成線程的阻塞,而synchronized可能會造成線程的阻塞.
volatile標記的變量不會被編譯器優化,而synchronized標記的變量可以被編譯器優化.
36、join() 的作用:讓“主線程”等待“子線程”結束之后才能繼續運行。
37、為什么我們調用start()方法時會執行run()方法,為什么我們不能直接調用run()方法?
當你調用start()方法時你將創建新的線程并且執行在run()方法里的代碼。但是如果你直接調用run()方法,它不會創建新的線程也不會執行調用線程的代碼
38、和 CountDownLatch 一樣,CyclicBarrier 同樣可以可以在構造函數中設定總計數值。與 CountDownLatch 不同的是,CyclicBarrier 的構造函數還可以接受一個 Runnable,會在 CyclicBarrier 被釋放時執行。
39、死鎖的情況:?
A和B都不是講禮貌的人,都不愿給別人讓路,所以A和B都在等對方讓路,導致誰也過不去。?
活鎖的情況:?
A和B都是很講禮貌的人,都主動給別人讓路。A往左移,同時B往右移;A往右移,同時B往左移。 A和B在移動的時候,同時擋住對方,導致誰也過不去。
40、volatile關鍵字在Java中有什么作用?
當我們使用volatile關鍵字去修飾變量的時候,所以線程都會直接讀取該變量并且不緩存它。這就確保了線程讀取到的變量是同內存中是一致的。
Java 提供和支持創建抽象類和接口。它們的實現有共同點,不同點在于:?
接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。?
類可以實現很多個接口,但是只能繼承一個抽象類?
類如果要實現一個接口,它必須要實現接口聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。?
抽象類可以在不提供接口方法實現的情況下實現接口。?
Java 接口中聲明的變量默認都是 final 的。抽象類可以包含非 final 的變量。?
Java 接口中的成員函數默認是 public 的。抽象類的成員函數可以是 private , protected 或者是 public 。?
接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含 main 方法的話是可以被調用的。?
2、創建線程有幾種不同的方式?你喜歡哪一種?為什么?
繼承 Thread 類?
實現 Runnable 接口?
應用程序可以使用 Executor 框架來創建線程池?
實現 Runnable 接口這種方式更受歡迎,因為這不需要繼承 Thread 類。在應用設計中已經繼承了別的對象的情況下,這需要多繼承(而 Java 不支持多繼承),只能實現接口。同時,線程池也是非常高效的,很容易實現和使用。
3、為什么集合類沒有實現Cloneable和Serializable接口?
克隆 (cloning) 或者是序列化 (serialization) 的語義和含義是跟具體的實現相關的。因此,應該由集合類的具體實現來決定如何被克隆或者是序列化。
4、Iterator和ListIterator的區別是什么?
Iterator 可用來遍歷 Set 和 List 集合,但是 ListIterator 只能用來遍歷 List 。?
Iterator 對集合只能是前向遍歷, ListIterator 既可以前向也可以后向。?
ListIterator 實現了 Iterator 接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個和后一個元素的索引,等等。
5、Java中的HashMap的工作原理是什么?
Java 中的 HashMap 是以鍵值對 (key-value) 的形式存儲元素的。 HashMap 需要一個 hash 函數,它使用 hashCode() 和 equals() 方法來向集合 / 從集合添加和檢索元素。當調用 put() 方法的時候, HashMap 會計算 key 的 hash 值,然后把鍵值對存儲在集合中合適的索引上。如果 key 已經存在了, value 會被更新成新值。 HashMap 的一些重要的特性是它的容量 (capacity) ,負載因子 (load factor) 和擴容極限 (threshold resizing)
6、hashCode()和equals()方法的重要性體現在什么地方?
Java 中的 HashMap 使用 hashCode() 和 equals() 方法來確定鍵值對的索引,當根據鍵獲取值的時候也會用到這兩個方法。如果沒有正確的實現這兩個方法,兩個不同的鍵可能會有相同的 hash 值,因此,可能會被集合認為是相等的。而且,這兩個方法也用來發現重復元素。所以這兩個方法的實現對 HashMap 的精確性和正確性是至關重要的。
7、HashMap和Hashtable有什么區別?
HashMap 和 Hashtable 都實現了 Map 接口,因此很多特性非常相似。但是,他們有以下不同點:?
HashMap 允許鍵和值是 null ,而 Hashtable 不允許鍵或者值是 null 。?
Hashtable 是同步的,而 HashMap 不是。因此, HashMap 更適合于單線程環境,而 Hashtable 適合于多線程環境。?
HashMap 提供了可供應用迭代的鍵的集合,因此, HashMap 是快速失敗的。另一方面, Hashtable 提供了對鍵的列舉 (Enumeration) 。?
一般認為 Hashtable 是一個遺留的類。
8、ArrayList和LinkedList有什么區別?
ArrayList 和 LinkedList 都實現了 List 接口,他們有以下的不同點:?
ArrayList 是基于索引的數據接口,它的底層是數組。它可以以 O(1) 時間復雜度對元素進行隨機訪問。與此對應, LinkedList 是以元素列表的形式存儲它的數據,每一個元素都和它的前一個和后一個元素鏈接在一起,在這種情況下,查找某個元素的時間復雜度是 O(n) 。?
相對于 ArrayList , LinkedList 的插入,添加,刪除操作速度更快,因為當元素被添加到集合任意位置的時候,不需要像數組那樣重新計算大小或者是更新索引。?
LinkedList 比 ArrayList 更占內存,因為 LinkedList 為每一個節點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。
9、HashSet和TreeSet有什么區別?
HashSet 是由一個 hash 表來實現的,因此,它的元素是無序的。 add() , remove() , contains() 方法的時間復雜度是 O(1) 。?
另一方面, TreeSet 是由一個樹形的結構來實現的,它里面的元素是有序的。因此, add() , remove() , contains() 方法的時間復雜度是 O(logn) 。?
垃圾收集器 (Garbage Collectors)
10、在Java中,對象什么時候可以被垃圾回收?
當對象對當前使用這個對象的應用程序變得不可觸及的時候,這個對象就可以被回收了。
11、Java中的兩種異常類型是什么?他們有什么區別?
Java 中有兩種異常:受檢查的 (checked) 異常和不受檢查的 (unchecked) 異常。不受檢查的異常不需要在方法或者是構造函數上聲明,就算方法或者是構造函數的執行可能會拋出這樣的異常,并且不受檢查的異常可以傳播到方法或者是構造函數的外面。相反,受檢查的異常必須要用 throws 語句在方法或者是構造函數上聲明。這里有 Java 異常處理的一些小建議。 檢查異常: ( 編譯器必須處理的異常)除 error,runtimeexception 及其子類以外,其他的 Exception 類及其子類都是檢查異常。該異常特點是 java 編譯器檢查,即當程序中出現異常時,要么用 try-catch 語句捕獲,要么用 throws 子句聲明拋出,否則編譯不通過。 非檢查異常:(編譯器不要求處置的異常),包括運行時異常( runtimeexception 及其子類)和錯誤( error )
12、Java中Exception和Error有什么區別?
Exception 和 Error 都是 Throwable 的子類。 Exception 用于用戶程序可以捕獲的異常情況。 Error 定義了不期望被用戶程序捕獲的異常。
13、t hrow和throws有什么區別?
throw 關鍵字用來在程序中明確的拋出異常,相反, throws 語句用來表明方法不能處理的異常。每一個方法都必須要指定哪些異常不能處理,所以方法的調用者才能夠確保處理可能發生的異常,多個異常是用逗號分隔的。?
45. 異常處理的時候, finally 代碼塊的重要性是什么? ( 譯者注:作者標題的序號弄錯了 )?
14、什么是JDBC?
JDBC 是允許用戶在不同數據庫之間做選擇的一個抽象層。 JDBC 允許開發者用 JAVA 寫數據庫應用程序,而不需要關心底層特定數據庫的細節。
15、什么是cookie?session和cookie有什么區別?
cookie 是 Web 服務器發送給瀏覽器的一塊信息。瀏覽器會在本地文件中給每一個 Web 服務器存儲 cookie 。以后瀏覽器在給特定的 Web 服務器發請求的時候,同時會發送所有為該服務器存儲的 cookie 。下面列出了 session 和 cookie 的區別:?
無論客戶端瀏覽器做怎么樣的設置, session 都應該能正常工作。客戶端可以選擇禁用 cookie ,但是, session 仍然是能夠工作的,因為客戶端無法禁用服務端的 session 。?
在存儲的數據量方面 session 和 cookies 也是不一樣的。 session 能夠存儲任意的 Java 對象, cookie 只能存儲 String 類型的對象。
16、concurrenthashmap如何實現
ConcurrentHashMap允許多個修改操作并發進行,其關鍵在于使用了鎖分離技術。它使用了多個鎖來控制對hash表的不同部分進行的修改。ConcurrentHashMap內部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的hash table,它們有自己的鎖。只要多個修改操作發生在不同的段上,它們就可以并發進行。
17、synchronized與volatile異同?
1.volatile本質是在告訴jvm當前變量在寄存器(工作內存)中的值是不確定的,需要從主存中讀取;synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住。?
2.volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的?
3.volatile僅能實現變量的修改可見性,并能保證原子性;而synchronized則可以保證變量的修改可見性和原子性?
4.volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。?
5.volatile標記的變量不會被編譯器優化;synchronized標記的變量可以被編譯器優化?
18、Java內存模型
Java內存模型的抽象在java中,所有實例域、靜態域和數組元素存儲在堆內存中,堆內存在線程之間共享(本文使用“共享變量”這個術語代指實例域,靜態域和數組元素)。局部變量(Local variables),方法定義參數(java語言規范稱之為formal method parameters)和異常處理器參數(exception handler parameters)不會在線程之間共享,它們不會有內存可見性問題,也不受內存模型的影響。
19、hashCode() 和equals() 區別和作用
equals(Object obj)方法用來判斷兩個對象是否“相同”,如果“相同”則返回true,否則返回false。?
hashcode()方法返回一個int數,在Object類中的默認實現是“將該對象的內部地址轉換成一個整數返回”。?
接下來有兩個個關于這兩個方法的重要規范(我只是抽取了最重要的兩個,其實不止兩個):?
規范1:若重寫equals(Object obj)方法,有必要重寫hashcode()方法,確保通過equals(Object obj)方法判斷結果為true的兩個對象具備相等的hashcode()返回值。說得簡單點就是:“如果兩個對象相同,那么他們的hashcode應該 相等”。不過請注意:這個只是規范,如果你非要寫一個類讓equals(Object obj)返回true而hashcode()返回兩個不相等的值,編譯和運行都是不會報錯的。不過這樣違反了Java規范,程序也就埋下了BUG。?
規范2:如果equals(Object obj)返回false,即兩個對象“不相同”,并不要求對這兩個對象調用hashcode()方法得到兩個不相同的數。說的簡單點就是:“如果兩個對象不相同,他們的hashcode可能相同”。?
這樣我們就可以推斷Java運行時環境是怎樣判斷HashSet和HastMap中的兩個對象相同或不同了。我的推斷是:先判斷hashcode是否相等,再判斷是否equals。?
20、你對線程優先級的理解是什么?
每一個線程都是有優先級的,一般來說,高優先級的線程在運行時會具有優先權,但這依賴于線程調度的實現,這個實現是和操作系統相關的(OS dependent)。我們可以定義線程的優先級,但是這并不能保證高優先級的線程會在低優先級的線程前執行。線程優先級是一個int變量(從1-10),1代表最低優先級,10代表最高優先級。
21、 什么是ThreadLocal?
ThreadLocal用于創建線程的本地變量,我們知道一個對象的所有線程會共享它的全局變量,所以這些變量不是線程安全的,我們可以使用同步技術。但是當我們不想使用同步的時候,我們可以選擇ThreadLocal變量。
23、Java Concurrency API中的Lock接口(Lock interface)是什么?對比同步它有什么優勢?
Lock接口比同步方法和同步塊提供了更具擴展性的鎖操作。他們允許更靈活的結構,可以具有完全不同的性質,并且可以支持多個相關類的條件對象。
它的優勢有:
可以使鎖更公平
可以使線程在等待鎖的時候響應中斷
可以讓線程嘗試獲取鎖,并在無法獲取鎖的時候立即返回或者等待一段時間
可以在不同的范圍,以不同的順序獲取和釋放鎖
24、spring的IOC,AOP原理
就是由IoC容器在運行期間,動態地將某種依賴關系注入到對象之中。
一個對象想使用另一個對象的方法不用new關鍵字去創建,而是把new的
過程交給spring容器,然后在需要在需要用的類中寫上要使用對象的set方法
這就是依賴注入
AOP原理,aop就是面向切面編程
25、如何選擇使用hashmap還是使用treemap
當要遍歷是就使用treemap
當要刪除,插入,定位元素的操作是使用hashmap
26、synchronized 和 ReentrantLock 的 區別
使用synchronized時候,如果程序運行出錯,就會拋出異常,但是不會去做清理工作。使用ReentrantLock允許你嘗試著獲取但最終未獲取的鎖,這樣如果其他人已經獲得這個鎖,那你就可以離開去執行別的事情,而不是等待直到這個鎖被釋放。
27、java都有哪些加鎖方式(synchronized、ReentrantLock、共享鎖、讀寫鎖等)
28、springMVC的工作原理圖:
1、客戶端發出一個http請求給web服務器,web服務器對http請求進行解析,如果匹配DispatcherServlet的請求映射路徑(在web.xml中指定),web容器將請求轉交給DispatcherServlet.
2、DipatcherServlet接收到這個請求之后將根據請求的信息(包括URL、Http方法、請求報文頭和請求參數Cookie等)以及HandlerMapping的配置找到處理請求的處理器(Handler)。
3-4、DispatcherServlet根據HandlerMapping找到對應的Handler,將處理權交給Handler(Handler將具體的處理進行封裝),再由具體的HandlerAdapter對Handler進行具體的調用。
5、Handler對數據處理完成以后將返回一個ModelAndView()對象給DispatcherServlet。
6、Handler返回的ModelAndView()只是一個邏輯視圖并不是一個正式的視圖,DispatcherSevlet通過ViewResolver將邏輯視圖轉化為真正的視圖View。
7、Dispatcher通過model解析出ModelAndView()中的參數進行解析最終展現出完整的view并返回給客戶端。
29、什么是死鎖(Deadlock)?如何分析和避免死鎖?
死鎖是指兩個以上的線程永遠阻塞的情況,這種情況產生至少需要兩個以上的線程和兩個以上的資源。
分析死鎖,我們需要查看Java應用程序的線程轉儲。我們需要找出那些狀態為BLOCKED的線程和他們等待的資源。每個資源都有一個唯一的id,用這個id我們可以找出哪些線程已經擁有了它的對象鎖。
30、飽漢和餓漢的區別
餓漢式是線程安全的,在類創建的同時就已經創建好一個靜態的對象供系統使用,以后不在改變
? ? ? ? ? 懶漢式如果在創建實例對象時不加上synchronized則會導致對對象的訪問不是線程安全的
? ? ? ? ? 推薦使用第一種?
從實現方式來講他們最大的區別就是懶漢式是延時加載,
他是在需要的時候才創建對象,而餓漢式在虛擬機啟動的時候就會創建,
HashMap通過hashcode對其內容進行快速查找,而 TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。?
31、Java中HashMap和TreeMap的區別深入理解
HashMap 非線程安全 TreeMap 非線程安全?
hashmap適用于插入修改
而treemap適用于排序
32、淺拷貝與深拷貝的區別
簡單的來說就是,在有指針的情況下,淺拷貝只是增加了一個指針指向已經存在的內存,而深拷貝就是增加一個指針并且申請一個新的內存,使這個增加的指針指向這個新的內存,采用深拷貝的情況下,釋放內存的時候就不會出現在淺拷貝時重復釋放同一內存的錯誤!
33.HashSet的實現:
對于HashSet而言,它是基于HashMap實現的,HashSet底層使用HashMap來保存所有元素,更確切的說,HashSet中的元素,只是存放在了底層HashMap的key上, 而value使用一個static final的Object對象標識。因此HashSet 的實現比較簡單,相關HashSet的操作,基本上都是直接調用底層HashMap的相關方法來完成,
34、線程同步(5種同步方式)
1.同步方法?
? ? 即有synchronized關鍵字修飾的方法。
? ? public synchronized void save(){}
2.同步代碼塊?
? ? 即有synchronized關鍵字修飾的語句塊。?
? ? 被該關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步
? ? synchronized(object){?
? ? }
3.使用特殊域變量(volatile)實現線程同步
//需要同步的變量加上volatile
? ? ? ? ? ? private volatile int account = 100;
4.使用重入鎖實現線程同步
? ? 在JavaSE5.0中新增了一個java.util.concurrent包來支持同步。?
? ? ReentrantLock類是可重入、互斥、實現了Lock接口的鎖
5.使用局部變量實現線程同步?
? ? 如果使用ThreadLocal管理變量,則每一個使用該變量的線程都獲得該變量的副本,?
? ? 副本之間相互獨立,這樣每一個線程都可以隨意修改自己的變量副本,而不會對其他線程產生影響。
35、volatile與synchronized
volatile本質是在告訴jvm當前變量在寄存器中的值是不確定的,需要從主存中讀取,synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住.
volatile僅能使用在變量級別,synchronized則可以使用在變量,方法.
volatile僅能實現變量的修改可見性,但不具備原子特性,而synchronized則可以保證變量的修改可見性和原子性.
volatile不會造成線程的阻塞,而synchronized可能會造成線程的阻塞.
volatile標記的變量不會被編譯器優化,而synchronized標記的變量可以被編譯器優化.
36、join() 的作用:讓“主線程”等待“子線程”結束之后才能繼續運行。
37、為什么我們調用start()方法時會執行run()方法,為什么我們不能直接調用run()方法?
當你調用start()方法時你將創建新的線程并且執行在run()方法里的代碼。但是如果你直接調用run()方法,它不會創建新的線程也不會執行調用線程的代碼
38、和 CountDownLatch 一樣,CyclicBarrier 同樣可以可以在構造函數中設定總計數值。與 CountDownLatch 不同的是,CyclicBarrier 的構造函數還可以接受一個 Runnable,會在 CyclicBarrier 被釋放時執行。
39、死鎖的情況:?
A和B都不是講禮貌的人,都不愿給別人讓路,所以A和B都在等對方讓路,導致誰也過不去。?
活鎖的情況:?
A和B都是很講禮貌的人,都主動給別人讓路。A往左移,同時B往右移;A往右移,同時B往左移。 A和B在移動的時候,同時擋住對方,導致誰也過不去。
40、volatile關鍵字在Java中有什么作用?
當我們使用volatile關鍵字去修飾變量的時候,所以線程都會直接讀取該變量并且不緩存它。這就確保了線程讀取到的變量是同內存中是一致的。
總結
以上是生活随笔為你收集整理的java面试题-精心准备的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几点建议,让Redis在你的系统中发挥更
- 下一篇: 深入Java关键字null