Java面試題(一)
二、訪問修飾符 public,private,protected,以及不寫(默認)時的區別?
五、short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎?
九、解釋內存中的棧(stack)、堆(heap)和方法區(method area)的用法。
十、Math.round(11.5) 等於多少?Math.round(-11.5)等於多少?
十一、switch 是否能做用在 byte 上,是否能做用在 long 上,是否能做用在 String 上?
1三、數組有沒有 length()方法?String 有沒有 length()方法?
1四、在 Java 中,如何跳出當前的多重嵌套循環?
1五、構造器(constructor)是否可被重寫(override)?
1六、兩個對象值相同(x.equals(y) == true),但卻可有不一樣的 hashcode,這句話對不對?
1八、當一個對象被看成參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏究竟是值傳遞仍是引用傳遞?
1九、String 和 StringBuilder、StringBuffer 的區別?
20、重載(Overload)和重寫(Override)的區別。重載的方法可否根據返回類型進行區分?
2一、描述一下 JVM 加載 class 文件的原理機制?
2二、char 型變量中能不能存貯一箇中文漢字,爲何?
2三、抽象類(abstract class)和接口(interface)有什麼異同?
2四、靜態嵌套類(Static Nested Class)和內部類(Inner Class)的不一樣?
2六、抽象的(abstract)方法是否可同時是靜態的(static),是否可同時是本地方法(native),是否可同時被 synchronized 修飾?
2八、是否能夠從一個靜態(static)方法內部發出對非靜態(non-static)方法的調用?
3一、String s = new String(「xyz」);建立了幾個字符串對象?
32 、 接 口 是 否 可 繼 承 ( extends ) 接 口 ? 抽 象 類 是 否 可 實 現(implements)接口?抽象類是否可繼承具體類(concrete class)?
3三、一個」.java」源文件中是否能夠包含多個類(不是內部類)?有什麼限制?
3四、Anonymous Inner Class(匿名內部類)是否能夠繼承其它類?是否能夠實現接口?
3五、內部類能夠引用它的包含類(外部類)的成員嗎?有沒有什麼限制?
3六、Java 中的 final 關鍵字有哪些用法?
40、怎樣將 GB2312 編碼的字符串轉換爲 ISO-8859-1 編碼的字符串?
4三、比較一下 Java 和 JavaSciprt。
4五、Error 和 Exception 有什麼區別?
4六、try{}裏有一個 return 語句,那麼緊跟在這個 try 後的 finally{}裏的代碼會不會被執行,何時被執行,在 return 前仍是後?
4七、Java 語言如何進行異常處理,關鍵字:throws、throw、try、catch、finally 分別如何使用?
50、闡述 final、finally、finalize 的區別。
5一、類 ExampleA 繼承 Exception,類 ExampleB 繼承 ExampleA。
5二、List、Set、Map 是否繼承自 Collection 接口?
5三、闡述 ArrayList、Vector、LinkedList 的存儲性能和特性。
5四、Collection 和 Collections 的區別?
5五、List、Map、Set 三個接口存取元素時,各有什麼特色?
5六、TreeMap 和 TreeSet 在排序時如何比較元素?Collections 工具類中的 sort()方法如何比較元素?
5七、Thread 類的 sleep()方法和對象的 wait()方法均可以讓線程暫停執行,它們有什麼區別?
5八、線程的 sleep()方法和 yield()方法有什麼區別?
5九、當一個線程進入一個對象的 synchronized 方法 A 以後,其它線程是否可進入此對象 synchronized 方法 B?
6四、啓動一個線程是調用 run()仍是 start()方法?
6七、簡述 synchronized 和 java.util.concurrent.locks.Lock 的異同?
70、寫一個方法,輸入一個文件名和一個字符串,統計這個字符串在這個文件中出現的次數。
7一、如何用 Java 代碼列出一個目錄下全部的文件?
7二、用 Java 的套接字編程實現一個多線程的回顯(echo)服務器。
7三、XML 文檔定義有幾種形式?它們之間有何本質區別?解析 XML文檔有哪幾種方式?
7六、Statement 和 PreparedStatement 有什麼區別?哪一個性能更好?
7七、使用 JDBC 操做數據庫時,如何提高讀取數據的性能?如何提高更新數據的性能?
8二、JDBC 可否處理 Blob 和 Clob?
Java 面試題(二)
一、Java 中能建立 volatile 數組嗎?
二、volatile 能使得一個非原子操做變成原子操做嗎?
五、10 個線程和 2 個線程的同步代碼,哪一個更容易寫?
六、你是如何調用 wait()方法的?使用 if 塊仍是循環?爲何?
八、什麼是 Busy spin?咱們爲何要使用它?
九、Java 中怎麼獲取一份線程 dump 文件?
十二、用 wait-notify 寫一段代碼來解決生產者-消費者問題?
1三、用 Java 寫一個線程安全的單例模式(Singleton)?
1四、Java 中 sleep 方法和 wait 方法的區別?
1五、什麼是不可變對象(immutable object)?Java 中怎麼建立一個不可變對象?
1七、Java 中應該使用什麼數據類型來表明價格?
1九、Java 中怎樣將 bytes 轉換爲 long 類型?
20、咱們能將 int 強制轉換爲 byte 類型的變量嗎?若是該值大於byte 類型的範圍,將會出現什麼現象?
2一、存在兩個類,B 繼承 A ,C 繼承 B,咱們能將 B 轉換爲 C 麼?如 C = (C) B;
2二、哪一個類包含 clone 方法?是 Cloneable 仍是 Object?
2三、不是線程安全的操做。它涉及到多個指令,如讀取變量值,增長,而後存儲回內存,這個過程可能會出現多個線程交差。
2四、a = a + b 與 a += b 的區別
2五、我能在不進行強制轉換的狀況下將一個 double 值賦值給 long類型的變量嗎?
2六、3*0.1 == 0.3 將會返回什麼?true 仍是 false?
2七、int 和 Integer 哪一個會佔用更多的內存?
2八、爲何 Java 中的 String 是不可變的(Immutable)?
3一、64 位 JVM 中,int 的長度是多數?
3二、Serial 與 Parallel GC 之間的不一樣之處?
3三、32 位和 64 位的 JVM,int 類型變量的長度是多數?
3四、Java 中 WeakReference 與 SoftReference 的區別?
3六、JVM 選項 -XX:+UseCompressedOops 有什麼做用?爲何要使用?
3七、怎樣經過 Java 程序來判斷 JVM 是 32 位 仍是 64 位?
3八、32 位 JVM 和 64 位 JVM 的最大堆內存分別是多數?
3九、JRE、JDK、JVM 及 JIT 之間有什麼不一樣?
4二、怎麼獲取 Java 程序使用的內存?堆使用的百分比?
4四、「a==b」和」a.equals(b)」有什麼區別?
4五、a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係?
4六、final、finalize 和 finally 的不一樣之處?
4七、Java 中的編譯期常量是什麼?使用它又什麼風險?
4八、List、Set、Map 和 Queue 之間的區別(答案)
4九、poll() 方法和 remove() 方法的區別?
50、Java 中 LinkedHashMap 和 PriorityQueue 的區別是什麼?
5一、ArrayList 與 LinkedList 的不區別?
5四、Java 中的 LinkedList 是單向鏈表仍是雙向鏈表?
5五、Java 中的 TreeMap 是採用什麼樹實現的?(答案)
5六、Hashtable 與 HashMap 有什麼不一樣之處?
5七、Java 中的 HashSet,內部是如何工做的?
5八、寫一段代碼在遍歷 ArrayList 時移除一個元素?
5九、咱們能本身寫一個容器類,而後使用 for-each 循環碼?
60、ArrayList 和 HashMap 的默認大小是多數?
6一、有沒有可能兩個不相等的對象有有相同的 hashcode?
6二、兩個相同的對象會有不一樣的的 hash code 嗎?
6三、咱們能夠在 hashcode() 中使用隨機數字嗎?
6四、Java 中,Comparator 與 Comparable 有什麼不一樣?
6六、在我 Java 程序中,我有三個 socket,我須要多少個線程來處理?
6七、Java 中怎麼建立 ByteBuffer?
6八、Java 中,怎麼讀寫 ByteBuffer ?
7一、Java 中,直接緩衝區與非直接緩衝器有什麼區別?
7三、socket 選項 TCP NO DELAY 是指什麼?
7五、Java 中,ByteBuffer 與 StringBuffer 有什麼區別?(答案)
7六、Java 中,編寫多線程程序的時候你會遵循哪些最佳實踐?
7七、說出幾點 Java 中使用 Collections 的最佳實踐
7八、說出至少 5 點在 Java 中使用線程的最佳實踐。
8二、在多線程環境下,SimpleDateFormat 是線程安全的嗎?
8三、Java 中如何格式化一個日期?如格式化爲 ddMMyyyy 的形式?
8四、Java 中,怎麼在格式化的日期中顯示時區?
8五、Java 中 java.util.Date 與 java.sql.Date 有什麼區別?
8七、Java 中,如何將字符串 YYYYMMDD 轉換爲日期?
90、怎麼利用 JUnit 來測試一個方法的異常?
9一、你使用過哪一個單元測試庫來測試你的 Java 程序?
9二、@Before 和 @BeforeClass 有什麼區別?
9四、Java 中如何利用泛型寫一個 LRU 緩存?
9五、寫一段 Java 程序將 byte 轉換爲 long?
9六、在不使用 StringBuffer 的前提下,怎麼反轉一個字符串?
9七、Java 中,怎麼獲取一個文件中單詞出現的最高頻率?
9九、Java 中,怎麼打印出一個字符串的全部排列?
100、Java 中,怎樣才能打印出數組中的重複元素?
10二、在沒有使用臨時變量的狀況如何交換兩個整數變量的值?
10三、接口是什麼?爲何要使用接口而不是直接使用具體類?
10四、Java 中,抽象類與接口之間有什麼不一樣?
10五、除了單例模式,你在生產環境中還用過什麼設計模式?
10七、什麼狀況下會違反迪米特法則?爲何會有這個問題?
10九、什麼是「依賴注入」和「控制反轉」?爲何有人使用?
1十、抽象類是什麼?它與接口有什麼區別?你爲何要使用過抽象類?
1十一、構造器注入和 setter 依賴注入,那種方式更好?
120、Java 中,嵌套公共靜態類與頂級類有什麼不一樣?
12一、 OOP 中的 組合、聚合和關聯有什麼區別?
12六、你能寫出一個正則表達式來判斷一個字符串是不是一個數字嗎?
12七、Java 中,受檢查異常 和 不受檢查異常的區別?
12八、Java 中,throw 和 throws 有什麼區別
12九、Java 中,Serializable 與 Externalizable 的區別?
130、Java 中,DOM 和 SAX 解析器有什麼不一樣?
13二、說出 5 個 JDK 1.8 引入的新特性?
13三、Java 中,Maven 和 ANT 有什麼區別?
一、面向對象的特徵有哪些方面?
抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象兩方面。抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼。java
繼承:繼承是從已有類獲得繼承信息建立新類的過程。提供繼承信息的類被稱爲父類(超類、基類);獲得繼承信息的類被稱爲子類(派生類)。繼承讓變化中的軟件系統有了必定的延續性,同時繼承也是封裝程序中可變因素的重要手段(若是不能理解請閱讀閻宏博士的《Java 與模式》或《設計模式精解》中關於橋樑模式的部分)。程序員
封裝:一般認爲封裝是把數據和操做數據的方法綁定起來,對數據的訪問只能經過已定義的接口。面向對象的本質就是將現實世界描繪成一系列徹底自治、封閉的對象。咱們在類中編寫的方法就是對實現細節的一種封裝;咱們編寫一個類就是對數據和數據操做的封裝。能夠說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口(能夠想一想普通洗衣機和全自動洗衣機的差異,明顯全自動洗衣機封裝更好所以操做起來更簡單;咱們如今使用的智能手機也是封裝得足夠好的,由於幾個按鍵就搞定了全部的事情)。面試
多態性:多態性是指容許不一樣子類型的對象對同一消息做出不一樣的響應。簡單的說就是用一樣的對象引用調用一樣的方法可是作了不一樣的事情。多態性分爲編譯時的多態性和運行時的多態性。若是將對象的方法視爲對象向外界提供的服務,那麼運行時的多態性能夠解釋爲:當 A 系統訪問 B 系統提供的服務時,B系統有多種提供服務的方式,但一切對 A 系統來講都是透明的(就像電動剃鬚刀是 A 系統,它的供電系統是 B 系統,B 系統可使用電池供電或者用交流電,甚至還有多是太陽能,A 系統只會經過 B 類對象調用供電的方法,但並不知道供電系統的底層實現是什麼,究竟經過何種方式得到了動力)。方法重載(overload)實現的是編譯時的多態性(也稱爲前綁定),而方法重寫(override)實現的是運行時的多態性(也稱爲後綁定)。運行時的多態是面向對象最精髓的東西,要實現多態須要作兩件事:正則表達式
1). 方法重寫(子類繼承父類並重寫父類中已有的或抽象的方法);
2). 對象造型(用父類型引用引用子類型對象,這樣一樣的引用調用一樣的方法就會根據子類對象的不一樣而表現出不一樣的行爲)。算法
二、訪問修飾符 public,private,protected,以及不寫(默認)時的區別?
類的成員不寫訪問修飾時默認爲 default。默認對於同一個包中的其餘類至關於公開(public),對於不是同一個包中的其餘類至關於私有(private)。受保護(protected)對子類至關於公開,對不是同一包中的沒有父子關係的類至關於私有。Java 中,外部類的修飾符只能是 public 或默認,類的成員(包括內部類)的修飾符能夠是以上四種。
三、String 是最基本的數據類型嗎?
不是。Java 中的基本數據類型只有 8 個 :byte、short、int、long、float、double、char、boolean;除了基本類型(primitive type),剩下的都是引用類型(referencetype),Java 5 之後引入的枚舉類型也算是一種比較特殊的引用類型。
四、float f=3.4;是否正確?
不正確。3.4 是雙精度數,將雙精度型(double)賦值給浮點型(float)屬於下轉型(down-casting,也稱爲窄化)會形成精度損失,所以須要強制類型轉換float f =(float)3.4; 或者寫成 float f =3.4F;。
五、short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎?
對於 short s1 = 1; s1 = s1 + 1;因爲 1 是 int 類型,所以 s1+1 運算結果也是 int型,須要強制轉換類型才能賦值給 short 型。而 short s1 = 1; s1 += 1;能夠正確編譯,由於 s1+= 1;至關於 s1 = (short(s1 + 1);其中有隱含的強制類型轉換。
六、Java 有沒有 goto?
goto 是 Java 中的保留字,在目前版本的 Java 中沒有使用。(根據 James Gosling(Java 之父)編寫的《The Java Programming Language》一書的附錄中給出了一個 Java 關鍵字列表,其中有goto 和 const,可是這兩個是目前沒法使用的關鍵字,所以有些地方將其稱之爲保留字,其實保留字這個詞應該有更普遍的意義,由於熟悉 C 語言的程序員都知道,在系統類庫中使用過的有特殊意義的但詞或單詞的組合都被視爲保留字)
七、int 和 Integer 有什麼區別?
Java 是一個近乎純潔的面向對象編程語言,可是爲了編程的方便仍是引入了基本數據類型,可是爲了可以將這些基本數據類型當成對象操做,Java 爲每個基本數據類型都引入了對應的包裝類型(wrapper class),int 的包裝類就是 Integer,從 Java 5 開始引入了自動裝箱/拆箱機制,使得兩者能夠相互轉換。
原始類型: boolean,char,byte,short,int,long,float,double
包裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
class AutoUnboxingTest {
public static void main(String[] args) {
Integer a = new Integer(3);
Integer b = 3;
int c = 3;
System.out.println(a == b);
象
System.out.println(a == c);
比較
}
}複製代碼
最近還遇到一個面試題,也是和自動裝箱和拆箱有點關係的,代碼以下所示:
public class Test03 {
public static void main(String[] args) {
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
}
}複製代碼
若是不明就裏很容易認爲兩個輸出要麼都是 true 要麼都是 false。首先須要注意的是 f一、f二、f三、f4 四個變量都是 Integer 對象引用,因此下面的==運算比較的不是值而是引用。裝箱的本質是什麼呢?當咱們給一個 Integer 對象賦一個 int 值的時候,會調用 Integer 類的靜態方法 valueOf,若是看 valueOf 的源代碼就知道發生了什麼。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}複製代碼
IntegerCache 是 Integer 的內部類,其代碼以下所示:
/**
* Cache to support the object identity semantics of autoboxing for
values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. The size of the cache
* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>}
option.
* During VM initialization, java.lang.Integer.IntegerCache.high
property
* may be set and saved in the private system properties in the
* sun.misc.VM class.
*/
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseint(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
}
catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int,
ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for (int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {
}
}複製代碼
簡單的說,若是整型字面量的值在-128 到 127 之間,那麼不會 new 新的 Integer對象,而是直接引用常量池中的 Integer 對象,因此上面的面試題中 f1f4 的結果是 false。
提醒:越是貌似簡單的面試題其中的玄機就越多,須要面試者有至關深厚的功力。
八、&和&&的區別?
&運算符有兩種用法:(1)按位與;(2)邏輯與。&&運算符是短路與運算。邏輯與跟短路與的差異是很是巨大的,雖然兩者都要求運算符左右兩端的布爾值都是true 整個表達式的值纔是 true。&&之因此稱爲短路運算是由於,若是&&左邊的表達式的值是 false,右邊的表達式會被直接短路掉,不會進行運算。不少時候咱們可能都須要用&&而不是&,例如在驗證用戶登陸時斷定用戶名不是 null 並且不是空字符串,應當寫爲:username != null &&!username.equals(「」),兩者的順序不能交換,更不能用&運算符,由於第一個條件若是不成立,根本不能進行字符串的 equals 比較,不然會生 NullPointerException 異常。注意:邏輯或運算符(|)和短路或運算符(||)的差異也是如此。
九、解釋內存中的棧(stack)、堆(heap)和方法區(method area)的用法。
一般咱們定義一個基本數據類型的變量,一個對象的引用,還有就是函數調用的現場保存都使用 JVM 中的棧空間;而經過 new 關鍵字和構造器建立的對象則放在堆空間,堆是垃圾收集器管理的主要區域,因爲如今的垃圾收集器都採用分代收集算法,因此堆空間還能夠細分爲新生代和老生代,再具體一點能夠分爲 Eden、Survivor(又可分爲 From Survivor 和 To Survivor)、Tenured;方法區和堆都是各個線程共享的內存區域,用於存儲已經被 JVM 加載的類信息、常量、靜態變量、JIT 編譯器編譯後的代碼等數據;程序中的字面量(literal)如直接書寫的 100、」hello」和常量都是放在常量池中,常量池是方法區的一部分,。棧空間操做起來最快可是棧很小,一般大量的對象都是放在堆空間,棧和堆的大小均可以經過 JVM的啓動參數來進行調整,棧空間用光了會引起 StackOverflowError,而堆和常量池空間不足則會引起 OutOfMemoryError。
String str = new String("hello");複製代碼
上面的語句中變量 str 放在棧上,用 new 建立出來的字符串對象放在堆上,而」hello」這個字面量是放在方法區的。
補充 1:較新版本的 Java(從 Java 6 的某個更新開始)中,因爲 JIT 編譯器的發展和」逃逸分析」技術的逐漸成熟,棧上分配、標量替換等優化技術使得對象必定分配在堆上這件事情已經變得不那麼絕對了。
補充 2:運行時常量池至關於 Class 文件常量池具備動態性,Java 語言並不要求常量必定只有編譯期間才能產生,運行期間也能夠將新的常量放入池中,String類的 intern()方法就是這樣的。
看看下面代碼的執行結果是什麼而且比較一下 Java 7 之前和之後的運行結果是否一致。
String s1 = new StringBuilder("go")
.append("od").toString();
System.out.println(s1.intern() == s1);
String s2 = new StringBuilder("ja")
.append("va").toString();
System.out.println(s2.intern() == s2);複製代碼
十、Math.round(11.5) 等於多少?Math.round(-11.5)等於多少?
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四捨五入的原理是在參數上加 0.5 而後進行下取整。
十一、switch 是否能做用在 byte 上,是否能做用在 long 上,是否能做用在 String 上?
在 Java 5 之前,switch(expr)中,expr 只能是 byte、short、char、int。從 Java5 開始,Java 中引入了枚舉類型,expr 也能夠是 enum 類型,從 Java 7 開始,expr 還能夠是字符串(String),可是長整型(long)在目前全部的版本中都是不能夠的。
十二、用最有效率的方法計算 2 乘以 8?
2 << 3(左移 3 位至關於乘以 2 的 3 次方,右移 3 位至關於除以 2 的 3 次方)。
補充:咱們爲編寫的類重寫 hashCode 方法時,可能會看到以下所示的代碼,其實咱們不太理解爲何要使用這樣的乘法運算來產生哈希碼(散列碼),並且爲何這個數是個素數,爲何一般選擇 31 這個數?前兩個問題的答案你能夠本身百度一下,選擇 31 是由於能夠用移位和減法運算來代替乘法,從而獲得更好的性能。說到這裏你可能已經想到了:31 * num 等價於(num << 5) - num,左移 5位至關於乘以 2 的 5 次方再減去自身就至關於乘以 31,如今的 VM 都能自動完成這個優化。
public class PhoneNumber {
private int areaCode;
private String prefix;
private String lineNumber;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + areaCode;
result = prime * result
+ ((lineNumber == null) ? 0 : lineNumber.hashCode());
result = prime * result + ((prefix == null) ? 0 : prefix.hashCode());
return result;
}
@Override
public Boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PhoneNumber other = (PhoneNumber) obj;
if (areaCode != other.areaCode)
return false;
if (lineNumber == null) {
if (other.lineNumber != null)
return false;
} else if (!lineNumber.equals(other.lineNumber))
return false;
if (prefix == null) {
if (other.prefix != null)
return false;
} else if (!prefix.equals(other.prefix))
return false;
return true;
}
}複製代碼
1三、數組有沒有 length()方法?String 有沒有 length()方法?
數組沒有 length()方法 ,有 length 的屬性。String 有 length()方法。JavaScript中,得到字符串的長度是經過 length 屬性獲得的,這一點容易和 Java 混淆。
1四、在 Java 中,如何跳出當前的多重嵌套循環?
在最外層循環前加一個標記如 A,而後用 break A;能夠跳出多重循環。(Java 中支持帶標籤的 break 和 continue 語句,做用有點相似於 C 和 C++中的 goto 語句,可是就像要避免使用 goto 同樣,應該避免使用帶標籤的 break 和 continue,由於它不會讓你的程序變得更優雅,不少時候甚至有相反的做用,因此這種語法其實不知道更好)
1五、構造器(constructor)是否可被重寫(override)?
1六、兩個對象值相同(x.equals(y) == true),但卻可有不一樣的hash code,這句話對不對?
不對,若是兩個對象 x 和 y 知足 x.equals(y) == true,它們的哈希碼(hash code)應當相同。Java 對於 eqauls 方法和 hashCode 方法是這樣規定的:
(1)若是兩個對象相同(equals 方法返回 true),那麼它們的 hashCode 值必定要相同;
(2)若是兩個對象的 hashCode 相同,它們並不必定相同。固然,你未必要按照要求去作,可是若是你違背了上述原則就會發如今使用容器時,相同的對象能夠出如今 Set 集合中,同時增長新元素的效率會大大降低(對於使用哈希存儲的系統,若是哈希碼頻繁的衝突將會形成存取性能急劇降低)。
補充:關於 equals 和 hashCode 方法,不少 Java 程序都知道,但不少人也就是僅僅知道而已,在 Joshua Bloch 的大做《Effective Java》(不少軟件公司,《Effective Java》、《Java 編程思想》以及《重構:改善既有代碼質量》是 Java程序員必看書籍,若是你還沒看過,那就趕忙去亞馬遜買一本吧)中是這樣介紹equals 方法的:首先 equals 方法必須知足自反性(x.equals(x)必須返回 true)、
對稱性(x.equals(y)返回 true 時,y.equals(x)也必須返回 true)、傳遞性(x.equals(y)和 y.equals(z)都返回 true 時,x.equals(z)也必須返回 true)和一致性(當 x 和 y 引用的對象信息沒有被修改時,屢次調用 x.equals(y)應該獲得一樣的返回值),並且對於任何非 null 值的引用 x,x.equals(null)必須返回 false。
(1) 使用==操做符檢查」參數是否爲這個對象的引用」;
(2) 使用 instanceof 操做符檢查」參數是否爲正確的類型」;
(3) 對於類中的關鍵屬性,檢查參數傳入對象的屬性是否與之相匹配;
(4) 編寫完 equals方法後,問本身它是否知足對稱性、傳遞性、一致性;
(5) 重寫 equals 時老是要重寫 hashCode;
(6) 不要將 equals 方法參數中的 Object 對象替換爲其餘的類型,在重寫時不要忘掉@Override 註解。
1七、是否能夠繼承 String 類?
String 類是 final 類,不能夠被繼承。
補充:繼承 String 自己就是一個錯誤的行爲,對 String 類型最好的重用方式是關聯關係(Has-A)和依賴關係(Use-A)而不是繼承關係(Is-A)。
1八、當一個對象被看成參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏究竟是值傳遞仍是引用傳遞?
是值傳遞。Java 語言的方法調用只支持參數的值傳遞。當一個對象實例做爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的屬性能夠在被調用過程當中被改變,但對對象引用的改變是不會影響到調用者的。C++和 C#中能夠經過傳引用或傳輸出參數來改變傳入的參數的值。在 C#中能夠編寫以下所示的代碼,可是在 Java 中卻作不到。
using System;
namespace CS01 {
class Program {
public static void swap(ref int x, ref int y) {
int temp = x;
x = y;
y = temp;
}
public static void Main (string[] args) {
int a = 5, b = 10;
swap (ref a, ref b);
// a = 10, b = 5;
第 225 頁 共 485 頁
Console.WriteLine ("a = {0}, b = {1}", a, b);
}
}
}複製代碼
說明:Java 中沒有傳引用實在是很是的不方便,這一點在 Java 8 中仍然沒有獲得改進,正是如此在 Java 編寫的代碼中才會出現大量的 Wrapper 類(將須要經過方法調用修改的引用置於一個 Wrapper 類中,再將 Wrapper 對象傳入方法),這樣的作法只會讓代碼變得臃腫,尤爲是讓從 C 和 C++轉型爲 Java 程序員的開發者沒法容忍。
1九、String 和 StringBuilder、StringBuffer 的區別?
Java 平臺提供了兩種類型的字符串:String 和 StringBuffer/StringBuilder,它們能夠儲存和操做字符串。其中 String 是隻讀字符串,也就意味着 String 引用的字符串內容是不能被改變的。而 StringBuffer/StringBuilder 類表示的字符串對象能夠直接進行修改。StringBuilder 是 Java 5 中引入的,它和 StringBuffer 的方法徹底相同,區別在於它是在單線程環境下使用的,由於它的全部方面都沒有被synchronized 修飾,所以它的效率也比 StringBuffer 要高。
面試題 1 - 什麼狀況下用+運算符進行字符串鏈接比調用
StringBuffer/StringBuilder 對象的 append 方法鏈接字符串性能更好?
class StringEqualTest {
public static void main(String[] args) {
String s1 = "Programming";
String s2 = new String("Programming");
String s3 = "Program";
String s4 = "ming";
String s5 = "Program" + "ming";
String s6 = s3 + s4;
System.out.println(s1 == s2);
System.out.println(s1 == s5);
System.out.println(s1 == s6);
System.out.println(s1 == s6.intern());
System.out.println(s2 == s2.intern());
}
}複製代碼
(1)String 對象的 intern 方法會獲得字符串對象在常量池中對應的版本的引用(若是常量池中有一個字符串與 String 對象的 equals 結果是 true),若是常量池中沒有對應的字符串,則該字符串將被添加到常量池中,而後返回常量池中字符串的引用;
(2)字符串的+操做其本質是建立了 StringBuilder 對象進行 append 操做,而後將拼接後的 StringBuilder 對象用toString 方法處理成 String 對象,這一點能夠用 javap -c StringEqualTest.class命令得到 class 文件對應的 JVM 字節碼指令就能夠看出來。
20、重載(Overload)和重寫(Override)的區別。重載的方法可否根據返回類型進行區分?
方法的重載和重寫都是實現多態的方式,區別在於前者實現的是編譯時的多態性,然後者實現的是運行時的多態性。重載發生在一個類中,同名的方法若是有不一樣的參數列表(參數類型不一樣、參數個數不一樣或者兩者都不一樣)則視爲重載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回類型,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(里氏代換原則)。重載對返回類型沒有特殊的要求。
面試題:華爲的面試題中曾經問過這樣一個問題 - 「爲何不能根據返回類型來區分重載」,快說出你的答案吧!
最後
歡迎你們關注個人公種浩【程序員追風】,整理了1000道2019年多家公司java面試題400多頁pdf文檔,文章都會在裏面更新,整理的資料也會放在裏面。喜歡文章記得關注我點個贊喲,感謝支持!
sql