百度Java面試題前200頁和答案都在這裏了

百度Java面試題前200頁和答案都在這裏了

其中題目來源github.com/tangyouhua/program-resource/blob/master/program-interview/java-baidu-200.md,答案我自己整理的。
有興趣可以加入我QQ羣 368614849(大型網站架構技術交流),
操作系統中 heap 和 stack 的區別

什麼是基於註解的切面實現

什麼是 對象/關係 映射集成模塊

什麼是 Java 的反射機制

什麼是 ACID

BS與CS的聯繫與區別

Cookie 和 Session的區別

fail-fast 與 fail-safe 機制有什麼區別

get 和 post請求的區別

Interface 與 abstract 類的區別

IOC的優點是什麼

IO 和 NIO的區別,NIO優點

Java 8 / Java 7 爲我們提供了什麼新功能

什麼是競態條件? 舉個例子說明。

JRE、JDK、JVM 及 JIT 之間有什麼不同

MVC的各個部分都有那些技術來實現?如何實現?

RPC 通信和 RMI 區別

什麼是 Web Service(Web服務)

JSWDL開發包的介紹。JAXP、JAXM的解釋。SOAP、UDDI,WSDL解釋。

WEB容器主要有哪些功能? 並請列出一些常見的WEB容器名字。

一個”.java”源文件中是否可以包含多個類(不是內部類)?有什麼限制

簡單說說你瞭解的類加載器。是否實現過類加載器

解釋一下什麼叫AOP(面向切面編程)

請簡述 Servlet 的生命週期及其相關的方法

請簡述一下 Ajax 的原理及實現步驟

簡單描述Struts的主要功能

什麼是 N 層架構

什麼是CORBA?用途是什麼

什麼是Java虛擬機?爲什麼Java被稱作是“平臺無關的編程語言”

什麼是正則表達式?用途是什麼?哪個包使用正則表達式來實現模式匹配

什麼是懶加載(Lazy Loading)

什麼是尾遞歸,爲什麼需要尾遞歸

什麼是控制反轉(Inversion of Control)與依賴注入(Dependency Injection)


關鍵字


finalize


什麼是finalize()方法


finalize()方法什麼時候被調用

析構函數(finalization)的目的是什麼

final 和 finalize 的區別

final


final關鍵字有哪些用法


final 與 static 關鍵字可以用於哪裏?它們的作用是什麼

final, finally, finalize的區別

final、finalize 和 finally 的不同之處?


能否在運行時向 static final 類型的賦值


使用final關鍵字修飾一個變量時,是引用不能變,還是引用的對象不能變

使用final關鍵字修飾一個引用變量時,是指引用變量不能變,引用變量所指向的對象中的內容還是可以改變的。
一個類被聲明爲final類型,表示了什麼意思

認爲該類已經達到完美,完全沒有必要再去修改它,用final關鍵字。

不希望該類被繼承,用final關鍵字修飾。
throws, throw, try, catch, finally分別代表什麼意義


Java 有幾種修飾符?分別用來修飾什麼



volatile


volatile 修飾符的有過什麼實踐

答:1,線程1執行doWork()的過程中,可能有另外的線程2調用了shutdown,所以boolean變量必須是volatile。
     2,獨立觀察,定期 “發佈” 觀察結果供程序內部使用。【例如】假設有一種環境傳感器能夠感覺環境溫度。一個後臺線程可能會每隔幾秒讀取一次該傳感器,並更新包含當前文檔的 volatile 變量。然後,其他線程可以讀取這個變量,從而隨時能夠看到最新的溫度值。
     3,線程安全的計數器,使用 synchronized 確保增量操作是原子的,並使用 volatile 保證當前結果的可見性。如果更新不頻繁的話,該方法可實現更好的性能,因爲讀路徑的開銷僅僅涉及 volatile 讀操作,這通常要優於一個無競爭的鎖獲取的開銷。
     4,單例雙檢鎖
   總結一下,可以分爲5個:作爲狀態位發佈;一次性安全發佈;獨立觀察;volatile bean模式;開銷較低的讀寫鎖策略。

volatile 變量是什麼?volatile 變量和 atomic 變量有什麼不同


答:1)保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的。
        2)禁止進行指令重排序。
//線程1
boolean stop = false;
while(!stop){
    doSomething();
}
 
//線程2
stop = true;
這個代碼能夠把線程中斷,但是也有可能會導致無法中斷線程。每個線程在運行過程中都有自己的工作內存,那麼線程1在運行的時候,會將stop變量的值拷貝一份放在自己的工作內存當中。那麼當線程2更改了stop變量的值之後,但是還沒來得及寫入主存當中,線程2轉去做其他事情了,那麼線程1由於不知道線程2對stop變量的更改,因此還會一直循環下去。但是用volatile修飾之後就變得不一樣了:第一:使用volatile關鍵字會強制將修改的值立即寫入主存;第二:使用volatile關鍵字的話,當線程2進行修改時,會導致線程1的工作內存中緩存變量stop的緩存行無效(反映到硬件層的話,就是CPU的L1或者L2緩存中對應的緩存行無效);第三:由於線程1的工作內存中緩存變量stop的緩存行無效,所以線程1再次讀取變量stop的值時會去主存讀取。那麼線程1讀取到的就是最新的正確的值。
happens-before規則中的volatile變量規則,但是要注意,線程1對變量進行讀取操作之後,被阻塞了的話,並沒有對inc值進行修改。然後雖然volatile能保證線程2對變量inc的值讀取是從內存中讀取的,但是線程1沒有進行修改,所以線程2根本就不會看到修改的值。自增操作是不具備原子性的,它包括讀取變量的原始值、進行加1操作、寫入工作內存。

volatile 類型變量提供什麼保證?能使得一個非原子操作變成原子操作嗎

答:volatile 變量提供順序和可見性保證,例如,JVM 或者 JIT爲了獲得更好的性能會對語句重排序,但是 volatile 類型變量即使在沒有同步塊的情況下賦值也不會與其他語句重排序。 volatile 提供 happens-before 的保證,確保一個線程的修改能對其他線程是可見的。
某些情況下,volatile 還能提供原子性,如讀 64 位數據類型,像 long 和 double 都不是原子的,但 volatile 類型的 double 和 long 就是原子的。
volatile修飾的變量如果是對象或數組之類的,其含義是對象獲數組的地址具有可見性,但是數組或對象內部的成員改變不具備可見性:
能創建 volatile 數組嗎?

答: volatile修飾的變量如果是對象或數組之類的,其含義是對象獲數組的地址具有可見性,但是數組或對象內部的成員改變不具備可見性

transient變量有什麼特點

答:

我們都知道一個對象只要實現了Serilizable接口,這個對象就可以被序列化,java的這種序列化模式爲開發者提供了很多便利,我們可以不必關係具體序列化的過程,只要這個類實現了Serilizable接口,這個類的所有屬性和方法都會自動序列化。

      然而在實際開發過程中,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化,而其他屬性不需要被序列化,打個比方,如果一個用戶有一些敏感信息(如密碼,銀行卡號等),爲了安全起見,不希望在網絡操作(主要涉及到序列化操作,本地序列化緩存也適用)中被傳輸,這些信息對應的變量就可以加上transient關鍵字。換句話說,這個字段的生命週期僅存於調用者的內存中而不會寫到磁盤裏持久化。

1)一旦變量被transient修飾,變量將不再是對象持久化的一部分,該變量內容在序列化後無法獲得訪問。

2)transient關鍵字只能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關鍵字修飾的。變量如果是用戶自定義類變量,則該類需要實現Serializable接口。

3)被transient關鍵字修飾的變量不再能被序列化,一個靜態變量不管是否被transient修飾,均不能被序列化。




super什麼時候使用

答:子類的構造函數中不是必須使用super,在構造函數中,如果第一行沒有寫super(),編譯器會自動插入.但是如果父類沒有不帶參數的構造函數,或這個函數被私有化了(用private修飾).此時你必須加入對父類的實例化構造.而this就沒有這個要求,因爲它本身就進行實例化的構造.

 如果父類的構造函數是無參的,那子類構造函數會在第一行默認調用super().

     下面這種情況是必須調用super()的:


 1 public class Father {
 2      public String name;
 3      public Father(String name) {
 4             this.name = name;
 5     }
 6 }
 7 
 8 class Son extends Father{
 9       public Son(String name) {
10             super(name);
11 }
12 //必須調用,否則他會默認調用父類的無參構造函數,而父類的無參構造函數已經被有參的覆蓋,所以找不到




public static void 寫成 static public void會怎樣

說明一下public static void main(String args[])這段聲明裏每個關鍵字的作用

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

sizeof 是Java 的關鍵字嗎

static


static class 與 non static class的區別

內部靜態類不需要有指向外部類的引用。但非靜態內部類需要持有對外部類的引用。  
非靜態內部類能夠訪問外部類的靜態和非靜態成員。靜態類不能訪問外部類的非靜態成員。他只能訪問外部類的靜態成員。  
一個非靜態內部類不能脫離外部類實體被創建,一個非靜態內部類可以訪問外部類的數據和方法,因爲他就在外部類裏面。  
static 關鍵字是什麼意思?Java中是否可以覆蓋(override)一個private或者是static的方法

Static表示靜態的意思,可用於修飾成員變量和成員函數,被靜態修飾的成員函數只能訪問靜態成員,不可以訪問非靜態成員。靜態是隨着類的加載而加載的,因此可以直接用類進行訪問。 重寫是子類中的方法和子類繼承的父類中的方法一樣(函數名,參數,參數類型,反回值類型),但是子類中的訪問權限要不低於父類中的訪問權限。重寫的前提是必須要繼承,private修飾不支持繼承,因此被私有的方法不可以被重寫。靜態方法形式上可以被重寫,即子類中可以重寫父類中靜態的方法。但是實際上從內存的角度上靜態方法不可以被重寫。

靜態類型有什麼特點

答案:1、隨着類的加載而加載
也就是說:靜態會隨着類的消失而消失,說明他的生命週期最長
2、優先於對象存在
3、被所有對象所共享
4、可以直接被類名調用

main() 方法爲什麼必須是靜態的?能不能聲明 main() 方法爲非靜態

答案:所有static成員都是在程序裝載時初始化的,被分配在一塊靜態存儲區域。這個區域的成員一旦被分配,就不再改變地址啦。直到程序結束才釋放。main()就存儲在這裏。儘管包含main()的類還沒有被實例化,但是main()方法已經可以使用啦。而且JVM將會自動調用這個方法。通過main()的調用,再實例化其他的對象,也包括自己所在的類。

是否可以從一個靜態(static)方法內部發出對非靜態(non-static)方法的調用

靜態變量在什麼時候加載?編譯期還是運行期?靜態代碼塊加載的時機呢

答案:當類加載器將類加載到JVM中的時候就會創建靜態變量,這跟對象是否創建無關。靜態變量加載的時候就會分配內存空間。靜態代碼塊的代碼只會在類第一次初始化的時候執行一次。一個類可以有多個靜態代碼塊,它並不是類的成員,也沒有返回值,並且不能直接調用。靜態代碼塊不能包含this或者super,它們通常被用初始化靜態變量。

成員方法是否可以訪問靜態變量?爲什麼靜態方法不能訪問成員變量

答案:可以。static成員是在JVM的CLASSLOADER加載類的時候初始化的,而非static的成員是在創建對象,即new 操作的時候才初始化的;類加載的時候初始化static的成員,此時static 已經分配內存空間,所以可以訪問;非static的成員還沒有通過new創建對象而進行初始化,所以必然不可以訪問。
簡單點說:靜態成員屬於類,不需要生成對象就存在了.而非靜態需要生成對象才產生,所以靜態成員不能直接訪問.  

switch


switch 語句中的表達式可以是什麼類型數據

switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上

while 循環和 do 循環有什麼不同


操作符


&操作符和&&操作符有什麼區別?

a = a + b 與 a += b 的區別?

邏輯操作符 (&,|,^)與條件操作符(&&,||)的區別

3*0.1 == 0.3 將會返回什麼?true 還是 false?

float f=3.4; 是否正確?

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


數據結構


基礎類型(Primitives)


基礎類型(Primitives)與封裝類型(Wrappers)的區別在哪裏

簡述九種基本數據類型的大小,以及他們的封裝類

int 和 Integer 哪個會佔用更多的內存? int 和 Integer 有什麼區別?parseInt()函數在什麼時候使用到

float和double的默認值是多少

如何去小數四捨五入保留小數點後兩位

char 型變量中能不能存貯一箇中文漢字,爲什麼


類型轉換


怎樣將 bytes 轉換爲 long 類型

怎麼將 byte 轉換爲 String

如何將數值型字符轉換爲數字

我們能將 int 強制轉換爲 byte 類型的變量嗎?如果該值大於 byte 類型的範圍,將會出現什麼現象

能在不進行強制轉換的情況下將一個 double 值賦值給 long 類型的變量嗎

類型向下轉換是什麼


數組


如何權衡是使用無序的數組還是有序的數組                                                                                                                                                                  答案:
有序數組最大的好處:在於查找的時間複雜度是O(log n),而無序數組是O(n)。
有序數組的缺點是:插入操作的時間複雜度是O(n),因爲值大的元素需要往後移動來給新元素騰位置。相反,無序數組的插入時間複雜度是常量O(1)。                                                                                                                                                                                                                           

怎麼判斷數組是 null 還是爲空

怎麼打印數組? 怎樣打印數組中的重複元素

Array 和 ArrayList有什麼區別?什麼時候應該使用Array而不是ArrayList                                                                                                                      答案:
Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。
Array大小是固定的,ArrayList的大小是動態變化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
對於基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。                           

數組和鏈表數據結構描述,各自的時間複雜度                                                                                                                                                               答案:
1、存取方式上,數組可以順序存取或者隨機存取,而鏈表只能順序存取; 
2、存儲位置上,數組邏輯上相鄰的元素在物理存儲位置上也相鄰,而鏈表不一定; 
3、存儲空間上,鏈表由於帶有指針域,存儲密度不如數組大; 
4、按序號查找時,數組可以隨機訪問,時間複雜度爲O(1),而鏈表不支持隨機訪問,平均需要O(n); 
5、按值查找時,若數組無序,數組和鏈表時間複雜度均爲O(n),但是當數組有序時,可以採用折半查找將時間複雜度降爲O(logn); 
6、插入和刪除時,數組平均需要移動n/2個元素,而鏈表只需修改指針即可; 
7、空間分配方面: 
  數組在靜態存儲分配情形下,存儲元素數量受限制,動態存儲分配情形下,雖然存儲空間可以擴充,但需要移動大量元素,導致操作效率降低,而且如果內存中沒有更大塊連續存儲空間將導致分配失敗; 
  鏈表存儲的節點空間只在需要的時候申請分配,只要內存中有空間就可以分配,操作比較靈活高效;                                                                 

數組有沒有length()這個方法? String有沒有length()這個方法


隊列


隊列和棧是什麼,列出它們的區別                                                                                                                                                                                 答案:
隊列(Queue):是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表;
棧(Stack):是限定只能在表的一端進行插入和刪除操作的線性表。
一、規則不同
       1. 隊列:先進先出(First In First Out)FIFO
       2. 棧:先進後出(First In Last Out )FILO
二、對插入和刪除操作的限定不同
       1. 隊列:只能在表的一端進行插入,並在表的另一端進行刪除;
       2. 棧:只能在表的一端插入和刪除。
三、遍歷數據速度不同
       1. 隊列:基於地址指針進行遍歷,而且可以從頭部或者尾部進行遍歷,但不能同時遍歷,無需開闢空間,因爲在遍歷的過程中不影響數據結構,所以遍歷速度要快;
       2. 棧:只能從頂部取數據,也就是說最先進入棧底的,需要遍歷整個棧才能取出來,而且在遍歷數據的同時需要爲數據開闢臨時空間,保持數據在遍歷前的一致性。                                                                                                                                                                                              

BlockingQueue是什麼                                                                                                                                                                                                   答案:
1.BlockingQueue隊列和平常隊列一樣都可以用來作爲存儲數據的容器,但有時候在線程當中涉及到數據存儲的時候就會出現問題,而BlockingQueue是空的話,如果一個線程要從BlockingQueue裏取數據的時候,該線程將會被阻斷,並進入等待狀態,直到BlockingQueue裏面有數據存入了後,就會喚醒線程進行數據的去除。若BlockingQueue是滿的,如果一個線程要將數據存入BlockQueue,該線程將會被阻斷,並進入等待狀態,直到BlcokQueue裏面的數據被取出有空間後,線程被喚醒後在將數據存入
2.BlockingQueue定義的常用方法詳解: 
        1)add(anObject):把anObject加到BlockingQueue裏,即如果BlockingQueue可以容納,則返回true,否則報異常 
        2)offer(anObject):表示如果可能的話,將anObject加到BlockingQueue裏,即如果BlockingQueue可以容納,則返回true,否則返回false. 
        3)put(anObject):把anObject加到BlockingQueue裏,如果BlockQueue沒有空間,則調用此方法的線程被阻斷直到BlockingQueue裏面有空間再繼續. 
        4)poll(time):取走BlockingQueue裏排在首位的對象,若不能立即取出,則可以等time參數規定的時間,取不到時返回null 
        5)take():取走BlockingQueue裏排在首位的對象,若BlockingQueue爲空,阻斷進入等待狀態直到Blocking有新的對象被加入爲止 
3.BlockingQueue有四個具體的實現類,根據不同需求,選擇不同的實現類 
        1)ArrayBlockingQueue:規定大小的BlockingQueue,其構造函數必須帶一個int參數來指明其大小.其所含的對象是以FIFO(先入先出)順序排序的. 
        2)LinkedBlockingQueue:大小不定的BlockingQueue,若其構造函數帶一個規定大小的參數,生成的 BlockingQueue有大小限制,若不帶大小參數,所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定.其所含 的對象是以FIFO(先入先出)順序排序的 
        3)PriorityBlockingQueue:類似於LinkedBlockQueue,但其所含對象的排序不是FIFO,而是依據對象的自然排序順序或者是構造函數的Comparator決定的順序. 
        4)SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的. 
4.LinkedBlockingQueue和ArrayBlockingQueue比較起來,它們背後所用的數據結構不一樣,導致 LinkedBlockingQueue的數據吞吐量要大於ArrayBlockingQueue,但在線程數量很大時其性能的可預見性低於 ArrayBlockingQueue.                                                                                            

簡述 ConcurrentLinkedQueue LinkedBlockingQueue 的用處和不同之處。                                                                                                                  答案:
1.由於LinkedBlockingQueue實現是線程安全的,實現了先進先出等特性,是作爲生產者消費者的首選,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的話,默認最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在隊列滿的時候會阻塞直到有隊列成員被消費,take方法在隊列空的時候會阻塞,直到有隊列成員被放進來。
2.LinkedBlockingQueue是一個線程安全的阻塞隊列,它實現了BlockingQueue接口,BlockingQueue接口繼承自java.util.Queue接口,並在這個接口的基礎上增加了take和put方法,這兩個方法正是隊列操作的阻塞版本。
3.ConcurrentLinkedQueue是無阻塞的隊列,可伸縮性比BlockingQueue高。ConcurrentLinkedQueue是Queue的一個安全實現.Queue中元素按FIFO原則進行排序.採用CAS操作,來保證元素的一致性。
4.兩個都是線程安全的                


ArrayList、Vector、LinkedList的存儲性能和特性

String

StringBuffer


ByteBuffer 與 StringBuffer有什麼區別


HashMap


HashMap的工作原理是什麼                                                                                                                                                                                          答案:
HashMap的底層是用hash數組和單向鏈表實現的 ,當調用put方法是,首先計算key的hashcode,定位到合適的數組索引,然後再在該索引上的單向鏈表進行循環遍歷用equals比較key是否存在,如果存在則用新的value覆蓋原值,如果沒有則插入到鏈表linkedlist的頭部。HashMap的兩個重要屬性是容量capacity和加載因子loadfactor,默認值分佈爲16和0.75,當容器中的元素個數大於 capacity*loadfactor時,容器會進行擴容resize 爲2n,在初始化Hashmap時可以對着兩個值進行修改,負載因子0.75被證明爲是性能比較好的取值,通常不會修改,那麼只有初始容量capacity會導致頻繁的擴容行爲,這是非常耗費資源的操作,所以,如果事先能估算出容器所要存儲的元素數量,最好在初始化時修改默認容量capacity,以防止頻繁的resize操作影響性能。
HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值對象。當獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然後返回值對象。HashMap使用LinkedList來解決碰撞問題,當發生碰撞了,對象將會儲存在LinkedList的下一個節點中。 HashMap在每個LinkedList節點中儲存鍵值對對象。                                                                                                                                                                                                                              

內部的數據結構是什麼

HashMap 的 table的容量如何確定?loadFactor 是什麼? 該容量如何變化?這種變化會帶來什麼問題?                                                                      答案:
HashMap使用的是懶加載,構造完HashMap對象後,只要不進行put 方法插入元素之前,HashMap並不會去初始化或者擴容table。這個問題可以跟蹤一下HashMap的源碼就知道了,根據輸入的初始化容量(門檻?)的值(先了解HashMap中容量和負載因子的概念,其實這個和HashMap確定存儲地址的算法有關),先判斷是否大於最大容量,最大容量2的30次方,1<<30 =(1073741824),如果大於此數,初始化容量賦值爲1<<30,如果小於此數,調用tableSizeFor方法 使用位運算將初始化容量修改爲2的次方數,都是向大的方向運算,比如輸入13,小於2的4次方,那面計算出來桶的初始容量就是16.                                                                                                                                                                                             

HashMap 實現的數據結構是什麼?如何實現

HashMap 和 HashTable、ConcurrentHashMap 的區別

HashMap的遍歷方式及效率

HashMap、LinkedMap、TreeMap的區別                                                                                                                                                                     Hashmap 是一個最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數據的順序是完全隨機的。HashMap最多隻允許一條記錄的鍵爲Null;允許多條記錄的值爲 Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數據的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
Hashtable與 HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或者值爲空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢。
LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以在構造時用帶參數,按照應用次數排序。在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比LinkedHashMap慢,因爲LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。
TreeMap實現SortMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。
一般情況下,我們用的最多的是HashMap,HashMap裏面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。
LinkedHashMap 是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那麼用LinkedHashMap可以實現,它還可以按讀取順序來排列,像連接池中可以應用。
TreeMap取出來的是排序後的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。                                                              

如何決定選用HashMap還是TreeMap

如果HashMap的大小超過了負載因子(load factor)定義的容量,怎麼辦

HashMap 是線程安全的嗎?併發下使用的 Map 是什麼,它們內部原理分別是什麼,比如存儲方式、 hashcode、擴容、 默認容量等


HashSet


HashSet和TreeSet有什麼區別                                                                                                                                                                                      答案:1、TreeSet 是二叉樹實現的,Treeset中的數據是自動排好序的,不允許放入null值。 TreeSet是SortedSet接口的唯一實現類,向TreeSet中加入的應該是同一個類的對象。
2、HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重複,就如數據庫中唯一約束。 
3、HashSet要求放入的對象必須實現HashCode()方法,放入的對象,是以hashcode碼作爲標識的,而具有相同內容的 String對象,hashcode是一樣,所以放入的內容不能重複。但是同一個類的對象可以放入不同的實例 。                                                                                                       

HashSet 內部是如何工作的                                                                                                                                                                                          答案:HashSet 的實現其實非常簡單,它只是封裝了一個 HashMap 對象來存儲所有的集合元素,所有放入 HashSet 中的集合元素實際上由 HashMap 的 key 來保存,而 HashMap 的 value 則存儲了一個 PRESENT,它是一個靜態的 Object 對象。                                                          

WeakHashMap 是怎麼工作的?                                                                                                                                                                                   答案:WeakHashMap當系統內存不足時,垃圾收集器會自動的清除沒有在任何其他地方被引用的鍵值對,因此可以作爲簡單緩存表的解決方案。而HashMap就沒有上述功能。但是,如果WeakHashMap的key在系統內持有強引用,那麼WeakHashMap就退化爲了HashMap,所有的表項都不會被垃圾回收器回收。但是在WeakHashMap中會刪除那些已經被GC的鍵值對在源碼中是通過調用expungeStaleEntries函數來完成的,而這個函數只在WeakHashMap的put、get、size()等方法中才進行了調用。


Set


Set 裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用 == 還是 equals()? 它們有何區別?                                                               答案:當使用HashSet時,hashCode方法就會得到調用,判斷已經存儲在集合中的對象的hash code值是否與增加的對象的hash code值一致:
1. 如果不一致,直接加進去;
2. 如果一致,再進行equals方法的比較,equals如果返回true,表示對象已經加進去了,就不會再增加新的對象;否則加進去。                            

TreeMap:TreeMap 是採用什麼樹實現的?TreeMap、HashMap、LindedHashMap的區別。TreeMap和TreeSet在排序時如何比較元素?Collections工具類中的sort()方法如何比較元素?                                                                                                                                                      答案:TreeSet要求存放的對象所屬的類必須實現Comparable接口,該接口提供了比較元素的compareTo()方法,當插入元素時會回調該方法比較元素的大小。TreeMap要求存放的鍵值對映射的鍵必須實現Comparable接口從而根據鍵對元素進行排序。                                                          三者區別參考文章:三者區別                                                                                                                                                                   

TreeSet:一個已經構建好的 TreeSet,怎麼完成倒排序。                                                                                                                                           答案:A:自然排序:要在自定義類中實現Comparerable<T>接口  ,並且重寫compareTo方法
B:比較器排序:在自定義類中實現Comparetor<t>接口,重寫compare方法                                                                                                              

EnumSet 是什麼                                                                                                                                                                                                        答案:Enumset是個虛類,我們只能通過它提供的靜態方法來返回Enumset的實現類的實例。使用noneOf方法創建空的EnumSet,使用EnumSet.allOf方法創建一個擁有所有枚舉類元素的EnumSet,使用EnumSet.of方法返回擁有部分元素的EnumSet,使用addAll方法,添加一個EnumSet中的所有元素到另外一個EnumSet,使用toArray方法,將EnumSet中的元素存放到數組中去


Hash算法


Hashcode 的作用

簡述一致性 Hash 算法                                                                                                                                                                                                  答案:一致性hash算法提出了在動態變化的Cache環境中,判定哈希算法好壞的四個定義:
1、平衡性(Balance)
2、單調性(Monotonicity)
3、分散性(Spread)
4、負載(Load)
普通的哈希算法(也稱硬哈希)採用簡單取模的方式,將機器進行散列,這在cache環境不變的情況下能取得讓人滿意的結果,但是當cache環境動態變化時,這種靜態取模的方式顯然就不滿足單調性的要求(當增加或減少一臺機子時,幾乎所有的存儲內容都要被重新散列到別的緩衝區中)。
一致性哈希算法的基本實現原理是將機器節點和key值都按照一樣的hash算法映射到一個0~2^32的圓環上。當有一個寫入緩存的請求到來時,計算Key值k對應的哈希值Hash(k),如果該值正好對應之前某個機器節點的Hash值,則直接寫入該機器節點,如果沒有對應的機器節點,則順時針查找下一個節點,進行寫入,如果超過2^32還沒找到對應節點,則從0開始查找(因爲是環狀結構)。                                                                          

有沒有可能 兩個不相等的對象有相同的 hashcode?當兩個對象 hashcode 相同怎麼辦?如何獲取值對象                                                                答案:有。                                                                                                                                                                                                                   可以用equal比較值。                                                                                                                                                                                                    

爲什麼在重寫 equals 方法的時候需要重寫 hashCode 方法?equals與 hashCode 的異同點在哪裏

a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係                                                                                                                                                   答案:

1、hashCode的存在主要是用於查找的快捷性,如Hashtable,HashMap等,hashCode是用來在散列存儲結構中確定對象的存儲地址的;

2、如果兩個對象相同,就是適用於equals(Java.lang.Object) 方法,那麼這兩個對象的hashCode一定要相同;

3、如果對象的equals方法被重寫,那麼對象的hashCode也儘量重寫,並且產生hashCode使用的對象,一定要和equals方法中使用的一致,否則就會違反上面提到的第2點;

4、兩個對象的hashCode相同,並不一定表示兩個對象就相同,也就是不一定適用於equals(java.lang.Object) 方法,只能夠說明這兩個對象在散列存儲結構中,如Hashtable,他們“存放在同一個籃子裏”。

再歸納一下就是hashCode是用於查找使用的,而equals是用於比較兩個對象的是否相等的。                                                                                     

hashCode() 和 equals() 方法的重要性體現在什麼地方

Object:Object有哪些公用方法?Object類hashcode,equals 設計原則? sun爲什麼這麼設計?Object類的概述                                                  答案:clone,getClass, toString, finalize, equal, hashCode,wait,notify, notifyAll                                                                                              Object類是所有Java類的祖先。每個類都使用 Object 作爲超類。所有對象(包括數組)都實現這個類的方法。                                                                                  

如何在父類中爲子類自動完成所有的 hashcode 和 equals 實現?這麼做有何優劣。

可以在 hashcode() 中使用隨機數字嗎?

答案:不可以。Java中的hashCode方法就是根據一定的規則將與對象相關的信息(比如對象的存儲地址,對象的字段等)映射成一個數值,這個數值稱作爲散列值。                                                                                                                                                

LinkedHashMap


LinkedHashMap 和 PriorityQueue 的區別是什麼                                                                                                                                                   答案:PriorityQueue 保證最高或者最低優先級的的元素總是在隊列頭部,但是 LinkedHashMap 維持的順序是元素插入的順序。當遍歷一個 PriorityQueue 時,沒有任何順序保證,但是 LinkedHashMap 課保證遍歷順序是元素插入的順序。


List


List, Set, Map三個接口,存取元素時各有什麼特點

List, Set, Map 是否繼承自 Collection 接口

遍歷一個 List 有哪些不同的方式


LinkedList


LinkedList 是單向鏈表還是雙向鏈表

LinkedList 與 ArrayList 有什麼區別

描述下 Java 中集合(Collections),接口(Interfaces),實現(Implementations)的概念。LinkedList 與 ArrayList 的區別是什麼?

插入數據時,ArrayList, LinkedList, Vector誰速度較快?


ArrayList


ArrayList 和 HashMap 的默認大小是多數                                                                                                                                                                      答案:hashMap爲16,ArrayList爲10.
但是ArrayList比較特殊,只是初始化了10個空的數組。詳情參考點擊打開鏈接                                                                                                                                                                                   

ArrayList 和 LinkedList 的區別,什麼時候用 ArrayList?

ArrayList 和 Set 的區別?

ArrayList, LinkedList, Vector的區別

ArrayList是如何實現的,ArrayList 和 LinkedList 的區別

ArrayList如何實現擴容                                                                                                                                                                                                  答案:
在JDK1.7中,如果通過無參構造的話,初始數組容量爲0,當真正對數組進行添加時,才真正分配容量。
每次按照1.5倍(位運算)的比率通過copeOf的方式擴容。 
在JKD1.6中,如果通過無參構造的話,初始數組容量爲10.每次通過copeOf的方式擴容後容量爲原來的1.5倍加1.以上就是動態擴容的原理。               

Array 和 ArrayList 有何區別?什麼時候更適合用Array

說出ArraList,Vector, LinkedList的存儲性能和特性


Map


Map, Set, List, Queue, Stack

Map 接口提供了哪些不同的集合視圖                                                                                                                                                                            答案:
Map接口在Java集合中提供三個集合視圖:
(1)Set keyset():返回map中包含的所有key的一個Set視圖。集合是受map支持的,map的變化會在集合中反映出來,反之亦然。當一個迭代器正在 遍歷一個集合時,若map被修改了(除迭代器自身的移除操作以外),迭代器的結果會變爲未定義。 
(2)Collection values():返回一個map中包含的所有value的一個Collection視圖。這個collection受map支持的,map的變化會在 collection中反映出來,反之亦然。當一個迭代器正在遍歷一個collection時,若map被修改了(除迭代器自身的移除操作以外),迭代器 的結果會變爲未定義。 
(3)Set<Map.Entry<K,V>> entrySet():返回一個map鍾包含的所有映射的一個集合視圖。這個集合受map支持的,map的變化會在collection中反映出來,反之 亦然。當一個迭代器正在遍歷一個集合時,若map被修改了(除迭代器自身的移除操作,以及對迭代器返回的entry進行setValue外),迭代器的結 果會變爲未定義。
以上集合都支持通過Iterator的Remove、Set.remove、removeAll、retainAll和clear操作進行元素 移除,從map中移除對應的映射。它不支持add和addAll操作。                                                                                                                                                                                                             

爲什麼 Map 接口不繼承 Collection 接口                                                                                                                                                                        答案:
儘管Map接口和它的實現也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map繼承Collection毫無意義,反之亦然。
如果Map繼承Collection接口,那麼元素去哪兒?Map包含key-value對,它提供抽取key或value列表集合的方法,但是它不適合“一組對象”規範。


Collections


介紹Java中的Collection FrameWork。集合類框架的基本接口有哪些

Collections類是什麼?Collection 和 Collections的區別?Collection、Map的實現

集合類框架的最佳實踐有哪些

爲什麼 Collection 不從 Cloneable 和 Serializable 接口繼承

說出幾點 Java 中使用 Collections 的最佳實踐?                                                                                                                                                           答案:
a)使用正確的集合類,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector。
b)優先使用併發集合,而不是對集合進行同步。併發集合提供更好的可擴展性。
c)使用接口代表和訪問集合,如使用List存儲 ArrayList,使用 Map 存儲 HashMap 等等。
d)使用迭代器來循環集合。
e)使用集合的時候使用泛型。                                                                                                                                                                                      

Collections 中 遺留類 (HashTable、Vector) 和 現有類的區別


什麼是 B+樹,B-樹,列出實際的使用場景。


接口


Comparator 與 Comparable 接口是幹什麼的?列出它們的區別                                                                                                                                   答案:
1,Comparable
Comparable 定義在 Person類的內部:
public class Persion implements Comparable {..比較Person的大小..},
 因爲已經實現了比較器,那麼我們的Person現在是一個可以比較大小的對象了,它的比較功能和String完全一樣,可以隨時隨地的拿來
比較大小,因爲Person現在自身就是有大小之分的。Collections.sort(personList)可以得到正確的結果。


2,Comparator
Comparator 是定義在Person的外部的, 此時我們的Person類的結構不需要有任何變化,如
public class Person{ String name; int age },
然後我們另外定義一個比較器:
public PersonComparator implements Comparator() {..比較Person的大小..},
在PersonComparator裏面實現了怎麼比較兩個Person的大小. 所以,用這種方法,當我們要對一個 personList進行排序的時候, 
我們除了了要傳遞personList過去, 還需要把PersonComparator傳遞過去,因爲怎麼比較Person的大小是在PersonComparator
裏面實現的, 如:
Collections.sort( personList , new PersonComparator() ).                     


對象


拷貝(clone)


如何實現對象克隆

深拷貝和淺拷貝區別

深拷貝和淺拷貝如何實現激活機制

寫clone()方法時,通常都有一行代碼,是什麼


比較


在比較對象時,”==” 運算符和 equals 運算有何區別

如果要重寫一個對象的equals方法,還要考慮什麼

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


構造器


構造器鏈是什麼

創建對象時構造器的調用順序


不可變對象


什麼是不可變象(immutable object)

爲什麼 Java 中的 String 是不可變的(Immutable)

如何構建不可變的類結構?關鍵點在哪裏

能創建一個包含可變對象的不可變對象嗎


如何對一組對象進行排序


方法


構造器(constructor)是否可被重寫(override)

方法可以同時即是 static 又是 synchronized 的嗎

abstract 的 method是否可同時是 static,是否可同時是 native,是否可同時是synchronized                                                                                       答案:都不可以,因爲abstract申明的方法是要求子類去實現的,abstract只是告訴你有這樣一個接口,你要去實現,至於你的具體實現可以是native和synchronized,也可以不是,抽象方法是不關心這些事的,所以寫這兩個是沒有意義的。然後,static方法是不會被覆蓋的,而abstract方法正是要子類去覆蓋它,所以也是沒有意義的。所以,總的來說,就是java語法不允許你這樣做,事實上,也沒有意義這樣做。
abstract需要重載,static爲類方法,沒有重載一說 abstract爲沒有實現的方法,native爲本機實現的方法,自相矛盾 abstract方法沒有實現,也不可能實際調用抽象方法,沒有必要synchronized修飾,當然子類可以根據需要同步該方法.所以 都不能。                                                                                      

Java支持哪種參數傳遞類型                                                                                                                                                                                           答案:Java 應用程序有且僅有的一種參數傳遞機制,即按值傳遞。
對象是按引用傳遞的;
Java 應用程序有且僅有的一種參數傳遞機制,即按值傳遞;
按值傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的一個副本;
按引用傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的內存地址,而不是值的副本。                                                                 

一個對象被當作參數傳遞到一個方法,是值傳遞還是引用傳遞                                                                                                                                       答案:是值傳遞。Java編程語言中只有由值傳遞參數的。當一個對象實例作爲一個參數被傳遞到方法中時,參數的值就是該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。                                                                                                                      

當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏到底是值傳遞還是引用傳遞

我們能否重載main()方法

如果main方法被聲明爲private會怎樣


GC


概念


GC是什麼?爲什麼要有GC

什麼時候會導致垃圾回收

GC是怎麼樣運行的

新老以及永久區是什麼

GC 有幾種方式?怎麼配置

什麼時候一個對象會被GC? 如何判斷一個對象是否存活                                                                                                                                             答案:參考文章對象是否存活                                                                                                                                                                                        

System.gc() Runtime.gc()會做什麼事情? 能保證 GC 執行嗎

垃圾回收器可以馬上回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收?                                                                                                            答案:可以。程序員可以手動執行System.gc(),通知GC運行,但是Java語言規範並不保證GC一定會執行。                                             

Minor GC 、Major GC、Young GC 與 Full GC分別在什麼時候發生                                                                                                                             答案:Minor GC
從年輕代空間(包括 Eden 和 Survivor 區域)回收內存被稱爲 Minor GC。
當 JVM 無法爲一個新的對象分配空間時會觸發 Minor GC,比如當 Eden 區滿了。所以分配率越高,越頻繁執行 Minor GC。
內存池被填滿的時候,其中的內容全部會被複制,指針會從0開始跟蹤空閒內存。Eden 和 Survivor 區進行了標記和複製操作,
取代了經典的標記、掃描、壓縮、清理操作。所以 Eden 和 Survivor 區不存在內存碎片。寫指針總是停留在所使用內存池的頂部。
執行 Minor GC 操作時,不會影響到永久代。從永久代到年輕代的引用被當成 GC roots,從年輕代到永久代的引用在標記階段被直接忽略掉。
質疑常規的認知,所有的 Minor GC 都會觸發“全世界的暫停(stop-the-world)”,停止應用程序的線程。對於大部分應用程序,停頓導致的延遲都是可以忽略不計的。
其中的真相就 是,大部分 Eden 區中的對象都能被認爲是垃圾,永遠也不會被複制到 Survivor 區或者老年代空間。如果正好相反,Eden 區大部分新生對象不符合 GC 條件,Minor GC 執行時暫停的時間將會長很多。
Major GC 是清理永久代。
Full GC 是清理整個堆空間—包括年輕代和永久代。                                                                                                                                                     

垃圾回收算法的實現原理

如果對象的引用被置爲null,垃圾收集器是否會立即釋放對象佔用的內存?                                                                                                                 答案:垃圾收集器不會立即釋放對象佔用的內存,在下一個垃圾回收週期中,這個對象將是可被回收的。                                                                

垃圾回收的最佳做法是什麼                                                                                                                                                                                           答案:1、標記-清除算法:
    首先標記出所有需要回收的對象,在標記完成後統一回收掉所有被標記的對象。標記過程中 實際上即時上面說的finaLize()的過程。主要缺點一個是效率問題。另外一個是空間問題,標記清除後會產生大量不連續的內存碎片。
2、複製算法:
   這種算法將可用內存按容量劃分爲大小相等的兩塊,每次只使用其中的一塊,當這一塊的內存用完了。就將還存活着的對象複製到另外一塊上面,然後再把已經使用過的內存空間一次清理掉。
3、標記-整理算法:
    複製收集算法在對象存活率較高時就要執行較多的複製操作,效率將會遍低。更關鍵的是,如果不想浪費50%的空間,就需要有額外的空間進行分配擔保,以對應被使用的內存中所有對象都100%存活的極端情況,所以在老年代一般不能直接選用這種算法。
標記過程仍然與標記-清除算法一樣,但是後續步驟不是直接將對可回收對象進行清理,而是讓所有存活的對象都向領一端移動,然後直接清理掉端邊界以外的內存。
4、分代收集算法:
  當代商業虛擬機的垃圾收集都採用的是“分代收集算法” ,根據對象的存活週期的不同,將內存化爲幾塊,一般是把java堆分爲新生代和老年代。這樣就可以根據各個年代的特點採用最合適的收集算法。
新生代選用複製算法,老年代使用標記-清理算法 或者 標記-整理算法。


GC收集器有哪些


垃圾回收器的基本原理是什麼?

串行(serial)收集器和吞吐量(throughput)收集器的區別是什麼

Serial 與 Parallel GC之間的不同之處

CMS 收集器 與 G1 收集器的特點與區別

CMS垃圾回收器的工作過程

JVM 中一次完整的 GC 流程是怎樣的? 對象如何晉升到老年代

吞吐量優先和響應優先的垃圾收集器選擇


GC策略


舉個實際的場景,選擇一個GC策略

JVM的永久代中會發生垃圾回收嗎


收集方法


標記清除、標記整理、複製算法的原理與特點?分別用在什麼地方

如果讓你優化收集方法,有什麼思路


JVM


參數


說說你知道的幾種主要的jvm 參數                                                                                                                                                                                 答案:參考幾個文章(JVM重要參數配置)       點擊打開鏈接                   點擊打開鏈接           點擊打開鏈接                                                           

-XX:+UseCompressedOops 有什麼作用


類加載器(ClassLoader)


Java 類加載器都有哪些                                                                                                                                                                                                 答案:1)Bootstrap ClassLoader
負責加載$JAVA_HOME中jre/lib/rt.jar裏所有的class,由C++實現,不是ClassLoader子類
2)Extension ClassLoader
負責加載java平臺中擴展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包
3)App ClassLoader
負責記載classpath中指定的jar包及目錄中class
4)Custom ClassLoader
屬於應用程序根據自身需要自定義的ClassLoader,如tomcat、jboss都會根據j2ee規範自行實現ClassLoader
加載過程中會先檢查類是否被已加載,檢查順序是自底向上,從Custom ClassLoader到BootStrap ClassLoader逐層檢查,只要某個classloader已加載就視爲已加載此類,保證此類只所有ClassLoader加載一次。而加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類。                          

JVM如何加載字節碼文件                                                                                                                                                                                               答案:JVM主要完成三件事:
1、通過一個類的全限定名(包名與類名)來獲取定義此類的二進制字節流(Class文件)。而獲取的方式,可以通過jar包、war包、網絡中獲取、JSP文件生成等方式。
2、將這個字節流所代表的靜態存儲結構轉化爲方法區的運行時數據結構。這裏只是轉化了數據結構,並未合併數據。(方法區就是用來存放已被加載的類信息,常量,靜態變量,編譯後的代碼的運行時內存區域)
3、在內存中生成一個代表這個類的java.lang.Class對象,作爲方法區這個類的各種數據的訪問入口。這個Class對象並沒有規定是在Java堆內存中,它比較特殊,雖爲對象,但存放在方法區中。


內存管理


JVM內存分哪幾個區,每個區的作用是什麼

一個對象從創建到銷燬都是怎麼在這些部分裏存活和轉移的

解釋內存中的棧(stack)、堆(heap)和方法區(method area)的用法

JVM中哪個參數是用來控制線程的棧堆棧小

簡述內存分配與回收策略

簡述重排序,內存屏障,happen-before,主內存,工作內存

Java中存在內存泄漏問題嗎?請舉例說明

簡述 Java 中軟引用(SoftReferenc)、弱引用(WeakReference)和虛引用


內存映射緩存區是什麼


jstack,jstat,jmap,jconsole怎麼用

32 位 JVM 和 64 位 JVM 的最大堆內存分別是多數?32 位和 64 位的 JVM,int 類型變量的長度是多數?

怎樣通過 Java 程序來判斷 JVM 是 32 位 還是 64 位

JVM自身會維護緩存嗎?是不是在堆中進行對象分配,操作系統的堆還是JVM自己管理堆

什麼情況下會發生棧內存溢出

雙親委派模型是什麼


多線程


基本概念


什麼是線程

多線程的優點


多線程的幾種實現方式

用 Runnable 還是 Thread


什麼是線程安全


Vector, SimpleDateFormat 是線程安全類嗎

什麼 Java 原型不是線程安全的

哪些集合類是線程安全的


多線程中的忙循環是什麼

如何創建一個線程

編寫多線程程序有幾種實現方式

什麼是線程局部變量

線程和進程有什麼區別?進程間如何通訊,線程間如何通訊

什麼是多線程環境下的僞共享(false sharing)

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


Current


ConcurrentHashMap 和 Hashtable的區別

ArrayBlockingQueue, CountDownLatch的用法

ConcurrentHashMap的併發度是什麼


CyclicBarrier 和 CountDownLatch有什麼不同?各自的內部原理和用法是什麼

Semaphore的用法

Thread


啓動一個線程是調用 run() 還是 start() 方法?start() 和 run() 方法有什麼區別

調用start()方法時會執行run()方法,爲什麼不能直接調用run()方法

sleep() 方法和對象的 wait() 方法都可以讓線程暫停執行,它們有什麼區別

yield方法有什麼作用?sleep() 方法和 yield() 方法有什麼區別

Java 中如何停止一個線程

stop() 和 suspend() 方法爲何不推薦使用

如何在兩個線程間共享數據

如何強制啓動一個線程

如何讓正在運行的線程暫停一段時間

什麼是線程組,爲什麼在Java中不推薦使用

你是如何調用 wait(方法的)?使用 if 塊還是循環?爲什麼


生命週期


有哪些不同的線程生命週期

線程狀態,BLOCKED 和 WAITING 有什麼區別

畫一個線程的生命週期狀態圖


ThreadLocal 用途是什麼,原理是什麼,用的時候要注意什麼

ThreadPool


線程池是什麼?爲什麼要使用它

如何創建一個Java線程池

ThreadPool用法與優勢

提交任務時,線程池隊列已滿時會發會生什麼

newCache 和 newFixed 有什麼區別?簡述原理。構造函數的各個參數的含義是什麼,比如 coreSize, maxsize 等

線程池的實現策略

線程池的關閉方式有幾種,各自的區別是什麼

線程池中submit() 和 execute()方法有什麼區別?


線程調度


Java中用到的線程調度算法是什麼

什麼是多線程中的上下文切換

你對線程優先級的理解是什麼

什麼是線程調度器 (Thread Scheduler) 和時間分片 (Time Slicing)


線程同步


請說出你所知的線程同步的方法

synchronized 的原理是什麼

synchronized 和 ReentrantLock 有什麼不同

什麼場景下可以使用 volatile 替換 synchronized

有T1,T2,T3三個線程,怎麼確保它們按順序執行?怎樣保證T2在T1執行完後執行,T3在T2執行完後執行

同步塊內的線程拋出異常會發生什麼

當一個線程進入一個對象的 synchronized 方法A 之後,其它線程是否可進入此對象的 synchronized 方法B

使用 synchronized 修飾靜態方法和非靜態方法有什麼區別

如何從給定集合那裏創建一個 synchronized 的集合




Java Concurrency API 中 的 Lock 接口是什麼?對比同步它有什麼優勢

Lock 與 Synchronized 的區別?Lock 接口比 synchronized 塊的優勢是什麼

ReadWriteLock是什麼?

鎖機制有什麼用

什麼是樂觀鎖(Optimistic Locking)?如何實現樂觀鎖?如何避免ABA問題

解釋以下名詞:重排序,自旋鎖,偏向鎖,輕量級鎖,可重入鎖,公平鎖,非公平鎖,樂觀鎖,悲觀鎖       答案查看文章

什麼時候應該使用可重入鎖

簡述鎖的等級方法鎖、對象鎖、類鎖                                                                                                                                                                         答案:
對象鎖(方法鎖),是針對一個對象的,它只在該對象的某個內存位置聲明一個標識該對象是否擁有鎖,所有它只會鎖住當前的對象,一般一個對象鎖是對一個非靜態成員變量進行synchronized修飾,或者對一個非靜態成員方法進行synchronized進行修飾,對於對象鎖,不同對象訪問同一個被synchronized修飾的方法的時候不會阻塞
java的內置鎖:每個java對象都可以用做一個實現同步的鎖,這些鎖成爲內置鎖。線程進入同步代碼塊或方法的時候會自動獲得該鎖,在退出同步代碼塊或方法時會釋放該鎖。獲得內置鎖的唯一途徑就是進入這個鎖的保護的同步代碼塊或方法。
java內置鎖是一個互斥鎖,這就是意味着最多隻有一個線程能夠獲得該鎖,當線程A嘗試去獲得線程B持有的內置鎖時,線程A必須等待或者阻塞,知道線程B釋放這個鎖,如果B線程不釋放這個鎖,那麼A線程將永遠等待下去。
java的對象鎖和類鎖:java的對象鎖和類鎖在鎖的概念上基本上和內置鎖是一致的,但是,兩個鎖實際是有很大的區別的,對象鎖是用於對象實例方法,或者一個對象實例上的,類鎖是用於類的靜態方法或者一個類的class對象上的。我們知道,類的對象實例可以有很多個,但是每個類只有一個class對象,所以不同對象實例的對象鎖是互不干擾的,但是每個類只有一個類鎖。但是有一點必須注意的是,其實類鎖只是一個概念上的東西,並不是真實存在的,它只是用來幫助我們理解鎖定實例方法和靜態方法的區別的
上面已經對鎖的一些概念有了一點了解,下面探討synchronized關鍵字的用法。
synchronized的用法:synchronized修飾方法和synchronized修飾代碼塊。
其實,類鎖修飾方法和代碼塊的效果和對象鎖是一樣的,因爲類鎖只是一個抽象出來的概念,只是爲了區別靜態方法的特點,因爲靜態方法是所有對象實例共用的,所以對應着synchronized修飾的靜態方法的鎖也是唯一的,所以抽象出來個類鎖。其實這裏的重點在下面這塊代碼,synchronized同時修飾靜態和非靜態方法
synchronized的缺陷:當某個線程進入同步方法獲得對象鎖,那麼其他線程訪問這裏對象的同步方法時,必須等待或者阻塞,這對高併發的系統是致命的,這很容易導致系統的崩潰。如果某個線程在同步方法裏面發生了死循環,那麼它就永遠不會釋放這個對象鎖,那麼其他線程就要永遠的等待。這是一個致命的問題。
一個類的對象鎖和另一個類的對象鎖是沒有關聯的,當一個線程獲得A類的對象鎖時,它同時也可以獲得B類的對象鎖。


 

Java中活鎖和死鎖有什麼區別?

什麼是死鎖(Deadlock)?導致線程死鎖的原因?如何確保 N 個線程可以訪問 N 個資源同時又不導致死鎖

死鎖與活鎖的區別,死鎖與飢餓的區別 答案:死鎖:是指兩個或兩個以上的進程(或線程)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。死鎖發生的四個條件
1、互斥條件:線程對資源的訪問是排他性的,如果一個線程對佔用了某資源,那麼其他線程必須處於等待狀態,直到資源被釋放。
2、請求和保持條件:線程T1至少已經保持了一個資源R1佔用,但又提出對另一個資源R2請求,而此時,資源R2被其他線程T2佔用,於是該線程T1也必須等待,但又對自己保持的資源R1不釋放。
3、不剝奪條件:線程已獲得的資源,在未使用完之前,不能被其他線程剝奪,只能在使用完以後由自己釋放。
4、環路等待條件:在死鎖發生時,必然存在一個“進程-資源環形鏈”,即:{p0,p1,p2,...pn},進程p0(或線程)等待p1佔用的資源,p1等待p2佔用的資源,pn等待p0佔用的資源。(最直觀的理解是,p0等待p1佔用的資源,而p1而在等待p0佔用的資源,於是兩個進程就相互等待)
活鎖:是指線程1可以使用資源,但它很禮貌,讓其他線程先使用資源,線程2也可以使用資源,但它很紳士,也讓其他線程先使用資源。這樣你讓我,我讓你,最後兩個線程都無法使用資源。
飢餓:是指如果線程T1佔用了資源R,線程T2又請求封鎖R,於是T2等待。T3也請求資源R,當T1釋放了R上的封鎖後,系統首先批准了T3的請求,T2仍然等待。然後T4又請求封鎖R,當T3釋放了R上的封鎖之後,系統又批准了T4的請求......,T2可能永遠等待。


怎麼檢測一個線程是否擁有鎖

如何實現分佈式鎖

有哪些無鎖數據結構,他們實現的原理是什麼


讀寫鎖可以用於什麼應用場景


Executors類是什麼? Executor和Executors的區別                    答案:
Executor 和 ExecutorService 這兩個接口主要的區別是:ExecutorService 接口繼承了 Executor 接口,是 Executor 的子接口
Executor 和 ExecutorService 第二個區別是:Executor 接口定義了 execute()方法用來接收一個Runnable接口的對象,而 ExecutorService 接口中的 submit()方法可以接受Runnable和Callable接口的對象。
Executor 和 ExecutorService 接口第三個區別是 Executor 中的 execute() 方法不返回任何結果,而 ExecutorService 中的 submit()方法可以通過一個 Future 對象返回運算結果。
Executor 和 ExecutorService 接口第四個區別是除了允許客戶端提交一個任務,ExecutorService 還提供用來控制線程池的方法。比如:調用 shutDown() 方法終止線程池。可以通過 《Java Concurrency in Practice》 一書瞭解更多關於關閉線程池和如何處理 pending 的任務的知識。
Executors 類提供工廠方法用來創建不同類型的線程池。比如: newSingleThreadExecutor() 創建一個只有一個線程的線程池,newFixedThreadPool(int numOfThreads)來創建固定線程數的線程池,newCachedThreadPool()可以根據需要創建新的線程,但如果已有線程是空閒的會重用已有線程。

什麼是Java線程轉儲(Thread Dump),如何得到它              答案:線程轉儲是一個JVM活動線程的列表,它對於分析系統瓶頸和死鎖非常有用。有很多方法可以獲取線程轉儲——使用Profiler,Kill-3命令,jstack工具等等。有的更喜歡jstack工具,因爲它容易使用並且是JDK自帶的。由於它是一個基於終端的工具,所以可以編寫一些腳本去定時的產生線程轉儲以待分析。                                                            

如何在Java中獲取線程堆棧                                                                                                     

說出 3 條在 Java 中使用線程的最佳實踐

在線程中你怎麼處理不可捕捉異常                                                                                                                                                                             答案:爲了保證主線程不被阻塞,線程之間基本相互隔離,所以線程之間不論是異常還是通信都不共享。當然,因爲你抓異常是主線程,而異常是在子線程出現,可以用thread.setUncaughtExceptionHandler()去處理線程的異常。在Thread中,Java提供了一個setUncaughtExceptionHandler的方法來設置線程的異常處理函數,你可以把異常處理函數傳進去,當發生線程的未捕獲異常的時候,由JVM來回調執行。類似的功能就可以組成線程池自己的異常處理機制,正常來說,你想在主線程異步執行子線程的代碼並得知是否執行成功,可以直接使用Promise模式,即Java中線程池返回的Future對象。                                                                                                                                                

實際項目中使用多線程舉例。你在多線程環境中遇到的常見的問題是什麼?你是怎麼解決它的

請說出與線程同步以及線程調度相關的方法

程序中有3個 socket,需要多少個線程來處理

假如有一個第三方接口,有很多個線程去調用獲取數據,現在規定每秒鐘最多有 10 個線程同時調用它,如何做到

如何在 Windows 和 Linux 上查找哪個線程使用的 CPU 時間最長

如何確保 main() 方法所在的線程是 Java 程序最後結束的線程

非常多個線程(可能是不同機器),相互之間需要等待協調才能完成某種工作,問怎麼設計這種協調方案

你需要實現一個高效的緩存,它允許多個用戶讀,但只允許一個用戶寫,以此來保持它的完整性,你會怎樣去實現它


異常


基本概念


Error 和 Exception有什麼區別

UnsupportedOperationException是什麼

NullPointerException 和 ArrayIndexOutOfBoundException 之間有什麼相同之處


什麼是受檢查的異常,什麼是運行時異常                                                                                                                                                                      答案:
Java提供了兩類主要的異常 :runtime exception和checked exception。 checked異常也就是我們經常遇到的IO異常,以及SQL異常都是這種異常。 對於這種異常, JAVA編譯器強制要求我們必需對出現的這些異常進行catch 。所以,面對這種異常不管我們是否願意,只能自己去寫一大堆catch塊去處理可能的異常。 這類異常一般是外部錯誤,例如試圖從文件尾後讀取數據等,這並不是程序本身的錯誤,而是在應用環境中出現的外部錯誤. 但是另外一種異常: runtime exception ,也稱運行時異常,我們可以不處理。當出現這樣的異常時,總是由虛擬機接管。比如:我們從來沒有人去處理過 NullPointerException 異常,它就是運行時異常,並且這種異常還是最常見的異常之一。                                                                                

運行時異常與一般異常有何異同

簡述一個你最常見到的runtime exception(運行時異常)


finally


finally關鍵詞在異常處理中如何使用

如果執行finally代碼塊之前方法返回了結果,或者JVM退出了,finally塊中的代碼還會執行嗎

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

在什麼情況下,finally語句不會執行


throw 和 throws 有什麼區別?

OOM你遇到過哪些情況?你是怎麼搞定的?

SOF你遇到過哪些情況?

既然我們可以用RuntimeException來處理錯誤,那麼你認爲爲什麼Java中還存在檢查型異常

當自己創建異常類的時候應該注意什麼

導致空指針異常的原因

異常處理 handle or declare 原則應該如何理解

怎麼利用 JUnit 來測試一個方法的異常

catch塊裏別不寫代碼有什麼問題

你曾經自定義實現過異常嗎?怎麼寫的

什麼是 異常鏈

在try塊中可以拋出異常嗎


JDBC


通過 JDBC 連接數據庫有哪幾種方式

闡述 JDBC 操作數據庫的基本步驟

JDBC 中如何進行事務處理

什麼是 JdbcTemplate

什麼是 DAO 模塊

使用 JDBC 操作數據庫時,如何提升讀取數據的性能?如何提升更新數據的性能

列出 5 個應該遵循的 JDBC 最佳實踐


IO


File


File類型中定義了什麼方法來創建一級目錄

File類型中定義了什麼方法來判斷一個文件是否存在




爲了提高讀寫性能,可以採用什麼流

Java中有幾種類型的流

JDK 爲每種類型的流提供了一些抽象類以供繼承,分別是哪些類

對文本文件操作用什麼I/O流

對各種基本數據類型和String類型的讀寫,採用什麼流

能指定字符編碼的 I/O 流類型是什麼


序列化


什麼是序列化?如何實現 Java 序列化及注意事項

Serializable 與 Externalizable 的區別


Socket


socket 選項 TCP NO DELAY 是指什麼

Socket 工作在 TCP/IP 協議棧是哪一層

TCP、UDP 區別及 Java 實現方式


說幾點 IO 的最佳實踐

直接緩衝區與非直接緩衝器有什麼區別?

怎麼讀寫 ByteBuffer?ByteBuffer 中的字節序是什麼

當用System.in.read(buffer)從鍵盤輸入一行n個字符後,存儲在緩衝區buffer中的字節數是多少

如何使用掃描器類(Scanner Class)令牌化



面向對象編程(OOP)


解釋下多態性(polymorphism),封裝性(encapsulation),內聚(cohesion)以及耦合(coupling)

多態的實現原理

封裝、繼承和多態是什麼

對象封裝的原則是什麼?



獲得一個類的類對象有哪些方式

重載(Overload)和重寫(Override)的區別。重載的方法能否根據返回類型進行區分?

說出幾條 Java 中方法重載的最佳實踐


抽象類

抽象類和接口的區別

抽象類中是否可以有靜態的main方法

抽象類是否可實現(implements)接口

抽象類是否可繼承具體類(concrete class)


匿名類(Anonymous Inner Class)

匿名內部類是否可以繼承其它類?是否可以實現接口


內部類

內部類分爲幾種

內部類可以引用它的包含類(外部類)的成員嗎

請說一下 Java 中爲什麼要引入內部類?還有匿名內部類


繼承

繼承(Inheritance)與聚合(Aggregation)的區別在哪裏

繼承和組合之間有什麼不同

爲什麼類只能單繼承,接口可以多繼承

存在兩個類,B 繼承 A,C 繼承 B,能將 B 轉換爲 C 麼?如 C = (C) B

如果類 a 繼承類 b,實現接口c,而類 b 和接口 c 中定義了同名變量,請問會出現什麼問題


接口

接口是什麼

接口是否可繼承接口

爲什麼要使用接口而不是直接使用具體類?接口有什麼優點


泛型


泛型的存在是用來解決什麼問題

泛型的常用特點

List能否轉爲List


工具類


日曆


Calendar Class的用途

如何在Java中獲取日曆類的實例

解釋一些日曆類中的重要方法

GregorianCalendar 類是什麼

SimpleTimeZone 類是什麼

Locale類是什麼

如何格式化日期對象

如何添加小時(hour)到一個日期對象(Date Objects)

如何將字符串 YYYYMMDD 轉換爲日期


Math


Math.round()什麼作用?Math.round(11.5) 等於多少?Math.round(-11.5)等於多少?


XML


XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式?DOM 和 SAX 解析器有什麼不同?

Java解析XML的方式

用 jdom 解析 xml 文件時如何解決中文問題?如何解析

你在項目中用到了 XML 技術的哪些方面?如何實現


動態代理


描述動態代理的幾種實現方式,分別說出相應的優缺點


設計模式


什麼是設計模式(Design Patterns)?你用過哪種設計模式?用在什麼場合

你知道哪些商業級設計模式?

哪些設計模式可以增加系統的可擴展性


單例模式

除了單例模式,你在生產環境中還用過什麼設計模式?

寫 Singleton 單例模式

單例模式的雙檢鎖是什麼

如何創建線程安全的 Singleton

什麼是類的單例模式

寫出三種單例模式實現


適配器模式

適配器模式是什麼?什麼時候使用

適配器模式和代理模式之前有什麼不同

適配器模式和裝飾器模式有什麼區別


什麼時候使用享元模式

什麼時候使用組合模式

什麼時候使用訪問者模式

什麼是模板方法模式

請給出1個符合開閉原則的設計模式的例子


開放問題


用一句話概括 Web 編程的特點

Google是如何在一秒內把搜索結果返回給用戶

哪種依賴注入方式你建議使用,構造器注入,還是 Setter方法注入

樹(二叉或其他)形成許多普通數據結構的基礎。請描述一些這樣的數據結構以及何時可以使用它們

某一項功能如何設計

線上系統突然變得異常緩慢,你如何查找問題

什麼樣的項目不適合用框架

新浪微博是如何實現把微博推給訂閱者

簡要介紹下從瀏覽器輸入 URL 開始到獲取到請求界面之後 Java Web 應用中發生了什麼

請你談談SSH整合

高併發下,如何做到安全的修改同一行數據

12306網站的訂票系統如何實現,如何保證不會票不被超賣

網站性能優化如何優化的

聊了下曾經參與設計的服務器架構

請思考一個方案,實現分佈式環境下的 countDownLatch

請思考一個方案,設計一個可以控制緩存總體大小的自動適應的本地緩存

在你的職業生涯中,算得上最困難的技術挑戰是什麼

如何寫一篇設計文檔,目錄是什麼

大寫的O是什麼?舉幾個例子

編程中自己都怎麼考慮一些設計原則的,比如開閉原則,以及在工作中的應用

解釋一下網絡應用的模式及其特點

設計一個在線文檔系統,文檔可以被編輯,如何防止多人同時對同一份文檔進行編輯更新

說出數據連接池的工作機制是什麼

怎麼獲取一個文件中單詞出現的最高頻率

描述一下你最常用的編程風格

如果有機會重新設計你們的產品,你會怎麼做

如何搭建一個高可用系統

如何啓動時不需輸入用戶名與密碼

如何在基於Java的Web項目中實現文件上傳和下載

如何實現一個秒殺系統,保證只有幾位用戶能買到某件商品。

如何實現負載均衡,有哪些算法可以實現

如何設計一個購物車?想想淘寶的購物車如何實現的

如何設計一套高併發支付方案,架構如何設計

如何設計建立和保持 100w 的長連接

如何避免瀏覽器緩存。

如何防止緩存雪崩

如果AB兩個系統互相依賴,如何解除依

如果有人惡意創建非法連接,怎麼解決

如果有幾十億的白名單,每天白天需要高併發查詢,晚上需要更新一次,如何設計這個功能

如果系統要使用超大整數(超過long長度範圍),請你設計一個數據結構來存儲這種超大型數字以及設計一種算法來實現超大整數加法運算)

如果要設計一個圖形系統,請你設計基本的圖形元件(Point,Line,Rectangle,Triangle)的簡單實現

如果讓你實現一個併發安全的鏈表,你會怎麼做

應用服務器與WEB 服務器的區別?應用服務器怎麼監控性能,各種方式的區別?你使用過的應用服務器優化技術有哪些

大型網站在架構上應當考慮哪些問題

有沒有處理過線上問題?出現內存泄露,CPU利用率標高,應用無響應時如何處理的

最近看什麼書,印象最深刻的是什麼

描述下常用的重構技巧

你使用什麼版本管理工具?分支(Branch)與標籤(Tag)之間的區別在哪裏

你有了解過存在哪些反模式(Anti-Patterns)嗎

你用過的網站前端優化的技術有哪些

如何分析Thread dump

你如何理解AOP中的連接點(Joinpoint)、切點(Pointcut)、增強(Advice)、引介(Introduction)、織入(Weaving)、切面(Aspect)這些概念

你是如何處理內存泄露或者棧溢出問題的

你們線上應用的 JVM 參數有哪些

怎麼提升系統的QPS和吞吐量


知識面


解釋什麼是 MESI 協議(緩存一致性)

談談 reactor 模型

Java 9 帶來了怎樣的新功能

Java 與 C++ 對比,C++ 或 Java 中的異常處理機制的簡單原理和應用

簡單講講 Tomcat 結構,以及其類加載器流程

虛擬內存是什麼

闡述下 SOLID 原則

請簡要講一下你對測試驅動開發(TDD)的認識

CDN實現原理

Maven 和 ANT 有什麼區別

UML中有哪些常用的圖


Linux

Linux 下 IO 模型有幾種,各自的含義是什麼。

Linux 系統下你關注過哪些內核參數,說說你知道的

Linux 下用一行命令查看文件的最後五行

平時用到哪些 Linux 命令

用一行命令輸出正在運行的 Java 進程

使用什麼命令來確定是否有 Tomcat 實例運行在機器上


什麼是 N+1 難題

什麼是 paxos 算法

什麼是 restful,講講你理解的 restful

什麼是 zab 協議

什麼是領域模型(domain model)?貧血模型(anaemic domain model) 和充血模型(rich domain model)有什麼區別

什麼是領域驅動開發(Domain Driven Development)

介紹一下了解的 Java 領域的 Web Service 框架

Web Server、Web Container 與 Application Server 的區別是什麼

微服務(MicroServices)與巨石型應用(Monolithic Applications)之間的區別在哪裏

描述 Cookie 和 Session 的作用,區別和各自的應用範圍,Session工作原理

你常用的持續集成(Continuous Integration)、靜態代碼分析(Static Code Analysis)工具有哪些

簡述下數據庫正則化(Normalizations)

KISS,DRY,YAGNI 等原則是什麼含義

分佈式事務的原理,優缺點,如何使用分佈式事務?

布式集羣下如何做到唯一序列號


網絡

HTTPS 的加密方式是什麼,講講整個加密解密流程

HTTPS和HTTP的區別

HTTP連接池實現原理

HTTP集羣方案

Nginx、lighttpd、Apache三大主流 Web服務器的區別


是否看過框架的一些代碼

持久層設計要考慮的問題有哪些?你用過的持久層框架有哪些

數值提升是什麼

你能解釋一下里氏替換原則嗎

你是如何測試一個應用的?知道哪些測試框架

傳輸層常見編程協議有哪些?並說出各自的特點


編程題


計算加班費


加班10小時以下加班費是時薪的1.5倍。加班10小時或以上,按4元/時算。提示:(一個月工作26天,一天正常工作8小時)


計算1000月薪,加班9小時的加班費

計算2500月薪,加班11小時的加班費

計算1000月薪,加班15小時的加班費


賣東西


一家商場有紅蘋果和青蘋果出售。(紅蘋果5元/個,青蘋果4元/個)。


模擬一個進貨。紅蘋果跟青蘋果各進200個。

模擬一個出售。紅蘋果跟青蘋果各買出10個。每賣出一個蘋果需要進行統計。


提示:一個蘋果是一個單獨的實體。


日期提取


有這樣一個時間字符串:2008-8-8 20:08:08 , 請編寫能夠匹配它的正則表達式,並編寫Java代碼將日期後面的時分秒提取出來,即:20:08:08


線程


8設計4個線程,其中兩個線程每次對j增加1,另外兩個線程對j每次減少1。寫出程序。

用Java寫一個多線程程序,如寫四個線程,二個加1,二個對一個變量減一,輸出

wait-notify 寫一段代碼來解決生產者-消費者問題


數字


判斷101-200之間有多少個素數,並輸出所有素數

用最有效率的方法算出2乘以17等於多少

有 1 億個數字,其中有 2 個是重複的,快速找到它,時間和空間要最優

2 億個隨機生成的無序整數,找出中間大小的值

10 億個數字裏裏面找最小的 10 個

1到1億的自然數,求所有數的拆分後的數字之和,如286 拆分成2、8、6,如1到11拆分後的數字之和 => 1 + … + 9 + 1 + 0 + 1 + 1

一個數如果恰好等於它的因子之和,這個數就稱爲 “完數 “。例如6=1+2+3.編程 找出1000以內的所有完數

一個數組中所有的元素都出現了三次,只有一個元素出現了一次找到這個元素

一球從100米高度自由落下,每次落地後反跳回原高度的一半;再落下,求它在 第10次落地時,共經過多少米?第10次反彈多高?

求100-1000內質數的和

求1到100的和的平均數

求s=a+a+aaa+aaaa+aa…a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。 求出1到100的和


算出1到40的質數,放進數組裏

顯示放組裏的數

找出第[5]個數

刪除第[9]個數,再顯示刪除後的第[9]個


有 3n+1 個數字,其中 3n 箇中是重複的,只有 1 個是不重複的,怎麼找出來。

有一組數1.1.2.3.5.8.13.21.34。寫出程序隨便輸入一個數就能給出和前一組數字同規律的頭5個數

計算指定數字的階乘

開發 Fizz Buzz

給定一個包含 N 個整數的數組,找出丟失的整數

一個排好序的數組,找出兩數之和爲m的所有組合

將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。

打印出所有的 “水仙花數 “,所謂 “水仙花數 “是指一個三位數,其各位數字立方和等於該數本身。例如:153是一個 “水仙花數 “,因爲153=1的三次方+5的三次方+3的三次方

原地交換兩個變量的值

找出4字節整數的中位數

找到整數的平方根

實現斐波那契


網絡


用Java Socket編程,讀服務器幾個字符,再寫入本地顯示


反射


反射機制提供了什麼功能?

反射是如何實現的

哪裏用到反射機制

反射中 Class.forName 和 ClassLoader 區別

反射創建類實例的三種方式是什麼

如何通過反射調用對象的方法

如何通過反射獲取和設置對象私有字段的值

反射機制的優缺點


數據庫


寫一段 JDBC 連Oracle的程序,並實現數據查詢


算法


50個人圍坐一圈,當數到三或者三的倍數出圈,問剩下的人是誰,原來的位置是多少

實現一個電梯模擬器用

寫一個冒泡排序

寫一個折半查找

隨機產生20個不能重複的字符並排序

寫一個函數,傳入 2 個有序的整數數組,返回一個有序的整數數組

寫一段代碼在遍歷 ArrayList 時移除一個元素

古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第四個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數爲多少

約瑟芬環遊戲


正則


請編寫一段匹配IP地址的正則表達式

寫出一個正則表達式來判斷一個字符串是否是一個數字


字符串


寫一個方法,入一個文件名和一個字符串,統計這個字符串在這個文件中出現的次數。

寫一個程序找出所有字符串的組合,並檢查它們是否是迴文串

寫一個字符串反轉函數,輸入abcde轉換成edcba代碼

小遊戲,倒轉句子中的單詞

將GB2312編碼的字符串轉換爲ISO-8859-1編碼的字符串

請寫一段代碼來計算給定文本內字符“A”的個數。分別用迭代和遞歸兩種方式

編寫一個截取字符串的函數,輸入爲一個字符串和字節數,輸出爲按字節截取的字符串。 但是要保證漢字不被截半個,如“我ABC”4,應該截爲“我AB”,輸入“我ABC漢DEF”,6,應該輸出爲“我ABC”而不是“我ABC+漢的半個”

給定 2 個包含單詞列表(每行一個)的文件,編程列出交集

打印出一個字符串的所有排列

將一個鍵盤輸入的數字轉化成中文輸出(例如:輸入1234567,輸出:一百二拾三萬四千五百六拾七)

在Web應用開發過程中經常遇到輸出某種編碼的字符,如從 GBK 到 ISO8859-1等,如何輸出一個某種編碼的字符串


日期


計算兩個日期之間的差距
--------------------- 
作者:西海棱鏡 
來源:CSDN 
原文:https://blog.csdn.net/zhanjianshinian/article/details/78763366?utm_source=copy 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章