阿里巴巴社招Java面試題做題記錄
阿里巴巴社招Java面試題
1、String和StringBuffer的區別
執行速度和執行緒安全兩方面:
執行速度:StringBuilder >StringBuffer >String
String是字串常量,不可變,每次改變只是建立一個新的物件,然後GC回收掉老的那個,所以執行速度最慢,另外兩個是字串物件,可變。
執行緒安全:
StringBuilder是執行緒不安全的,StringBuffer是執行緒安全的,看是否帶synchronized關鍵字。多執行緒則採用StringBuffer,單執行緒則要建議用速度較快的StringBuilder。
String:適用於少量的字串操作的情況,String是final類,無法被繼承。
StringBuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況。
StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況。
2、gc的概念,如果A和B物件迴圈引用,是否可以被GC?
這個迴圈引用是否被回收,就看這個迴圈引用是否掛在根上,A引用B,B引用A,A和B並沒有掛在某個記憶體元和根上,當他們的生命週期結束的時候。這兩個物件都有可能被回收。
3、Java中的記憶體溢位是如何造成的
OutOfMemoryError:
1.記憶體中載入的資料量過於龐大,如一次從資料庫取出過多資料;
2.集合類中有對物件的引用,使用完後未清空,使得JVM不能回收;
3.程式碼中存在死迴圈或迴圈產生過多重複的物件實體;
4.使用的第三方軟體中的BUG;
5.啟動引數記憶體值設定的過小;
4、String s = “123”;這個語句有幾個物件產生
s是引用或者叫做控制代碼。
java語言中有一個常量池,如果在你的程式碼的其它地方已經定義過這麼這個’123’的變數,在定義string s=’123’的時候,直接把s指向常量池中的字串123,就不會新生成一個字串123,但假如沒有的話,就會新生成一個字串123,指向s,並放入常量池!
String s = new String(“123”);有區別的,這句兩個物件(一個堆中的物件,一個常量池裡的物件)。
5、Error、Exception和RuntimeException的區別,作用又是什麼?
Error是Throwable 的子類,用於指示合理的應用程式不應該試圖捕獲的嚴重問題。大多數這樣的錯誤都是異常條件。雖然 ThreadDeath 錯誤是一個“正規”的條件,但它也是 Error 的子類,因為大多數應用程式都不應該試圖捕獲它。在執行該方法期間,無需在其 throws 子句中宣告可能丟擲但是未能捕獲的 Error的任何子類,因為這些錯誤可能是再也不會發生的異常條件。
Exception類及其子類是 Throwable 的一種形式,它指出了合理的應用程式想要捕獲的條件。
RuntimeException是那些可能在 Java 虛擬機器正常執行期間丟擲的異常的超類。可能在執行方法期間丟擲但未被捕獲的RuntimeException 的任何子類都無需在 throws 子句中進行宣告。它是Exception的子類。
6、列舉3個以上的RuntimeException
java.lang.nullpointerexception
java.lang.classnotfoundexception
java.lang.arithmeticexception
Java.lang.arrayindexoutofboundsexception
java.lang.illegalargumentexception
7、reader和inputstream區別
InputStream是表示位元組輸入流的所有類的超類
Reader是用於讀取字元流的抽象類
InputStream提供的是位元組流的讀取,而非文字讀取,這是和Reader類的根本區別。
即用Reader讀取出來的是char陣列或者String ,使用InputStream讀取出來的是byte陣列。
8、hashCode的作用
hashCode方法的主要作用是為了配合基於雜湊的集合一起正常執行,這樣的雜湊集合包括HashSet、HashMap以及HashTable。
Java中的hashCode方法就是根據一定的規則將與物件相關的資訊(比如物件的儲存地址,物件的欄位等)對映成一個數值,這個數值稱作為雜湊值。
9、Object類中有哪些方法,列舉3個以上(可以引導)
基本資料型別不會繼承Object類
clone()
finalize()
toString()
equals()
hashCode()
10、char型變數中能不能存貯一箇中文漢字?為什麼?
char型變數是用來儲存Unicode編碼的字元的,unicode編碼字符集中包含了漢字,
所以,char型變數中當然可以儲存漢字。不過,如果某個特殊的漢字沒有被包含在
unicode編碼字符集中,那麼,這個char型變數中就不能儲存這個特殊漢字。補充
說明:unicode編碼佔用兩個位元組,所以,char型別的變數也是佔用兩個位元組。
char表示的範圍是0–65535
11、列舉幾個Java Collection類庫中的常用類
HashSet
LinkedHashSet
ArrayList
TreeSet
TreeMap
HashMap
12、List、Set、Map是否都繼承自Collection介面?
List,Set是,Map不是。
13、HashMap和Hashtable的區別
主要的區別有:執行緒安全性,同步(synchronization),以及速度。
HashMap幾乎可以等價於Hashtable,除了HashMap是非synchronized的,並可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。 HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是執行緒安全的,多個執行緒可以共享一個Hashtable;而如果沒有正確的同步的話,多個執行緒是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴充套件性更好。 另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它執行緒改變了HashMap的結構(增加或者移除元素),將會丟擲ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會丟擲ConcurrentModificationException異常。但這並不是一個一定發生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區別。 由於Hashtable是執行緒安全的也是synchronized,所以在單執行緒環境下它比HashMap要慢。如果你不需要同步,只需要單一執行緒,那麼使用HashMap效能要好過Hashtable。 HashMap不能保證隨著時間的推移Map中的元素次序是不變的。
14、HashMap中是否任何物件都可以做為key,使用者自定義物件做為key有沒有什麼要求?
用自定義類作為key,必須重寫equals()和hashCode()方法。
自定義類中的equals() 和 hashCode()都繼承自Object類。
Object類的hashCode()方法返回這個物件儲存的記憶體地址的編號。
而equals()比較的是記憶體地址是否相等。
15、interface 和 abstrat class的區別 是否可以繼承多個介面,是否可以繼承多個抽象類
16、 啟動一個執行緒是用run()還是start()? 多執行緒有幾種實現 同步和併發是如何解決的 什麼叫守護執行緒,用什麼方法實現守護執行緒(Thread.setDeamon()的含義) 如何停止一個執行緒? 解釋是一下什麼是執行緒安全?舉例說明一個執行緒不安全的例子。解釋Synchronized關鍵字的作用。 當一個執行緒進入一個物件的一個synchronized方法後,其它執行緒是否可進入此物件的其它方法?
start();多執行緒實現:繼承Thread類,重寫run();實現Runnable介面,重寫run();實現Callable介面,重寫call函式
同步方式:synchronized修飾,wait(),notify()
加鎖;守護執行緒,專門用於服務其他的執行緒,如果其他的執行緒(即使用者自定義執行緒)都執行完畢,連main執行緒也執行完畢,那麼jvm就會退出(即停止執行)——此時,連jvm都停止運行了,守護執行緒當然也就停止執行了。比如垃圾回收執行緒,就是最典型的守護執行緒。
通過Thread.setDaemon(false)設定為使用者執行緒;通過Thread.setDaemon(true)設定為守護執行緒。如果不設定次屬性,預設為使用者執行緒。
1.使用退出標誌,使執行緒正常退出,也就是當run方法完成後執行緒終止。
2.使用stop方法強行終止,但是不推薦這個方法,因為stop和suspend及resume一樣都是過期作廢的方法。
3.使用interrupt方法中斷執行緒。
就是執行緒同步的意思,就是當一個程式對一個執行緒安全的方法或者語句進行訪問的時候,其他的不能再對他進行操作了,必須等到這次訪問結束以後才能對這個執行緒安全的方法進行訪問
如果你的程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,
就是執行緒安全的。
執行緒安全問題都是由全域性變數及靜態變數引起的。
若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則就可能影響執行緒安全
存在競爭的執行緒不安全,不存在競爭的執行緒就是安全的。
執行緒同步
1.如果其他方法前加了synchronized關鍵字,就不能,如果沒加synchronized,則能夠進去。
2.如果這個方法內部呼叫了wait(),則可以進入其他加synchronized的方法。
3.如果其他方法加了synchronized關鍵字,並且沒有呼叫wait方法,則不能。
17、瞭解過哪些JDK8的新特性,舉例描述下相應的特性?
18、對sql進行優化的原則有哪些?
1 減少返回不必要的資料
2 減少物理和邏輯讀次數
3 減少計算次數
19、servlet生命週期是生命與cgi的區別?
CGI(Common Gateway Interface通用閘道器介面)程式來實現資料在Web上的傳輸,使用的是如Perl這樣的語言編寫的,它對於客戶端作出的每個請求,必須建立CGI程式的一個新例項,這樣佔用大量的記憶體資源。由此才引入了Servlet技術。
Servlet提供了Java應用程式的所有優勢——可移植、穩健、易開發。使用Servlet Tag技術,Servlet能夠生成嵌於靜態HTML頁面中的動態內容。
20、StringBuffer有什麼優勢?為什麼快?
見第一題
other
談談你對HashMap的理解,底層原理的基本實現,HashMap怎麼解決碰撞問題的?
開發中用了那些資料庫?回答mysql,儲存引擎有哪些?然後問了我悲觀鎖和樂觀鎖問題使用場景、分散式叢集實現的原理。
springmvc和mybatis的工作原理,有沒有看過底層原始碼?
熟悉IO麼?與NIO的區別,阻塞與非阻塞的區別
微信紅包怎麼實現。
海量資料分析。
執行緒安全和非執行緒安全。
HTTP2.0、thrift。
java反射應用
分散式事務一致性。
nio的底層實現。
jvm基礎是必問的,jvm GC原理,JVM怎麼回收記憶體。
API介面與SDI介面的區別
dubbo如何一條連結併發多個呼叫。Dubbo的原理,序列化相關問題。
用過哪些中介軟體。
做過工作流引擎沒有。
以前的工作經歷,自己覺得出彩的地方
執行緒池的一些原理,鎖的機制升降級
從系統層面考慮,分散式從哪些緯度考慮
Hadoop底層怎麼實現
threadLocal,執行緒池,hashMap/hashTable/coccurentHashMap等
秒殺系統的設計
虛擬機器,IO相關知識點
Linux的命令
一個整形陣列,給定一個數,在陣列中找出兩個數的和等於這個數,並打印出來,我寫的時間複雜度高,要求O(n)。
n個整數,找出連續的m個數加和是最大。
更重視開源技術
資料庫鎖隱原理
1000個執行緒同時執行,怎麼防止不卡
並列的併發消費問題)
高併發量大的話怎麼處理熱點,資料等
如何獲取一個本地伺服器上可用的埠
流量控制相關問題
資料庫TPS是多少,是否進行測試過
快取擊穿有哪些方案解決
Java怎麼挖取回收器相關原理
Java的集合都有哪些,都有什麼特點
分散式鎖,redis快取,spring aop,系統架構圖,MySQL的特性
場景,同時給10萬個人發工資,怎麼樣設計併發方案,能確保在1分鐘內全部發完 打個比方會提出類似的場景