Java 基礎(chǔ)面試題 , 還不會(huì)浴麻, 回家種田吧 5梦省!软免!
注:本文轉(zhuǎn)載于:CodeCow · 程序牛
的個(gè)人博客:http://www.codecow.cn/
一宫纬、Java 的基礎(chǔ)數(shù)據(jù)類型有幾種 ?都是啥 膏萧?`
8 種
byte漓骚、short、int榛泛、long蝌蹂、float、double曹锨、char孤个、boolean
二、String是最基本的數(shù)據(jù)類型嗎 ? 是否可以繼承String類 ?
不是 是引用數(shù)據(jù)類型
java.lang.String類是final類型的沛简,因此不可以繼承這個(gè)類齐鲤、不能修改這個(gè)類
三、①:short s1 = 1; s1 = s1 + 1;有錯(cuò)嗎 ? ②:short s2 = 1; s2 += 1;有錯(cuò)嗎 ?
①:有錯(cuò)(s1+1運(yùn)算結(jié)果是int型椒楣,需要強(qiáng)制轉(zhuǎn)換類型)佳遂、 ②:正確
分析①:
s1 = s1 + 1 做運(yùn)算的時(shí)候,1 是 int 類型撒顿,s1 會(huì)被提升為int類型
,
s1+1 后的結(jié)果是int類型
荚板,將結(jié)果在賦值會(huì)short類型時(shí)發(fā)生錯(cuò)誤
short 內(nèi)存 2 個(gè)字節(jié)凤壁,int 類型 4 個(gè)字節(jié)
必須將int強(qiáng)制轉(zhuǎn)成short才能完成賦值
分析②:
+=
是一個(gè)運(yùn)算符,只運(yùn)算一次跪另,并帶有強(qiáng)制轉(zhuǎn)換的特點(diǎn)
也就是說 s2 += 1 就是 s2 = (short)(s2 + 1) 拧抖,因此程序沒有問題編譯通過,運(yùn)行結(jié)果是2.
四免绿、String s = new String("CodeCow"); 創(chuàng)建了幾個(gè)String Object?
兩個(gè)
分析:
一個(gè)是 “xyz”唧席,一個(gè)是指向 “xyz” 的引用對(duì)象 s
五、int 和 Integer 有什么區(qū)別 ?
Java 提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型)。Int是java的原始數(shù)據(jù)類型淌哟,Integer是java為int提供的封裝類
擴(kuò)展:
Java為每個(gè)原始類型提供了封裝類迹卢。
原始類型 _ 封裝類
boolean _ Boolean
char _ Character
byte _ Byte
short _ Short
int _ Integer
long _ Long
float _ Float
double _ Double
六、String徒仓,StringBuffer 與 StringBuilder 的區(qū)別 ?
String類提供了數(shù)值不可改變的字符串(既:String的值是不可變的腐碱,每次對(duì)String的操作都會(huì)生成新的String對(duì)象)
StringBuffer 和StringBuilder 提供的字符串可以進(jìn)行修改(既:并且不產(chǎn)生新的未使用對(duì)象)
StringBuffer 之間的最大不同在于 StringBuilder 的方法是線程不安全的
擴(kuò)展:
由于 StringBuilder 是線程不安全的 相較于 StringBuffer 有速度優(yōu)勢(shì),所以多數(shù)情況下建議使用 StringBuilder 類掉弛。然而在應(yīng)用程序要求線程安全的情況下症见,則必須使用 StringBuffer 類。
七殃饿、被 final 修飾的 類谋作、方法、變量 有什么特點(diǎn)?
final 修飾的類乎芳,不能被繼承
final 修飾的方法遵蚜,不能被重寫
final 修飾的變量,不能被重新賦值
八秒咐、Overload 和 Override 的區(qū)別谬晕。Overloaded的方法是否可以改變返回值的類型?
重寫 (Overriding) :如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫
重載(Overloading):如果在一個(gè)類中定義了多個(gè)同名的方法携取,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型攒钳,則稱為方法的重載
Overloaded的方法是可以改變返回值的類型。
擴(kuò)展:
方法的重寫 Overriding 和 重載 Overloading 是Java多態(tài)性的不同表現(xiàn)
重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn)雷滋;
重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)不撑。
九、final, finally, finalize的區(qū)別 ?
final 用于聲明類晤斩,方法和變量焕檬,分別表示類不可繼承,方法不可重寫澳泵,變量不可重新賦值实愚。
finally 是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行兔辅。
finalize 是Object 類的一個(gè)方法腊敲,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收维苔,例如關(guān)閉文件等碰辅。
擴(kuò)展:
和 finally 藕斷絲連 的問題 ===》 看下面 十九
十、Collection 和 Collections的區(qū)別 ?
Collection 是單例集合的頂層接口介时,繼承與他的接口主要有 Set 和 List.
Collections 是集合的工具類没宾,他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索凌彬、排序、線程安全化等操作循衰。
十一铲敛、你所知道的集合類都有哪些?主要方法 羹蚣?
最常用的集合類是 List 和 Map原探。
List 的具體實(shí)現(xiàn)包括 ArrayList 、 Vector顽素、 LinkedList
Map 的具體實(shí)現(xiàn)包括 hashMap咽弦、hashTable、treeMap
十二胁出、List型型、Map、Set 三個(gè)接口全蝶,存取元素時(shí)闹蒜,各有什么特點(diǎn) ?
List 以特定次序來持有元素抑淫,可有重復(fù)元素绷落。
Set 無法擁有重復(fù)元素,內(nèi)部排序。
Map 保存key-value值始苇,value可多值砌烁。
總結(jié):
List ===> 有序、重復(fù)
Set ===> 無序催式、不重復(fù)
十三函喉、說說 ArrayList,Vector荣月, LinkedList 的存 儲(chǔ)性能 和 特性 管呵?
ArrayList 和Vector都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù),所以索引(查詢)數(shù)據(jù)快 而 插入數(shù)據(jù)慢
Vector 由于使用了 synchronized 方法(線程安全)哺窄,通常性能上較ArrayList 差
而LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ)捐下,按序號(hào)索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可萌业,所以插入速度較快蔑担。
總結(jié):
ArrayList 和 Vector ====> 查詢數(shù)據(jù)快、增加和刪除數(shù)據(jù) 慢
LinkedList ====> 查詢數(shù)據(jù) 慢咽白、增加和刪除數(shù)據(jù) 快
十四、HashMap和Hashtable的區(qū)別 鸟缕?
HashMap 是非線程安全 晶框;Hashtable 是線程安全的排抬,因此,效率上可能低于HashMap 授段。
HashMap 允許將 null 作為一個(gè) entry 的 key 或者value蹲蒲,而Hashtable不允許
擴(kuò)展:
它兩最大的不同是,Hashtable的方法是Synchronize的侵贵,而HashMap不是届搁,在多個(gè)線程訪問Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步窍育,而HashMap 就必須為之提供外同步卡睦。
十五、&和&&的區(qū)別 漱抓?
&是位運(yùn)算符表锻,表示按位與運(yùn)算,&&是邏輯運(yùn)算符乞娄,表示邏輯與(and)瞬逊。
十六、List, Set, Map是否繼承自 Collection 接口 仪或?
List确镊,Set 是
Map 不是
十七、數(shù)組 有沒有 length() 這個(gè)方法? String 有沒有 length() 這個(gè)方法 范删?
數(shù)組沒有l(wèi)ength()這個(gè)方法蕾域,有l(wèi)ength的屬性。
String有有l(wèi)ength()這個(gè)方法瓶逃。
十八束铭、Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還是equals() ? 它們有何區(qū)別 厢绝?
Set里的元素是不能重復(fù)的契沫,那么用iterator()方法來區(qū)分重復(fù)與否
equals()是判讀兩個(gè)Set是否相等。
equals()和==方法決定引用值是否指向同一對(duì)象equals()在類中被覆蓋昔汉,為的是當(dāng)兩個(gè)分離的對(duì)象的內(nèi)容和類型相配的話懈万,返回真值。
十九靶病、try {}里有一個(gè)return語句会通,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行娄周,在return前還是后 涕侈?
會(huì)執(zhí)行
在return前執(zhí)行。
擴(kuò)展:
和 finally 藕斷絲連 的問題 ===》 看上面 九
二十煤辨、error 和 exception 有什么區(qū)別 ?
error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問題裳涛。比如說內(nèi)存溢出木张。不可能指望程序能處理這樣的情況。
exception 表示一種設(shè)計(jì)或?qū)崿F(xiàn)問題端三。也就是說舷礼,它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況郊闯。
二十一妻献、同步和異步有何異同,在什么情況下分別使用他們团赁?舉例說明 ?
如果數(shù)據(jù)將在線程間共享育拨。例如正在寫的數(shù)據(jù)以后可能被另一個(gè)線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線程寫過了然痊,那么這些數(shù)據(jù)就是共享數(shù)據(jù)至朗,必須進(jìn)行同步存取。
當(dāng)應(yīng)用程序在對(duì)象上調(diào)用了一個(gè)需要花費(fèi)很長(zhǎng)時(shí)間來執(zhí)行的方法剧浸,并且不希望讓程序等待方法的返回時(shí)锹引,就應(yīng)該使用異步編程,在很多情況下采用異步途徑往往更有效率唆香。
二十一嫌变、 給我一個(gè)你最常見到的runtime exception ?
NullPointerException
IndexOutOfBoundsException
SecurityException
SystemException
词渤。奕锌。蒸播。祖今。。磷支。
二十二侯繁、 接口是否可繼承接口 ? 抽象類是否可實(shí)現(xiàn)(implements)接口 ? 抽象類是否可繼承實(shí)體類(concrete class) ?
接口可以繼承接口膝昆。
抽象類可以實(shí)現(xiàn)(implements)接口
抽象類是否可繼承實(shí)體類组贺,但前提是實(shí)體類必須有明確的構(gòu)造函數(shù)
二十三凸舵、 說說數(shù)據(jù)連接池的工作機(jī)制是什么 ?
服務(wù)器啟動(dòng)時(shí)會(huì)建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接失尖“⊙伲客戶端程序需要連接時(shí),池驅(qū)動(dòng)程序會(huì)返回一個(gè)未使用的池連接并將其表記為忙掀潮。
如果當(dāng)前沒有空閑連接菇夸,池驅(qū)動(dòng)程序就新建一定數(shù)量的連接,新建連接的數(shù)量有配置參數(shù)決定仪吧。當(dāng)使用的池連接調(diào)用完成后庄新,池驅(qū)動(dòng)程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個(gè)連接薯鼠。
二十四择诈、 abstract 的 method 是否可同時(shí)是static ? 是否可同時(shí)是 synchronized ?
都不能
二十五凡蚜、 構(gòu)造器Constructor是否可被override ?
構(gòu)造器Constructor不能被繼承,因此不能重寫Overriding吭从,但可以被重載Overloading。
二十六恶迈、 兩個(gè)對(duì)象值相同(x.equals(y) == true)涩金,但卻可有不同的hash code,這句話對(duì)不對(duì) ?
不對(duì)暇仲,有相同的hash code步做。
二十七、 當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后奈附,其它線程是否可進(jìn)入此對(duì)象的其它方法 ?
不能
一個(gè)對(duì)象的一個(gè)synchronized方法只能由一個(gè)線程訪問全度。
二十八、 線程同步的方法有哪些 ?
wait():使一個(gè)線程處于等待狀態(tài)斥滤,并且釋放所持有的對(duì)象的lock将鸵。
sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法佑颇,調(diào)用此方法要捕捉InterruptedException異常顶掉。
notify():喚醒一個(gè)處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候挑胸,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程痒筒,而是由JVM確定喚醒哪個(gè)線程,而且不是按優(yōu)先級(jí)茬贵。
Allnotity():喚醒所有處入等待狀態(tài)的線程簿透,注意并不是給所有喚醒線程一個(gè)對(duì)象的鎖,而是讓它們競(jìng)爭(zhēng)解藻。
二十九老充、 多線程有幾種實(shí)現(xiàn)方法,都是什么 ?
多線程有兩種實(shí)現(xiàn)方法
分別是繼承Thread類與實(shí)現(xiàn)Runnable接口
三十、 同步有幾種實(shí)現(xiàn)方法,都是什么 ?
同步的實(shí)現(xiàn)方面有兩種
分別是synchronized , wait與notify
三十一舆逃、寫一個(gè)Singleton出來 ?
public class MySingleton {
private MySingleton(){}
private static MySingleton INSTANCE = null;
public static synchronized MySingleton getInstance() {
if (null == INSTANCE){
INSTANCE = new MySingleton();
}
return INSTANCE;
}
}
三十二蚂维、線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關(guān)系 ?
線程指在程序執(zhí)行過程中路狮,能夠執(zhí)行程序代碼的一個(gè)執(zhí)行單位虫啥,每個(gè)程序至少都有一個(gè)線程,也就是程序本身奄妨。
Java中的線程有四種狀態(tài)分別是:運(yùn)行涂籽、就緒、掛起砸抛、結(jié)束评雌。
三十三树枫、synchronized 和 java.util.concurrent.locks.Lock的異同 ?
主要相同點(diǎn):Lock能完成synchronized所實(shí)現(xiàn)的所有功能
主要不同點(diǎn):Lock有比synchronized更精確的線程語義和更好的性能。synchronized會(huì)自動(dòng)釋放鎖景东,而Lock一定要求程序員手工釋放砂轻,并且必須在finally從句中釋放。
三十四斤吐、 寫個(gè)冒泡排序 ?
public static void bubbleSort(int arr[]) {
for(int i =0 ; i<arr.length-1 ; i++) {
for(int j=0 ; j<arr.length-1-i ; j++) {
if(arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
最后:
不足之處搔涝,還望小伙伴多多諒解;
有錯(cuò)之處和措,還望小伙伴指出庄呈,小編會(huì)盡快改正