看到一篇不錯的java面試題的文章,自己整理一下议慰,作為備用吧蠢古!
Java面試題
面向?qū)ο蟮奶卣饔心男┓矫妫?/h3>
-
封裝
最常見的是把屬性私有化封裝在一個類里面,只能通過方法去訪問
-
繼承
子類繼承父類别凹,從而繼承了父類的方法和屬性
-
抽象
比如一個英雄類草讶,抽象出了name,hp這些屬性,使得開發(fā)過程中更加易于理解
-
多態(tài)
多態(tài)分操作符的多態(tài)和類的多態(tài)炉菲。 類的多態(tài)指父類引用指向子類對象堕战,并且有繼承坤溃,有重寫。
String是最基本的數(shù)據(jù)類型嗎嘱丢?
String是類類型薪介,不是基本類型。
基本類型有八種: 整型 (4種)字符型 (1種)浮點型 (2種)布爾型(1種)
int 和 Integer 有什么區(qū)別越驻?
int 是基本類型32位長度的整數(shù),而Integer 是類類型汁政,是int的封裝類
int和Integer之間可以通過自動裝箱、自動拆箱互相轉(zhuǎn)換
String 和StringBuffer的區(qū)別缀旁?
String是immutable的,其內(nèi)容一旦創(chuàng)建好之后记劈,就不可以發(fā)生改變。
StringBuffer 是可以變長的并巍,內(nèi)容也可以發(fā)生改變 改變的原理是StringBuffer內(nèi)部采用了字符數(shù)組存放數(shù)據(jù)抠蚣,在需要增加長度的時候,創(chuàng)建新的數(shù)組履澳,并且把原來的數(shù)據(jù)復(fù)制到新的數(shù)組這樣的辦法來實現(xiàn)。
運行時異常與一般異常有何異同怀跛?
運行時異常 又叫做非可查異常距贷,在編譯過程中,不要求必須進(jìn)行顯示捕捉
一般異常又叫做可查異常吻谋,在編譯過程中忠蝗,必須進(jìn)行處理,要么捕捉漓拾,要么通過throws 拋出去.是如何實現(xiàn)的阁最。
說出ArrayList,Vector, LinkedList的存儲性能和特性。
-
ArrayList和Vector
兩者都繼承了抽象類AbstractList骇两,但是Vector是線程安全的速种,而ArrayList是非線程安全的
-
ArrayList和LinkedList的區(qū)別
ArrayList 是數(shù)組結(jié)構(gòu),所以定位很快低千,但是插入和刪除很慢 LinkedList 是雙向鏈表結(jié)構(gòu)配阵,所以插入和刪除很快,但是定位很慢
Collection 和 Collections的區(qū)別示血。
封裝
最常見的是把屬性私有化封裝在一個類里面,只能通過方法去訪問
繼承
子類繼承父類别凹,從而繼承了父類的方法和屬性
抽象
比如一個英雄類草讶,抽象出了name,hp這些屬性,使得開發(fā)過程中更加易于理解
多態(tài)
多態(tài)分操作符的多態(tài)和類的多態(tài)炉菲。 類的多態(tài)指父類引用指向子類對象堕战,并且有繼承坤溃,有重寫。
String是類類型薪介,不是基本類型。
基本類型有八種: 整型 (4種)字符型 (1種)浮點型 (2種)布爾型(1種)
int 是基本類型32位長度的整數(shù),而Integer 是類類型汁政,是int的封裝類
int和Integer之間可以通過自動裝箱、自動拆箱互相轉(zhuǎn)換
String是immutable的,其內(nèi)容一旦創(chuàng)建好之后记劈,就不可以發(fā)生改變。
StringBuffer 是可以變長的并巍,內(nèi)容也可以發(fā)生改變 改變的原理是StringBuffer內(nèi)部采用了字符數(shù)組存放數(shù)據(jù)抠蚣,在需要增加長度的時候,創(chuàng)建新的數(shù)組履澳,并且把原來的數(shù)據(jù)復(fù)制到新的數(shù)組這樣的辦法來實現(xiàn)。
運行時異常 又叫做非可查異常距贷,在編譯過程中,不要求必須進(jìn)行顯示捕捉
一般異常又叫做可查異常吻谋,在編譯過程中忠蝗,必須進(jìn)行處理,要么捕捉漓拾,要么通過throws 拋出去.是如何實現(xiàn)的阁最。
ArrayList和Vector
兩者都繼承了抽象類AbstractList骇两,但是Vector是線程安全的速种,而ArrayList是非線程安全的
ArrayList和LinkedList的區(qū)別
ArrayList 是數(shù)組結(jié)構(gòu),所以定位很快低千,但是插入和刪除很慢 LinkedList 是雙向鏈表結(jié)構(gòu)配阵,所以插入和刪除很快,但是定位很慢
首先不要說成了一個是單數(shù)棋傍,一個是復(fù)數(shù)。难审。瘫拣。
Collection是接口,是List和Set的父接口
Collections是工具類告喊,提供了排序麸拄,混淆等等很多實用方法
&和&&的區(qū)別
-
& 有兩個作用派昧,分別是 位與 和 邏輯與,&& 就是邏輯與,作為邏輯與, & 和 && 分別表示長路與和短路與
長路與 兩側(cè)感帅,都會被運算 短路與 只要第一個是false斗锭,第二個就不進(jìn)行運算了
HashMap和Hashtable的區(qū)別
HashMap和Hashtable都實現(xiàn)了Map接口,都是鍵值對保存數(shù)據(jù)的方式
-
區(qū)別1:
HashMap可以存放 null Hashtable不能存放null
-
區(qū)別2:
HashMap不是線程安全的類 Hashtable是線程安全的類
final, finally, finalize的區(qū)別
-
final
final修飾類失球,方法岖是,基本類型變量,引用的時候分別有不同的意思 修飾類 表示該類不能被繼承 修飾方法 表示該方法不能被重寫 修飾基本類型變量 表示該變量只能被賦值一次 修飾引用 表示該引用只有一次指向?qū)ο蟮臋C會
-
finally
finally 是用于異常處理的場面实苞,無論是否有異常拋出豺撑,都會執(zhí)行
-
finalize
finalize是Object的方法,所有類都繼承了該方法黔牵。 當(dāng)一個對象滿足垃圾回收的條件聪轿,并且被回收的時候,其finalize()方法就會被調(diào)用
Overload和Override的區(qū)別猾浦,即重載和重寫的區(qū)別陆错。 Overloaded的方法是否可以改變返回值的類型?
Overload是方法重載的意思,指的是在同一個類里面金赦,方法名一樣音瓷,但是參數(shù)不一樣
-
Override是方法重寫的意思,指的是子類繼承了父類的某個方法后夹抗,重新又寫了一遍
-
Overloaded的方法是否可以改變返回值的類型?
可以绳慎,重載其實本質(zhì)上就是完全不同的方法,只是恰好取了相同的名字
-
Error和Exception有什么區(qū)別?
Error和Exception都實現(xiàn)了Throwable接口
Error指的是JVM層面的錯誤漠烧,比如內(nèi)存不足OutOfMemoryError
Exception 指的是代碼邏輯的異常杏愤,比如下標(biāo)越界OutOfIndexException
abstract class和interface有什么區(qū)別?
abstract class 抽象類和interface接口的區(qū)別
-
使用方式:
抽象類只能夠通過繼承被使用 接口必須通過實現(xiàn)被使用
-
實現(xiàn)方法:
抽象類不僅可以提供抽象方法,也可以提供實現(xiàn)方法 接口只能提供抽象方法已脓,不能提供實現(xiàn)方法珊楼。 但是在JAVA8版本開始,接口可以提供實現(xiàn)方法了度液,前提是要在方法前加一個default修飾符
heap和stack有什么區(qū)別
heap: 堆
stack: 棧 (在一些書籍里亥曹,會被翻譯為堆棧,實際上指的就是單純的這個棧)
-
存放的內(nèi)容不一樣:
heap: 是存放對象的 stack: 是存放基本類型(int, float, boolean 等等)恨诱、引用(對象地址)媳瞪、方法調(diào)用
-
存取方式不一樣:
heap: 是自動增加大小的,所以不需要指定大小照宝,但是存取相對較慢 stack: 是固定大小的蛇受,并且是FILO 先入后出的順序,并且存取速度比較快
GC是什么? 為什么要有GC?
GC是Garbage Collection的縮寫厕鹃,即垃圾回收 這里所謂的垃圾兢仰,指的是那些不再被使用的對象乍丈,JVM的垃圾回收機制使得開發(fā)人員從無聊、容易犯錯的手動釋放內(nèi)存資源的過程中解放出來把将。 開發(fā)人員可以更加專注的進(jìn)行業(yè)務(wù)功能的開發(fā)轻专,而資源回收的工作交由更加專業(yè)的垃圾回收機制自動完成。
short s1 = 1; s1 = s1 + 1;有什么錯?
short s1 = 1; //這一句沒有錯誤察蹲,編譯器會自動把1這個整數(shù)處理為short.
s1 = s1 + 1; //右側(cè)的表達(dá)式會返回一個Int類型的整數(shù)请垛,再把這個int類型的整數(shù)賦給short類型的s1的時候,就會出現(xiàn)強制轉(zhuǎn)換錯誤
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round 的意思是+0.5 取整數(shù)
所以 Math.round(11.5) 即 11.5+0.5 = 12
Math.round(-11.5) 即 -11.5+0.5 = -11
String s = new String("xyz");創(chuàng)建了幾個String Object?
String s = new String("xyz");
首先構(gòu)造方法 new String("xyz"); 中的"xyz" 這本身就是一個字符串對象 然后 new 關(guān)鍵字一定會創(chuàng)建一個對象 所以總共創(chuàng)建了兩個String對象
Java有沒有g(shù)oto?
- 有,goto是關(guān)鍵字洽议,但是是保留字宗收,并不具備功能性
接口是否可繼承接口? 抽象類是否可實現(xiàn)(implements)接口? 抽象類是否可繼承實體類(concrete class)?
-
接口是否可繼承接口?
可以亚兄,比如List 就繼承了接口Collection
-
抽象類是否可實現(xiàn)(implements)接口?
可以混稽,比如 MouseAdapter鼠標(biāo)監(jiān)聽適配器 是一個抽象類,并且實現(xiàn)了MouseListener接口
-
抽象類是否可繼承實體類(concrete class)审胚?
可以匈勋,所有抽象類,都繼承了Object
List, Set, Map是否繼承自Collection接口?
List 和 Set 繼承了Collection接口
但是Map和Collection之間沒有繼承關(guān)系膳叨,因為一個是鍵值對容器洽洁,一個是單值容器,無法兼容
abstract的method是否可同時是static,是否可同時是synchronized懒鉴?
-
abstract的method是否可同時是static,是否可同時是synchronized?
都不可以
數(shù)組有沒有l(wèi)ength()這個方法? String有沒有l(wèi)ength()這個方法碎浇?
數(shù)組獲取長度的手段是 .length 屬性
String獲取長度的手段是 length()方法
集合獲取長度的手段是 size()方法
文件獲取長度的手段是 length()方法
Set里的元素是不能重復(fù)的临谱,那么用什么方法來區(qū)分重復(fù)與否呢?
以HashSet為例,判斷重復(fù)的邏輯是:
首先看hashcode是否相同奴璃,如果不同悉默,就是不重復(fù)的
如果hashcode一樣,再比較equals苟穆,如果不同抄课,就是不重復(fù)的,否則就是重復(fù)的雳旅。
構(gòu)造器Constructor是否可被override?是否可以繼承String類?
子類不能繼承父類的構(gòu)造方法跟磨,所以就不存在重寫父類的構(gòu)造方法。 注: super() 表示子類調(diào)用父類的構(gòu)造方法攒盈,這不能被叫做繼承父類的構(gòu)造方法
String是final修飾的抵拘,所以不能夠被繼承
switch 是否能作用在byte上,是否能作用在long上型豁,是否能作用在String上?
-
switch 可以作用在 byte,short,int String,Enum(枚舉) 上僵蛛,但是不能作用在long上面
注:switch 作用在String上從JDK1.7開始支持尚蝌,實質(zhì)是編譯時將字符串替換為了其對應(yīng)的hash值
try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執(zhí)行充尉,什么時候被執(zhí)行飘言,在return前還是后?
try里的return 和 finally里的return 都會執(zhí)行,但是當(dāng)前方法只會采納finally中return的值
兩個對象值相同(x.equals(y) == true)驼侠,但卻可有不同的hash code姿鸿,這句話對不對?
因為hashCode()方法和equals()方法都可以通過自定義類重寫,是可以做到equals相同泪电,但是hashCode不同的
但是般妙,在Object類的equals()方法中有這么一段話
* Note that it is generally necessary to override the {@code hashCode}
* method whenever this method is overridden, so as to maintain the
* general contract for the {@code hashCode} method, which states
* that equal objects must have equal hash codes.
- 翻譯如下:
通常來講,在重寫這個方法的時候相速,也需要對hashCode方法進(jìn)行重寫碟渺,
以此來保證這兩個方法的一致性——
當(dāng)equals返回true的時候,這兩個對象一定有相同的hashcode.
兩個對象值相同(x.equals(y) == true)突诬,但卻可有不同的hash code苫拍,這句話對不對?
所以這個題的答案應(yīng)該是否定的,但是得搞清楚里面的原委
垃圾回收的優(yōu)點和原理旺隙。并考慮2種回收機制绒极。
與C語言開發(fā)人員需要手動進(jìn)行內(nèi)存資源的釋放不同,Java提供垃圾回收機制蔬捷,自動進(jìn)行GC垄提,將開發(fā)人員從容易犯錯的內(nèi)存資源管理中解放出來。
原理:當(dāng)某個一個對象周拐,沒有任何引用指向它的時候铡俐,那么它就滿足垃圾回收的條件,在適當(dāng)?shù)臅r候妥粟,JVM虛擬機進(jìn)行GC將其回收审丘,釋放空間,以供后續(xù)再利用勾给。
兩種常見的回收機制:
定時回收 每隔30分鐘進(jìn)行一次回收滩报,這種機制的弊端是如果垃圾產(chǎn)生的比較快,有可能30分鐘之內(nèi)垃圾已經(jīng)把內(nèi)存占用光了播急,導(dǎo)致性能變慢
當(dāng)垃圾占到某個百分比的時候脓钾,進(jìn)行回收 比如,當(dāng)垃圾占到70%的時候桩警,進(jìn)行回收惭笑。 這種機制的弊端是,如果垃圾產(chǎn)生的頻率很快,那么JVM就必須高頻率的進(jìn)行垃圾回收沉噩。 而在垃圾回收的過程中捺宗, JVM會停頓下來,只做垃圾回收川蒙,而影響業(yè)務(wù)功能的正常運行蚜厉。
一般說來 JVM會采用兩種機制結(jié)合的方式進(jìn)行垃圾回收。
你所知道的集合類都有哪些畜眨?主要方法昼牛?
常見的集合
ArrayList,LinkedList,HashSet,HashMap,TreeSet 等等
常見方法:
size()
add()
remove()
等等
char型變量中能不能存貯一個中文漢字?為什么?
char是16位的,占兩個字節(jié) 漢字通常使用GBK或者UNICODE編碼康聂,也是使用兩個字節(jié) 所以可以存放漢字
解析XML文檔有哪幾種方式贰健?
主要是兩種,SAX和DOM:
SAX 就是逐行讀取恬汁,直到找到目標(biāo)數(shù)據(jù)為止
DOM 是先全文檔加載伶椿,然后讀取
關(guān)鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以拋出異常嗎氓侧?
throws 用在方法聲明上面脊另,表示該方法有可能拋出某個異常
throw 拋出一個指定的異常
try catch 在try中有可能會拋出某個異常,一旦某個異常拋出后约巷,就會在catch中進(jìn)行捕捉偎痛,他倆一般說來都是成對出現(xiàn)的。
finally: 表示無論是否捕捉住異常独郎,都會執(zhí)行
一個".java"源文件中是否可以包括多個類(不是內(nèi)部類)踩麦?有什么限制?
可以包括多個類氓癌,但是只能出現(xiàn)一個public修飾的類谓谦,但是可以出現(xiàn)多個非public修飾的類。
java中有幾種類型的流顽铸?
Java中所有的流都是基于字節(jié)流茁计,所以最基本的流是
-
輸入輸出字節(jié)流
InputStream OutputStream
-
在字節(jié)流的基礎(chǔ)上料皇,封裝了字符流
Reader Writer
-
進(jìn)一步谓松,又封裝了緩存流
BufferedReader PrintWriter
-
以及數(shù)據(jù)流
DataInputStream DataOutputStream
-
對象流
ObjectInputStream ObjectOutputStream
以及一些其他的奇奇怪怪的流 ~~~
java中會存在內(nèi)存泄漏嗎,請簡單描述践剂。
因為Java是自動進(jìn)行垃圾回收管理的鬼譬,所以不存在 C語言中同等概念的內(nèi)存泄漏,但是存在Java特色的內(nèi)存泄漏
當(dāng)某些對象不被使用逊脯,但是又有非直接引用指向的時候月洛,那么就不滿足垃圾回收的條件撕贞,而形成內(nèi)存泄漏胶滋。
比如代碼中的例子室囊,每個Object創(chuàng)建的時候,有一個引用o指向瘟栖,接著就被放進(jìn)了集合al中。 下一個Object創(chuàng)建的時候,上一個Object就沒有引用指向了爷耀。
這些Object都沒有引用指向,但是卻放在ArrayList中拍皮,而這個Arraylist忘記了回收歹叮,那么里面的所有對象,都會一直存活下去铆帽,雖然不再被使用了咆耿。
package exercise;
import java.util.ArrayList;
public class MemoryLeak {
static ArrayList<Object> al = new ArrayList<Object>();
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
Object o = new Object();
al.add(o);
}
}
}
java中實現(xiàn)多態(tài)的機制是什么?
- 類的多態(tài)的條件:
父類(接口)引用指向子類對象
方法有重寫
靜態(tài)變量和實例變量的區(qū)別爹橱?
靜態(tài)變量 直接通過類就可以訪問萨螺,無需實例
實例變量 比如通過類的某個具體實例,才可以訪問
什么是java序列化宅荤,如何實現(xiàn)java序列化屑迂?
序列化指的是把一個Java對象,通過某種介質(zhì)進(jìn)行傳輸冯键,比如Socket輸入輸出流惹盼,或者保存在一個文件里
實現(xiàn)java序列化的手段是讓該類實現(xiàn)接口 Serializable,這個接口是一個標(biāo)識性接口惫确,沒有任何方法手报,僅僅用于表示該類可以序列化。
是否可以從一個static方法內(nèi)部發(fā)出對非static方法的調(diào)用改化?
- 不行掩蛤,因為非static方法需要一個具體的實例才可以調(diào)用,而調(diào)用 static方法的時候陈肛,不一定存在一個實例
在JAVA中揍鸟,如何跳出當(dāng)前的多重嵌套循環(huán)?
在外部循環(huán)的前一行句旱,加上標(biāo)簽
在break的時候使用該標(biāo)簽
即能達(dá)到結(jié)束多重嵌套循環(huán)的效果
public class HelloWorld {
public static void main(String[] args) {
//打印單數(shù)
outloop: //outloop這個標(biāo)示是可以自定義的比如outloop1,ol2,out5
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.println(i+":"+j);
if(0==j%2)
break outloop; //如果是雙數(shù)阳藻,結(jié)束外部循環(huán)
}
}
}
}
參考源:http://how2j.cn/k/j2se-interview/j2se-interview-java/624.html