Java面試題系列(一)-面試題及解題思路
前言:
不管看了多少知識,最終還是要面試的。刷刷面試題也算是一個好的複習方法
面試題不是我自己面試的,是我網上找的 原文連結
解答思路是我自己想的,也不是标準答案,而且有可能會錯。按我自己的了解給出涉及到的點
隻是給出我覺得回答中應該涉及到的點,而不是就這麼說
21題目前沒有回答上來
23,24,26,34,35,36也有必要再更新
1、面向對象的特征有哪些方面?
A:多态,繼承,封裝 (PS:我挺不喜歡被問這種問題,都不知道咋說)
2、通路修飾符public,private,protected,以及不寫(預設)時的差別?
修飾符 | 通路級别 |
---|---|
public | 公有成員,所有人可以通路 |
protected | 受保護的成員,子類可見,以及同一包下的其他類可見 |
default | 同一包下的其他類可見 |
private | 僅該類自己可見 |
3、String 是最基本的資料類型嗎?
A:不是基本資料類型,Sring是一個被final修飾的類。String常用的方法, 8種基本資料類型,包裝類,自動裝箱拆箱
4、float f=3.4;是否正确?
A:不行,3.4是double類型,得float f = 3.4f;這樣寫。8基本資料類型的所占位數。8種資料類型的轉化
5、short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎?
A 前者有問題,後者沒有問題。1是int型。 +=可以自動轉化。
6、Java有沒有goto?
A:Java沒有goto,但是goto是保留字。流程跳轉:if ,else, for, while, do-while, break, continue,代表情的break
7、int和Integer有什麼差別?
基本資料類型和包裝類,注意常量池 127
8、&和&&的差別?
都是與,前者是短路運算符。
與&或|非~,異或^
9、解釋記憶體中的棧(stack)、堆(heap)和靜态區(static area)的用法。
A: 虛拟機運作時記憶體劃分:程式計數器;虛拟機棧;本地方法棧; 堆;方法區(靜态區應該指的資格) 五個部分。 前三者是線程獨享,後面三者是線程共享;
堆:存儲Java執行個體對象 (new 出來的執行個體)
棧:存儲局部變量表(基本資料類型,對象引用)
方法區:類資訊,常量,運作時常量池,靜态變量,即時編譯器編譯後的代碼資料
最大的一塊區域是 堆
引申:垃圾回收 垃圾收集器
10、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
A: 這個就相當于+0.5再取整。前者結果12,後者-11
11、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
A:switch能夠作用在 byte,short,boolean,int上。1.7之後更新。也能夠作用在String上
12、用最有效率的方法計算2乘以8?
A: 1<<3向左移三位
13、數組有沒有length()方法?String有沒有length()方法?
A: String有length()方法; 數組有length屬性沒有length()方法 {這個問題挺沒意思的。完全不知道想考驗什麼?}
14、在Java中,如何跳出目前的多重嵌套循環?
A:使用break 這個是最常見的。還有帶标記的break和continue也可以。但是這種我看用的比較少。而且我個人實際上也沒用過
15、構造器(constructor)是否可被重寫(override)?
A:構造器用來new一個Java對象。隻能被重載(一個類有多個構造函數)。不能被重寫
16、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
A:不對。兩個對象equals,hashcode一定相同。因為equals的基本條件就是hashcode相同。但是hashcode相同 。卻不一定equals。例如11%5的結果是1,6%5的結果也是1.但是6和11完全不同
引申:equals的5個特性:自反性,傳遞性,一緻性,對稱性,以及對于非空對象X,X.equals(null)的結果是false
17、是否可以繼承String類?
A: 不行,String是final修飾的。不能被繼承
引申:final,finally,finalize的差別。final在并發程式設計裡的作用
18、當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,并可傳回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?
A:Java裡面全部都是值傳遞。沒有引用傳遞。一個對象傳遞給一個方法後,确實可以改變對應的屬性。但是這裡值傳遞指的是這個對象所指向記憶體位址不會被方法改變
19、String和StringBuilder、StringBuffer的差別?
A:String是final修飾的。每次改變都是建立個String對象
StringBuilder可以用append修改。也有一些好用的方法,例如反正,轉大小寫等
StringBuffer和StringBuilder一樣,不過方法用synchronized修飾,線程安全
20、重載(Overload)和重寫(Override)的差別。重載的方法能否根據傳回類型進行區分?
A:重載發生在一個類中,是方法名字相同。但是參數類型。或參數個數不同
重寫發生在父子類間。子類重寫父類的方法。方法名,傳回值類型,參數類型,參數個數相同。重寫方法體。子類重寫父類的方法。方法通路方位隻能比父類的小
重載是編譯是多态,重寫是運作時多态。
21、描述一下JVM加載class檔案的原理機制?
22、char 型變量中能不能存貯一個中文漢字,為什麼?
A:char占有兩個位元組,16位。應該能存的下吧
然後我剛才用idea試過了。原因哈Unicode編碼有關。具體的我先在也想不起來。
23、抽象類(abstract class)和接口(interface)有什麼異同?
這個問題有必要更新
A:現在接口和抽象類功能越來越接近了。要說不同還真有點不确定
修飾詞不同:前者是 abstract 後者是Interface。前者是繼承,後者是實作(可以實作多個方法)
内部方法的通路修飾不同:前者可以是大于private的就可以。 ~~ 後者隻能是public ~~ (我剛才在IEDA試了下JDK12。發現接口裡也能有private方法。但是必須寫方法體)
用法上:接口一般是用來定義規範的。抽象類用來占坑
24、靜态嵌套類(Static Nested Class)和内部類(Inner Class)的不同?
25、Java 中會存在記憶體洩漏嗎,請簡單描述。
A:記憶體洩露指的是一個不用的對象一直占有着記憶體。Java理由垃圾回收機制,理論上是不會有記憶體洩露的。那就是實際上有咯。eg:HashSet持有一個對象。對象被更改後。HashSet存儲的那個對象就不會被回收。
26、抽象的(abstract)方法是否可同時是靜态的(static),是否可同時是本地方法(native),是否可同時被synchronized修飾?
需要再更新
A:抽象方法需要子類重寫。不能是靜态的(看27題)。後面兩種不太了解。應該是可以嗎
27、闡述靜态變量和執行個體變量的差別。
A:靜态變量是屬于類的。所有執行個體公有。執行個體變量是每個對象自己的
引申到JVM中:靜态變量是類加載的時候初始化。執行個體變量是new對象(記憶體配置設定)的時候初始化
28、是否可以從一個靜态(static)方法内部發出對非靜态(non-static)方法的調用?
A:不行,同27,靜态的方法在類加載時候就初始化了。但是不能直接調用可以間接調用。通過先new一個對象,在通過那個對象調用非靜态方法
29、如何實作對象克隆?
A:實作Cloneable接口,重寫object的clone方法
引申:如何擷取一個對象:①直接new②clone③反序列化④反射
31、String s = new String(“xyz”);建立了幾個字元串對象?
A:一個或兩個;如果字元串常量池(方法區)有xyz,則生成一個字元串對象。如果沒有,想在字元串常量池生成一個,再堆中生成一個,一共兩個
32、接口是否可繼承(extends)接口?抽象類是否可實作(implements)接口?抽象類是否可繼承具體類(concrete class)?
A:接口可以擴充(extends)接口,抽象類可以實作接口,抽象類可以繼承具體的類
可以聯想抽象類和接口的具體作用。
33、一個".java"源檔案中是否可以包含多個類(不是内部類)?有什麼限制?
A:可以有多個類。但是隻有一個public類。檔案名就是這個public類
34、Anonymous Inner Class(匿名内部類)是否可以繼承其它類?是否可以實作接口?
待補充。内部類這一塊我雖然用的不算少。但是具體的很少深究
35、内部類可以引用它的包含類(外部類)的成員嗎?有沒有什麼限制?
待補充
36、Java 中的final關鍵字有哪些用法?
A:修飾類,類不能被繼承,修飾方法:方法不能被重寫。修飾對象,對象貝能修改。簡單說就是 絕後。隻要被final修飾了。就不能對齊做其他操作了
在并發中的作用有待補充
38、資料類型之間的轉換:
小的可以裝換成大的。
boolean 和編譯器有關。我覺得1位元組就夠了
byte 1位元組
short 2位元組
char 2位元組
int 4位元組
float 4位元組
long 8
double 8
39、如何實作字元串的反轉及替換?
A:StringBuilder有reserve方法。應該也有類似的方法{這個問題其實挺沒意思的。這種接口用的時候可以通過IEDA看有哪些方法。這哪記得方法名}