1、public、private、protected、friendly區(qū)別
作用域? ? ? ?當(dāng)前類? ? ? ? ? 同一package? ? ? ?子孫類? ? ? ? ? ? 其他package
public? ? ? ? ? ? ?Y? ? ? ? ? ? ? ? ? ? ? ?Y? ? ? ? ? ? ? ? ? ? ?Y ? ? ? ? ? ? ? ? ? ? ? ? Y
protected? ? ? ?Y? ? ? ? ? ? ? ? ? ? ? ?Y? ? ? ? ? ? ? ? ? ? Y? ? ? ? ? ? ? ? ? ? ? ? ? N
friendly? ? ? ? ? ?Y? ? ? ? ? ? ? ? ? ? ? Y? ? ? ? ? ? ? ? ? ? N? ? ? ? ? ? ? ? ? ? ? ? ? N
private? ? ? ? ? ? Y? ? ? ? ? ? ? ? ? ? ? N? ? ? ? ? ? ? ? ? ? N? ? ? ? ? ? ? ? ? ? ? ? ? N
2安拟、方法length( )、屬性length宵喂、方法size( )
針對(duì)數(shù)組提供了length屬性來(lái)獲取數(shù)組的長(zhǎng)度
針對(duì)字符串提供了length()方法來(lái)獲取字符串的長(zhǎng)度
針對(duì)泛型集合類提供了size()方法來(lái)獲取元素的個(gè)數(shù)
3糠赦、Collection和Collections區(qū)別
java.util.Collection 是一個(gè)集合接口
Collections 是一個(gè)集合類的一個(gè)工具類/幫助類,其中提供了一系列的靜態(tài)方法,用于對(duì)集合中元素進(jìn)行排序愉棱,搜索以及線程安全等操作
4唆铐、String s=new String(‘xyz’); 創(chuàng)建了幾個(gè)object對(duì)象
總共是2個(gè)對(duì)象
public class Test?{?public static void main(String [] args)?{?
????String s1=new String("test");//創(chuàng)建2個(gè)對(duì)象,一個(gè)Class和一個(gè)堆里面?
????String s2="test";//創(chuàng)建1個(gè)對(duì)象奔滑,s2指向pool里面的"test"對(duì)象?
????String s3="test";//創(chuàng)建0個(gè)對(duì)象,指向s2指想pool里面的那個(gè)對(duì)象?
????String s4=s2;//創(chuàng)建0個(gè)對(duì)象,指向s2,s3指想pool里面的那個(gè)對(duì)象?
????String s5=new String("test");//創(chuàng)建1個(gè)對(duì)象在堆里面艾岂,注意,與s1沒關(guān)系?
????System.out.println(s2=="test");//true s2=="test"很明顯true?
????System.out.println(s2==s3);//true,因?yàn)橹赶虻亩际莗ool里面的那個(gè)"test"
????System.out.println(s2==s4);//true,同上,那么s3和s4...:)?
????System.out.println(s1==s5);//false,很明顯,false?
????System.out.println(s1==s2);//false,指向的對(duì)象不一樣,下面再說(shuō)?
????System.out.println(s1=="test");//false,難道s1!="tset"朋其?下面再說(shuō)?
????System.out.println("---------------");?
????s1=s2;?System.out.println(s1=="test");//true,下面說(shuō)?
}?
5王浴、short s1;? s1 = s1+1;是否有錯(cuò)
因?yàn)閟1+1是一個(gè)int類型,執(zhí)行第二句的時(shí)候被賦值給了short類型梅猿,而int是沒有辦法隱式轉(zhuǎn)換成short類型氓辣。會(huì)報(bào)編譯的錯(cuò)誤。
但是如果改成short s1 = 1; s1 +=1 ;就可以袱蚓。+=的運(yùn)算機(jī)制和+不同钞啸。或者把short改成long也可以正常編譯
6喇潘、Overriding和Overloading區(qū)別
方法的重寫(Overriding)和重載(Overloading)是Java多態(tài)性的不同表現(xiàn)体斩。二者多態(tài)的差別在于,重載的編譯時(shí)多態(tài)颖低,重寫是運(yùn)行時(shí)多態(tài)絮吵。重寫(Overriding)是父類與子類之間多態(tài)性的一種表現(xiàn),而重載(Overloading)是一個(gè)類中多態(tài)性的一種表現(xiàn)忱屑。? ? ? ??
如果在子類中定義某方法與其父類有相同的名稱和參數(shù)蹬敲,我們說(shuō)該方法被重寫 (Overriding)? 。子類的對(duì)象使用這個(gè)方法時(shí)莺戒,將調(diào)用子類中的定義伴嗡,對(duì)它而言,父類中的定義如同被"屏蔽"了.
如果在一個(gè)類中定義了多個(gè)同名的方法从铲,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型或有不同的參數(shù)次序瘪校,則稱為方法的重載(Overloading)。不能通過(guò)訪問(wèn)權(quán)限食店、返回類型渣淤、拋出的異常進(jìn)行重載.
Override 特點(diǎn) : ?? ? ??
?????1赏寇、?override的子類的方法名稱吉嫩、參數(shù)類型必須要和父類方法的完全匹配,才能達(dá)到重寫的效果嗅定;???? ? ??
????2自娩、?override的子類的方法的返回值類型必須和?父類方法的一致,其modifier可以擴(kuò)大,不可以縮小?忙迁;?? ? ??
????3脐彩、?override的子類的方法所拋出的異常只能是父類方法拋出異常的子異常;??? ? ??
????4姊扔、被private惠奸、final等關(guān)鍵字修飾的方法是不能被override的;?
? ? 5恰梢、?一個(gè)不是用abstract標(biāo)識(shí)的方法不可以override成abstract方法佛南。
Overload 特點(diǎn) : ?? ? ? ?
????1、在使用重載時(shí)只能通過(guò)不同的參數(shù)樣式(例如嵌言,不同的參數(shù)類型嗅回,不同的參數(shù)個(gè)數(shù),不同的參數(shù)順序)摧茴;? ? ??
? ? 2绵载、方法的異常類型和數(shù)目不會(huì)對(duì)重載造成影響;???? ? ? ?
????3苛白、不能通過(guò)訪問(wèn)權(quán)限娃豹、返回類型、拋出的異常進(jìn)行重載(例如丸氛,如果某一方法在父類中是訪問(wèn)權(quán)限是priavte培愁,那么就不能在子類對(duì)其進(jìn)行重載,如果定義的話缓窜,也只是定義了一個(gè)新方法定续,而不會(huì)達(dá)到重載的效果)。
7禾锤、常見的runtime exception私股。
NullPointerException - 空指針引用異常
IllegalArgumentException? -? 傳遞非法參數(shù)異常。
ArithmeticException? ?-? ?算術(shù)運(yùn)算異常
ArrayStoreException? ?-? ?向數(shù)組中存放與聲明類型不兼容對(duì)象異常
IndexOutOfBoundsException? -? 下標(biāo)越界異常
NegativeArraySizeException? -? 創(chuàng)建一個(gè)大小為負(fù)數(shù)的數(shù)組錯(cuò)誤異常
UnsupportedOperationException? ?-? ?不支持的操作異常
ClassCastException? ?-? ?類型強(qiáng)制轉(zhuǎn)換異常
ArrayIndexOutOfBoundsException? ?-? ?數(shù)組下標(biāo)越界異常
SecturityException? ?-? 違背安全原則異常
EOFException? ?-? ?文件已結(jié)束異常
FileNotFoundException? ?-? ?文件未找到異常
NumberFormatException? ?-? ?字符串轉(zhuǎn)換為數(shù)字異常
SQLException? ?-? ?操作數(shù)據(jù)庫(kù)異常
IOException? ?-? ?輸入輸出異常
NoSuchMethodException? ?-? ?方法未找到異常
8恩掷、error和exception區(qū)別
Error和Exception都繼承自Throwable倡鲸;
二者不同之處:
Exception:
1.可以是可被控制(checked)或者不可控制(unchecked);
2.表示一個(gè)由程序員導(dǎo)致的錯(cuò)誤黄娘;
3.應(yīng)該在應(yīng)用程序級(jí)被處理峭状;
Error:
1.總是不可控制的(unchecked);
2.經(jīng)常用來(lái)表示系統(tǒng)錯(cuò)誤或者底層資源錯(cuò)誤逼争;
3.如果可能的話优床,應(yīng)該在系統(tǒng)級(jí)被捕捉;
Java 中定義了兩類異常:?
1) Checked exception: 這類異常都是Exception的子類誓焦。異常的向上拋出機(jī)制進(jìn)行處理胆敞,假如子類可能產(chǎn)生A異常,那么在父類中也必須throws A異常∫撇悖可能導(dǎo)致的問(wèn)題:代碼效率低仍翰,耦合度過(guò)高。
2) Unchecked exception: 這類異常都是RuntimeException的子類观话,雖然RuntimeException同樣也是Exception的子類予借,但是它們是非凡的,它們不能通過(guò)client code來(lái)試圖解決频蛔,所以稱為Unchecked exception 蕾羊。
Java語(yǔ)言要求java程序中(無(wú)論是誰(shuí)寫的代碼)所有拋出(throw)的異常都必須是從Throwable派生而來(lái)。當(dāng)然帽驯,實(shí)際的Java編程中龟再,由于JDK平臺(tái)已經(jīng)為我們?cè)O(shè)計(jì)好了非常豐富和完整的異常對(duì)象分類模型。因此尼变,java程序員一般是不需要再重新定義自己的異常對(duì)象利凑。而且即便是需要擴(kuò)展自定義的異常對(duì)象,也往往會(huì)從Exception派生而來(lái)嫌术。所以哀澈,對(duì)于java程序員而言,它一般只需要在它的頂級(jí)函數(shù)中catch(Exception ex)就可以捕獲出所有的異常對(duì)象度气。 所有異常對(duì)象的根基類是 Throwable 割按,Throwable從Object直接繼承而來(lái)(這是java系統(tǒng)所強(qiáng)制要求的),并且它實(shí)現(xiàn)了 Serializable接口(這為所有的異常對(duì)象都能夠輕松跨越Java組件系統(tǒng)做好了最充分的物質(zhì)準(zhǔn)備)磷籍。
從Throwable直接派生出的異常類有Exception和Error 适荣。Exception是java程序員所最熟悉的,它一般代表了真正實(shí)際意義上的異常對(duì)象的根基類院领。也即是說(shuō)弛矛, Exception 和從它派生而來(lái)的所有異常都是應(yīng)用程序能夠catch到的,并且可以進(jìn)行異常錯(cuò)誤恢復(fù)處理的異常類型。而Error則表示Java系統(tǒng)中出現(xiàn)了一個(gè)非常嚴(yán)重的異常錯(cuò)誤,并且這個(gè)錯(cuò)誤可能是應(yīng)用程序所不能恢復(fù)的贰军,例如LinkageError ,或 ThreadDeath 等
9万俗、List和Set是否繼承自Collection接口
List,Set是饮怯。??
Map不是闰歪。?
List特點(diǎn):元素有放入順序,元素可重復(fù)?
Map特點(diǎn):元素按鍵值對(duì)存儲(chǔ)硕淑,無(wú)放入順序?
Set特點(diǎn):元素?zé)o放入順序课竣,元素不可重復(fù)(注意:元素雖然無(wú)放入順序,但是元素在set中的位置是有該元素的HashCode決定的置媳,其位置其實(shí)是固定的)?
List接口有三個(gè)實(shí)現(xiàn)類:LinkedList于樟,ArrayList,Vector?
LinkedList:底層基于鏈表實(shí)現(xiàn)拇囊,鏈表內(nèi)存是散亂的迂曲,每一個(gè)元素存儲(chǔ)本身內(nèi)存地址的同時(shí)還存儲(chǔ)下一個(gè)元素的地址。鏈表增刪快寥袭,查找慢?
ArrayList和Vector的區(qū)別:ArrayList是非線程安全的路捧,效率高;Vector是基于線程安全的传黄,效率低?
Set接口有兩個(gè)實(shí)現(xiàn)類:HashSet(底層由HashMap實(shí)現(xiàn))杰扫,LinkedHashSet?
SortedSet接口有一個(gè)實(shí)現(xiàn)類:TreeSet(底層由平衡二叉樹實(shí)現(xiàn))?
Query接口有一個(gè)實(shí)現(xiàn)類:LinkList?
Map接口有三個(gè)實(shí)現(xiàn)類:HashMap,HashTable膘掰,LinkeHashMap?
HashMap非線程安全章姓,高效,支持null识埋;HashTable線程安全凡伊,低效,不支持null?
SortedMap有一個(gè)實(shí)現(xiàn)類:TreeMap?
其實(shí)最主要的是窒舟,list是用來(lái)處理序列的系忙,而set是用來(lái)處理集的。Map是知道的惠豺,存儲(chǔ)的是鍵值對(duì)
set 一般無(wú)序不重復(fù).map kv 結(jié)構(gòu) list 有序
10银还、abstract class和interface 的區(qū)別
共同點(diǎn)
A.兩者都是抽象類,都不能實(shí)例化
B.Interface實(shí)現(xiàn)類和abstract繼承類都必須實(shí)現(xiàn)抽象方法
不同點(diǎn)
A.Interface需要實(shí)現(xiàn),用implements;Abstract 需要繼承,用exends
B.一個(gè)類可以實(shí)現(xiàn)多個(gè)Interface ;一個(gè)類只能繼承一個(gè)Abstract
C.Interface強(qiáng)調(diào)功能的實(shí)現(xiàn)洁墙;Abstract強(qiáng)調(diào)從屬關(guān)系
D.Interface的所有抽象類都只有聲明沒有方法體见剩;Abstract抽象方法可以選擇實(shí)現(xiàn),也可以選擇繼續(xù)聲明為抽象方法扫俺,無(wú)需實(shí)現(xiàn)苍苞,留給子類去實(shí)現(xiàn)
interface的應(yīng)用場(chǎng)合
類與類之間需要特定的接口進(jìn)行協(xié)調(diào),而不在乎其如何實(shí)現(xiàn)狼纬。
11羹呵、是否可以繼承String類
不可以,因?yàn)镾tring類有final修飾符疗琉,而final修飾的類是不能被繼承的冈欢,實(shí)現(xiàn)細(xì)節(jié)不允許改變
12、try{}里有一個(gè)return語(yǔ)句盈简,緊跟在try后的finally里的code會(huì)不會(huì)被執(zhí)行凑耻,什么時(shí)候執(zhí)行太示,return前執(zhí)行還是return后執(zhí)行
finally中的代碼肯定會(huì)執(zhí)行,但是會(huì)先執(zhí)行try中的代碼香浩,如果try中有return类缤,那么return的東西會(huì)先放到函數(shù)棧中,然后再執(zhí)行finally中的代碼邻吭,
①餐弱、如果finally中也有return,則會(huì)直接返回并終止程序囱晴,函數(shù)棧中的return不會(huì)被完成8囹尽;
②畸写、如果finally中沒有return驮瞧,則在執(zhí)行完finally中的代碼之后,會(huì)將函數(shù)棧中的try中的return的內(nèi)容返回并終止程序
13枯芬、最有效率的方法算2*8等于幾
2*8=2 << 3剧董;
因?yàn)閷⒁粋€(gè)數(shù)左移n位,就相當(dāng)于乘以了2的n次方破停,那么翅楼,一個(gè)數(shù)乘以8只要將其左移3位即可,而位運(yùn)算cpu直接支持的真慢,效率最高毅臊,所以黑界,2乘以8等於幾的最效率的方法是2 << 3
14管嬉、兩個(gè)對(duì)象值相同朗鸠,x.equal(y)==true,但是卻可有不同的hashcode揭芍,這句話對(duì)不對(duì)
不對(duì)。
有相同的hash code這是java語(yǔ)言的定義:
1) 對(duì)象相等則hashCode一定相等店乐;
2) hashCode相等對(duì)象未必相等
15左电、值傳遞和引用傳遞
值傳遞:(形式參數(shù)類型是基本數(shù)據(jù)類型):方法調(diào)用時(shí),實(shí)際參數(shù)把它的值傳遞給對(duì)應(yīng)的形式參數(shù)潜腻,形式參數(shù)只是用實(shí)際參數(shù)的值初始化自己的存儲(chǔ)單元內(nèi)容暴心,是兩個(gè)不同的存儲(chǔ)單元娜亿,所以方法執(zhí)行中形式參數(shù)值的改變不影響實(shí)際參數(shù)的值躲舌。
引用傳遞:(形式參數(shù)類型是引用數(shù)據(jù)類型參數(shù)):也稱為傳地址约计。方法調(diào)用時(shí)沽瘦,實(shí)際參數(shù)是對(duì)象(或數(shù)組)盛卡,這時(shí)實(shí)際參數(shù)與形式參數(shù)指向同一個(gè)地址助隧,在方法執(zhí)行中,對(duì)形式參數(shù)的操作實(shí)際上就是對(duì)實(shí)際參數(shù)的操作滑沧,這個(gè)結(jié)果在方法結(jié)束后被保留了下來(lái)并村,所以方法執(zhí)行中形式參數(shù)的改變將會(huì)影響實(shí)際參數(shù)
16巍实、switch是否作用在byte、long哩牍、string上
switch可作用于char byte short int
switch可作用于char byte short int對(duì)應(yīng)的包裝類
switch不可作用于long double float boolean棚潦,包括他們的包裝類
switch中可以是字符串類型,String(JDK1.7之后才可以作用在string上)
switch中可以是枚舉類型(JDK1.5之后)
17、ArrayList和Vector區(qū)別膝昆,HashMap和Hashtable區(qū)別(了解這幾個(gè)類的底層jdk中的編碼方式)
ArrayList和HashMap是異步的丸边。Vector和HashTable是同步的。所以Vector和HashTable是線程安全的荚孵,而ArrayList和HashMap并不是線程安全的妹窖。因?yàn)橥叫枰ㄙM(fèi)機(jī)器時(shí)間,所以Vector和HashTable的執(zhí)行效率要低于ArrayList和HashMap
18处窥、GC是什么嘱吗,為什么要有GC玄组,簡(jiǎn)單介紹GC
Java有了GC滔驾,就不需要程序員去人工釋放內(nèi)存空間。當(dāng)Java虛擬機(jī)發(fā)覺內(nèi)存資源緊張的時(shí)候俄讹,就會(huì)自動(dòng)地去清理無(wú)用變量所占用的內(nèi)存空間哆致。當(dāng)然,如果需要患膛,程序員可以在Java程序中顯式地使用System.gc()來(lái)強(qiáng)制進(jìn)行一次立即的內(nèi)存清理摊阀。
19、float f=3.4是否正確
不正確踪蹬。精度不準(zhǔn)確,應(yīng)該用強(qiáng)制類型轉(zhuǎn)換胞此,如下所示:
float f=(float)3.4 或float f = 3.4f?
在java里面,沒小數(shù)點(diǎn)的默認(rèn)是int,有小數(shù)點(diǎn)的默認(rèn)是 double跃捣;
20漱牵、String和Stringbuffer的區(qū)別
(1)String:是對(duì)象不是原始類型.為不可變對(duì)象,一旦被創(chuàng)建,就不能修改它的值.對(duì)于已經(jīng)存在的String對(duì)象的修改都是重新創(chuàng)建一個(gè)新的對(duì)象,然后把新的值保存進(jìn)去.String 是final類,即不能被繼承
(2)StringBuffer:是一個(gè)可變對(duì)象,當(dāng)對(duì)他進(jìn)行修改的時(shí)候不會(huì)像String那樣重新建立對(duì)象。它只能通過(guò)構(gòu)造函數(shù)來(lái)建立對(duì)象被建立以后,在內(nèi)存中就會(huì)分配內(nèi)存空間,并初始保存一個(gè)null.向StringBuffer中付值的時(shí)候可以通過(guò)它的append方法.
21疚漆、final酣胀、finally、finalize區(qū)別
final
當(dāng)用final修飾類的時(shí)娶聘,表明該類不能被其他類所繼承闻镶。當(dāng)我們需要讓一個(gè)類永遠(yuǎn)不被繼承,此時(shí)就可以用final修飾丸升,注意:final類中所有的成員方法都會(huì)隱式的定義為final方法铆农。
當(dāng)用final修飾方法時(shí)
(1) 把方法鎖定,以防止繼承類對(duì)其進(jìn)行更改狡耻。
(2) 效率顿涣,在早期的java版本中波闹,會(huì)將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用。但若方法過(guò)于龐大涛碑,可能在性能上不會(huì)有多大提升精堕。因此在最近版本中,不需要final方法進(jìn)行這些優(yōu)化了蒲障。
final方法意味著“最后的歹篓、最終的”含義,即此方法不能被重寫揉阎。
注意:若父類中final方法的訪問(wèn)權(quán)限為private庄撮,將導(dǎo)致子類中不能直接繼承該方法,因此毙籽,此時(shí)可以在子類中定義相同方法名的函數(shù)洞斯,此時(shí)不會(huì)與重寫final的矛盾,而是在子類中重新地定義了新方法坑赡。
當(dāng)用final修飾變量時(shí)final成員變量表示常量烙如,只能被賦值一次,賦值后其值不再改變毅否。類似于C++中的const亚铁。
finally
????finally作為異常處理的一部分,它只能用在try/catch語(yǔ)句中螟加,并且附帶一個(gè)語(yǔ)句塊徘溢,表示這段語(yǔ)句最終一定會(huì)被執(zhí)行(不管有沒有拋出異常),經(jīng)常被用在需要釋放資源的情況下捆探。(×)(這句話其實(shí)存在一定的問(wèn)題)
????finally 語(yǔ)句塊還是沒有執(zhí)行然爆,為什么呢?因?yàn)槲覀冊(cè)?try 語(yǔ)句塊中執(zhí)行了 System.exit (0) 語(yǔ)句黍图,終止了 Java 虛擬機(jī)的運(yùn)行曾雕。那有人說(shuō)了,在一般的 Java 應(yīng)用中基本上是不會(huì)調(diào)用這個(gè) System.exit(0) 方法的雌隅。OK 翻默!沒有問(wèn)題,我們不調(diào)用 System.exit(0) 這個(gè)方法恰起,那么 finally 語(yǔ)句塊就一定會(huì)執(zhí)行嗎修械?
再一次讓大家失望了,答案還是否定的检盼。當(dāng)一個(gè)線程在執(zhí)行 try 語(yǔ)句塊或者 catch 語(yǔ)句塊時(shí)被打斷(interrupted)或者被終止(killed)肯污,與其相對(duì)應(yīng)的 finally 語(yǔ)句塊可能不會(huì)執(zhí)行。還有更極端的情況,就是在線程運(yùn)行 try 語(yǔ)句塊或者 catch 語(yǔ)句塊時(shí)蹦渣,突然死機(jī)或者斷電哄芜,finally 語(yǔ)句塊肯定不會(huì)執(zhí)行了〖砦ǎ可能有人認(rèn)為死機(jī)认臊、斷電這些理由有些強(qiáng)詞奪理,沒有關(guān)系锄奢,我們只是為了說(shuō)明這個(gè)問(wèn)題失晴。
finalize
finalize()是在java.lang.Object里定義的,也就是說(shuō)每一個(gè)對(duì)象都有這么個(gè)方法拘央。這個(gè)方法在gc啟動(dòng)涂屁,該對(duì)象被回收的時(shí)候被調(diào)用。其實(shí)gc可以回收大部分的對(duì)象(凡是new出來(lái)的對(duì)象灰伟,gc都能搞定拆又,一般情況下我們又不會(huì)用new以外的方式去創(chuàng)建對(duì)象),所以一般是不需要程序員去實(shí)現(xiàn)finalize的栏账。特殊情況下帖族,需要程序員實(shí)現(xiàn)finalize,當(dāng)對(duì)象被回收的時(shí)候釋放一些資源发笔,比如:一個(gè)socket鏈接盟萨,在對(duì)象初始化時(shí)創(chuàng)建凉翻,整個(gè)生命周期內(nèi)有效了讨,那么就需要實(shí)現(xiàn)finalize,關(guān)閉這個(gè)鏈接制轰∏凹疲 使用finalize還需要注意一個(gè)事,調(diào)用super.finalize();
一個(gè)對(duì)象的finalize()方法只會(huì)被調(diào)用一次垃杖,而且finalize()被調(diào)用不意味著gc會(huì)立即回收該對(duì)象男杈,所以有可能調(diào)用finalize()后,該對(duì)象又不需要被回收了调俘,然后到了真正要被回收的時(shí)候伶棒,因?yàn)榍懊嬲{(diào)用過(guò)一次,所以不會(huì)調(diào)用finalize()彩库,產(chǎn)生問(wèn)題肤无。?所以,推薦不要使用finalize()方法骇钦,它跟析構(gòu)函數(shù)不一樣
22宛渐、面向?qū)ο蟮奶卣?/h4>
面向?qū)ο蟮木幊陶Z(yǔ)言有封裝、繼承、抽象窥翩、多態(tài)等4個(gè)主要的特征
面向?qū)ο缶幊逃腥筇匦裕悍庋b业岁、繼承、多態(tài)
23寇蚊、String是最基本的數(shù)據(jù)類型嗎
不是
基本數(shù)據(jù)類型包括byte笔时、int、char仗岸、long糊闽、float、double爹梁、boolean和short右犹。
引用數(shù)據(jù)類型包括:類,數(shù)組,接口等(簡(jiǎn)單來(lái)說(shuō)就是除了基本數(shù)據(jù)類型之外的所有類型)
所以String?是引用數(shù)據(jù)類型
24、運(yùn)行時(shí)異常和一般異常的區(qū)別
Java提供了兩類主要的異常:運(yùn)行時(shí)異常runtime exception和一般異常checked exception姚垃。checked 異常念链。對(duì)于后者這種異常,JAVA要求程序員對(duì)其進(jìn)行catch积糯。所以掂墓,面對(duì)這種異常不管我們是否愿意,只能自己去寫一大堆catch塊去處理可能的異常看成。運(yùn)行時(shí)異常我們可以不處理君编。這樣的異常由虛擬機(jī)接管。出現(xiàn)運(yùn)行時(shí)異常后川慌,系統(tǒng)會(huì)把異常一直往上層拋吃嘿,一直遇到處理代碼。如果不對(duì)運(yùn)行時(shí)異常進(jìn)行處理梦重,那么出現(xiàn)運(yùn)行時(shí)異常之后兑燥,要么是線程中止,要么是主程序終止
不同點(diǎn):
(1)運(yùn)行時(shí)異常都是RuntimeException類及其子類異常琴拧,如NullPointerException降瞳、IndexOutOfBoundsException等。
(2)一般異常是RuntimeException以外的異常蚓胸,類型上都屬于Exception類及其子類挣饥。
1、Java異常機(jī)制:
Java把異常當(dāng)做對(duì)象來(lái)處理沛膳,并定義一個(gè)基類java.lang.Throwable作為所有異常的超類扔枫。
Java中的異常分為兩大類:錯(cuò)誤Error和異常Exception。
2于置、運(yùn)行時(shí)異常:
運(yùn)行時(shí)異常是不檢查異常茧吊,程序中可以選擇捕獲處理贞岭,也可以不處理。這些異常一般是由程序邏輯錯(cuò)誤引起的搓侄。
當(dāng)出現(xiàn)RuntimeException的時(shí)候瞄桨,我們可以不處理,總是由虛擬機(jī)接管讶踪。比如:我們從來(lái)沒有人去處理過(guò)NullPointerException異常芯侥,它就是運(yùn)行時(shí)異常,并且這種異常還是最常見的異常之一乳讥。
出現(xiàn)運(yùn)行時(shí)異常后柱查,如果沒有捕獲處理這個(gè)異常(即沒有catch),系統(tǒng)會(huì)把異常一直往上層拋云石,一直到最上層唉工,如果是多線程就由Thread.run()拋出,如果是單線程就被main()拋出汹忠。拋出之后淋硝,如果是線程,這個(gè)線程也就退出了宽菜。如果是主程序拋出的異常谣膳,那么這整個(gè)程序也就退出了。
運(yùn)行時(shí)異常是Exception的子類铅乡,也有一般異常的特點(diǎn)继谚,是可以被catch塊處理的。只不過(guò)往往我們不對(duì)他處理罷了阵幸。也就是說(shuō)花履,你如果不對(duì)運(yùn)行時(shí)異常進(jìn)行處理,那么出現(xiàn)運(yùn)行時(shí)異常之后侨嘀,要么是線程中止臭挽,要么是主程序終止捂襟。
如果不想終止咬腕,則必須捕獲所有的運(yùn)行時(shí)異常,決不讓這個(gè)處理線程退出葬荷。隊(duì)列里面出現(xiàn)異常數(shù)據(jù)了涨共,正常的處理應(yīng)該是把異常數(shù)據(jù)舍棄,然后記錄日志宠漩。不應(yīng)該由于異常數(shù)據(jù)而影響下面對(duì)正常數(shù)據(jù)的處理举反。
3、一般異常:
一般異常包括IOException扒吁、SQLException等以及用戶自定義的Exception異常火鼻。對(duì)于這種異常,JAVA編譯器強(qiáng)制要求我們必需對(duì)出現(xiàn)的這些異常進(jìn)行catch并處理,否則程序就不能編譯通過(guò)魁索。
所以融撞,面對(duì)這種異常不管我們是否愿意,只能自己去寫一大堆catch塊去處理可能的異常。
4、常見RuntimeException:
ArrayStoreException:試圖將錯(cuò)誤類型的對(duì)象存儲(chǔ)到一個(gè)對(duì)象數(shù)組時(shí)拋出的異常
ClassCastException:試圖將對(duì)象強(qiáng)制轉(zhuǎn)換為不是實(shí)例的子類時(shí)奥邮,拋出該異常
IllegalArgumentException:拋出的異常表明向方法傳遞了一個(gè)不合法或不正確的參數(shù)
IndexOutOfBoundsException:指示某排序索引(例如對(duì)數(shù)組雅采、字符串或向量的排序)超出范圍時(shí)拋出
NoSuchElementException :表明枚舉中沒有更多的元素
NullPointerException :當(dāng)應(yīng)用程序試圖在需要對(duì)象的地方使用 null 時(shí),拋出該異常
25翁脆、說(shuō)出ArrayList、Vector、Linkedlist的存儲(chǔ)性能和特性
ArrayList 是一個(gè)數(shù)組隊(duì)列抖僵。它由數(shù)組實(shí)現(xiàn),實(shí)現(xiàn)了RandomAccess, Cloneable, java.io.Serializable接口缘揪,所以可以隨便訪問(wèn)裆针,克隆,序列化寺晌,隨機(jī)訪問(wèn)效率高世吨,隨機(jī)插入、隨機(jī)刪除效率低呻征。
LinkedList 是一個(gè)雙向鏈表耘婚。它也可以被當(dāng)作堆棧、隊(duì)列或雙端隊(duì)列進(jìn)行操作陆赋。LinkedList隨機(jī)訪問(wèn)效率低沐祷,但隨機(jī)插入、隨機(jī)刪除效率低攒岛。
Vector 是矢量隊(duì)列赖临,和ArrayList一樣,它也是一個(gè)動(dòng)態(tài)數(shù)組灾锯,由數(shù)組實(shí)現(xiàn)兢榨。但是ArrayList是非線程安全的,而Vector是線程安全的顺饮。
Stack 是棧吵聪,繼承于Vector。棧的特點(diǎn)是:先進(jìn)后出(First In Last Out)兼雄。
List和Vector不同吟逝,ArrayList中的操作不是線程安全的!所以赦肋,建議在單線程中才使用ArrayList块攒,而在多線程中可以選擇Vector或者CopyOnWriteArrayList励稳。
26、heap和stack區(qū)別
要點(diǎn): 堆 : 隊(duì)列優(yōu)先,先進(jìn)先出(FIFO—first in first out)囱井。
? ? ? ? ? ? 棧 : 先進(jìn)后出
heap 和 stack有什么區(qū)別
(1)堆椔缶猓空間分配區(qū)別:
1、棧(操作系統(tǒng)):由操作系統(tǒng)自動(dòng)分配釋放 琅绅,存放函數(shù)的參數(shù)值扶欣,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧千扶;
2料祠、堆(操作系統(tǒng)):一般由程序員分配釋放, 若程序員不釋放澎羞,程序結(jié)束時(shí)可能由OS回收髓绽,分配方式倒是類似于鏈表。
(2)堆棧緩存方式區(qū)別:
1妆绞、棧使用的是一級(jí)緩存顺呕, 他們通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢立即釋放括饶;
2株茶、堆是存放在二級(jí)緩存中,生命周期由虛擬機(jī)的垃圾回收算法來(lái)決定(并不是一旦成為孤兒對(duì)象就能被回收)图焰。所以調(diào)用這些對(duì)象的速度要相對(duì)來(lái)得低一些启盛。
(3)堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別:
堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹,如:堆排序技羔;
棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)僵闯。
Java中棧和堆的區(qū)別:
棧(stack)與堆(heap)都是Java用來(lái)在Ram中存放數(shù)據(jù)的地方。與C++不同藤滥,Java自動(dòng)管理?xiàng):投驯钏冢绦騿T不能直接地設(shè)置棧或堆拙绊。
在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都在函數(shù)的棧內(nèi)存中分配向图。當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java就在棧中為這個(gè)變量分配內(nèi)存空間时呀,當(dāng)超過(guò)變量的作用域后张漂,Java會(huì)自動(dòng)釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作他用谨娜。
堆內(nèi)存用來(lái)存放由new創(chuàng)建的對(duì)象和數(shù)組,在堆中分配的內(nèi)存磺陡,由Java虛擬機(jī)的自動(dòng)垃圾回收器來(lái)管理趴梢。在堆中產(chǎn)生了一個(gè)數(shù)組或?qū)ο蠛竽螅€可以在棧中定義一個(gè)特殊的變量,讓棧中這個(gè)變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址坞靶,棧中的這個(gè)變量就成了數(shù)組或?qū)ο蟮囊米兞裤灸R米兞烤拖喈?dāng)于是為數(shù)組或?qū)ο笃鸬囊粋€(gè)名稱,以后就可以在程序中使用棧中的引用變量來(lái)訪問(wèn)堆中的數(shù)組或?qū)ο蟆?/p>
Java中變量在內(nèi)存中的分配:
1彰阴、類變量(static修飾的變量):在程序加載時(shí)系統(tǒng)就為它在堆中開辟了內(nèi)存瘾敢,堆中的內(nèi)存地址存放于棧以便于高速訪問(wèn)。靜態(tài)變量的生命周期–一直持續(xù)到整個(gè)”系統(tǒng)”關(guān)閉尿这。
2簇抵、實(shí)例變量:當(dāng)你使用java關(guān)鍵字new的時(shí)候,系統(tǒng)在堆中開辟并不一定是連續(xù)的空間分配給變量(比如說(shuō)類實(shí)例)射众,然后根據(jù)零散的堆內(nèi)存地址碟摆,通過(guò)哈希算法換算為一長(zhǎng)串?dāng)?shù)字以表征這個(gè)變量在堆中的”物理位置”。 實(shí)例變量的生命周期–當(dāng)實(shí)例變量的引用丟失后叨橱,將被GC(垃圾回收器)列入可回收“名單”中典蜕,但并不是馬上就釋放堆中內(nèi)存。
3罗洗、局部變量:局部變量愉舔,由聲明在某方法,或某代碼段里(比如for循環(huán))伙菜,執(zhí)行到它的時(shí)候在棧中開辟內(nèi)存屑宠,當(dāng)局部變量一但脫離作用域,內(nèi)存立即釋放仇让。
這里要涉及到Java內(nèi)存問(wèn)題典奉,可以參考:Java的內(nèi)存機(jī)制
27、排序的幾種方法丧叽,了解卫玖。(算法和數(shù)據(jù)結(jié)構(gòu)在面試的時(shí)候還沒有被問(wèn)到)
冒泡排序
public static void sort(int data[]) {
? ? for (int i = 0; i < data.length - 1; i++) {
? ? ? ? for (int j = 0; j < data.length - i - 1; j++) {
? ? ? ? ? ? if (data[j] > data[j + 1]) {
? ? ? ? ? ? ? ? int temp = data[j];
? ? ? ? ? ? ? ? data[j] = data[j + 1];
? ? ? ? ? ? ? ? data[j + 1] = temp;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
插入排序
public static void sort(int data[]) {
? ? for (int i = 1; i < data.length; i++) {
? ? ? ? for (int j = i; j > 0; j--){
? ? ? ? ? ? if (data[j] < data[j - 1]) {
? ? ? ? ? ? ? ? int temp = data[j];
? ? ? ? ? ? ? ? data[j] = data[j - 1];
? ? ? ? ? ? ? ? data[j - 1] = temp;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
28、Java語(yǔ)言如何進(jìn)行異常處理踊淳,throws假瞬,throw,try catch finally代表什么意義迂尝,try塊中可以拋出異常嗎
try塊表示程序正常的業(yè)務(wù)執(zhí)行代碼脱茉。如果程序在執(zhí)行try塊的代碼時(shí)出現(xiàn)了“非預(yù)期”情況,JVM將會(huì)生成一個(gè)異常對(duì)象垄开,這個(gè)異常對(duì)象將會(huì)被后面相應(yīng)的catch塊捕獲琴许。
catch塊表示一個(gè)異常捕獲塊。當(dāng)程序執(zhí)行try塊引發(fā)異常時(shí)溉躲,這個(gè)異常對(duì)象將會(huì)被后面相應(yīng)的catch塊捕獲榜田。
throw用于手動(dòng)地拋出異常對(duì)象益兄。throw后面需要一個(gè)異常對(duì)象。
throws用于在方法簽名中聲明拋出一個(gè)或多個(gè)異常類箭券,throws關(guān)鍵字后可以緊跟一個(gè)或多個(gè)異常類净捅。
finally塊代表異常處理流程中總會(huì)執(zhí)行的代碼塊。
對(duì)于一個(gè)完整的異常處理流程而言辩块,try塊是必須的蛔六,try塊后可以緊跟一個(gè)或多個(gè)catch塊,最后還可以帶一個(gè)finally塊废亭。
try塊中可以拋出異常
29国章、一個(gè)’.java’源文件是否可以包括多個(gè)類,有什么限制
這個(gè)是可以的滔以,一個(gè)“.java”源文件里面可以包含多個(gè)類捉腥,但是只允許有一個(gè)public類,并且類名必須和文件名一致你画。
每個(gè)編譯單元只能有一個(gè)public 類抵碟。這么做的意思是,每個(gè)編譯單元只能有一個(gè)公開的接口坏匪,而這個(gè)接口就由其public 類來(lái)表示拟逮。
你可以根據(jù)需要,往這個(gè)文件里面添加任意多個(gè)提供輔助功能的package 權(quán)限的類适滓。但是如果這個(gè)編譯單元里面有兩個(gè)或兩個(gè)以上的public 類的話敦迄,程序就不知道從哪里導(dǎo)入了,編譯器就會(huì)報(bào)錯(cuò)
30凭迹、是否可以從一個(gè)static方法內(nèi)部發(fā)生對(duì)非static方法調(diào)用
不可以罚屋。因?yàn)榉莝tatic方法是要與對(duì)象關(guān)聯(lián)在一起的,必須創(chuàng)建一個(gè)對(duì)象后嗅绸,
?才可以在該對(duì)象上進(jìn)行方法調(diào)用脾猛,而static方法調(diào)用時(shí)不需要?jiǎng)?chuàng)建對(duì)象,可以
?直接調(diào)用鱼鸠。也就是說(shuō)猛拴,當(dāng)一個(gè)static方法被調(diào)用時(shí),可能還沒有創(chuàng)建任何實(shí)例
?對(duì)象蚀狰,如果從一個(gè)static方法中發(fā)出對(duì)非static方法的調(diào)用愉昆,那個(gè)非static
?方法是關(guān)聯(lián)到哪個(gè)對(duì)象上的呢?這個(gè)邏輯無(wú)法成立麻蹋,所以跛溉,一個(gè)static方法內(nèi)部
?發(fā)出對(duì)非static方法的調(diào)用
31、說(shuō)出常用類、包倒谷、接口蛛蒙,各舉5個(gè)
常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer java.util.Date糙箍,System渤愁,Class,List,HashMap
常用的包:java.lang java.io java.util
java.sql ,javax.servlet,org.apache.strtuts.action,org.hibernate
常用的接口:Remote List Map Document
NodeList,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)
Session(Hibernate),HttpSession
32深夯、同步和異步區(qū)別
同步交互:指發(fā)送一個(gè)請(qǐng)求,需要等待返回,然后才能夠發(fā)送下一個(gè)請(qǐng)求抖格,有個(gè)等 ???待過(guò)程;
異步交互:指發(fā)送一個(gè)請(qǐng)求,不需要等待返回,隨時(shí)可以再發(fā)送下一個(gè)請(qǐng)求咕晋,即不需要等待雹拄。區(qū)別:一個(gè)需要等待,一個(gè)不需要等待掌呜,在部分情況下滓玖, 我們的項(xiàng)目開發(fā)中都會(huì)優(yōu)先選擇不需要等待的異步交互方式
33、簡(jiǎn)述面向?qū)ο蟮睦斫庵式叮⑴e例說(shuō)出你的理解
面向?qū)ο笫腔谌f(wàn)物皆對(duì)象這個(gè)哲學(xué)觀點(diǎn). 把一個(gè)對(duì)象抽象成類,具體上就是把一個(gè)對(duì)象的靜態(tài)特征和動(dòng)態(tài)特征抽象成屬性和方法
34势篡、繼承和實(shí)現(xiàn)的區(qū)別
表面的區(qū)別就是單繼承多實(shí)現(xiàn)
繼承:如果多個(gè)類的某個(gè)部分的功能相同,那么可以抽象出一個(gè)類出來(lái)模暗,把他們的相同部分都放到父類里禁悠,讓他們都繼承這個(gè)類。
實(shí)現(xiàn):如果多個(gè)類處理的目標(biāo)是一樣的兑宇,但是處理的方法方式不同碍侦,那么就定義一個(gè)接口,也就是一個(gè)標(biāo)準(zhǔn)隶糕,讓他們的實(shí)現(xiàn)這個(gè)接口瓷产,各自實(shí)現(xiàn)自己具體的處理方法來(lái)處理那個(gè)目標(biāo)
35、介紹Java中的Collection framework
Java collection是java提供的工具包枚驻,包含了常用的數(shù)據(jù)結(jié)構(gòu):集合濒旦、鏈表、隊(duì)列测秸、棧疤估、數(shù)組、映射等霎冯。
Java集合主要可以劃分為4個(gè)部分:List列表铃拇、Set集合、Map映射沈撞、工具類(Iterator慷荔、Arrays和Collections)。
Collection是一個(gè)interface?缠俺,Collection有List和Set兩大分支显晶。
List<E>是一個(gè)隊(duì)列贷岸,根據(jù)下標(biāo)索引,第一個(gè)元素的下標(biāo)是0磷雇,List的實(shí)現(xiàn)類有LinkedList, ArrayList, Vector, Stack偿警。List是有序的隊(duì)列,List中可以有重復(fù)的值唯笙。
Set<E>是一個(gè)集合螟蒸,SET中的值是唯一的,我們經(jīng)常會(huì)遇到List去重的問(wèn)題崩掘,把List轉(zhuǎn)為SET就可以快速實(shí)現(xiàn) Set的實(shí)現(xiàn)類有HastSet和TreeSet七嫌。HashSet。其中TreeSet是有序的苞慢。
Ma<K,V>是一個(gè)interface诵原,即key-value鍵值對(duì)。Map中的每一個(gè)元素包含“一個(gè)key”和“key對(duì)應(yīng)的value”挽放。?
AbstractMap是個(gè)抽象類绍赛,它實(shí)現(xiàn)了Map接口中的大部分API。而HashMap骂维,TreeMap惹资,WeakHashMap都是繼承于AbstractMap。
Iterator航闺。它是遍歷集合的工具褪测,我們經(jīng)常使用Iterator迭代器來(lái)遍歷集合。Collection的實(shí)現(xiàn)類都要實(shí)現(xiàn)iterator()函數(shù)潦刃,返回一個(gè)Iterator對(duì)象侮措。
抽象類AbstractCollection、AbstractList乖杠、AbstractSet分扎、AbstractMap是抽象類,他們都實(shí)現(xiàn)了各自的大部分方法胧洒,我們直接繼承Abstract類就可以省去重復(fù)編碼相同的方法 畏吓。PS當(dāng)時(shí)來(lái)面試的時(shí)候被問(wèn)到這個(gè)問(wèn)題竟然一下沒想起來(lái)。