Java和C++的一些比較[Java] Excption與Error包結(jié)構(gòu),OOM和SOF1. 九種基本數(shù)據(jù)類(lèi)型的大小艳馒,以及他們的封裝類(lèi)匾浪。
注:基本數(shù)據(jù)類(lèi)型在聲明時(shí)系統(tǒng)會(huì)自動(dòng)給它分配空間蛾坯,而引用類(lèi)型聲明時(shí)只是分配了引用空間法梯,必須通過(guò)實(shí)例化開(kāi)辟數(shù)據(jù)空間之后才可以賦值
2.?Switch能否用string做參數(shù)蜘矢?
JDK1.6的版本中悼枢,switch后面的括號(hào)里面只能放int類(lèi)型的值埠忘,注意是只能放int類(lèi)型,但是放byte馒索,short莹妒,char類(lèi)型的也可以。是因?yàn)閎yte绰上,short旨怠,shar可以自動(dòng)提升(自動(dòng)類(lèi)型轉(zhuǎn)換)為int。而不能放long型和String型蜈块。JDK1.7的版本中鉴腻,switch中可以使用字串String。
注:String時(shí)不能傳入null作為參數(shù)疯趟,同時(shí)case語(yǔ)句中使用的字符串也不能為null拘哨,因?yàn)榈讓邮峭ㄟ^(guò)equals和hashmap來(lái)判斷的
3.?equals與==的區(qū)別。
==用于判斷兩邊的變量的值是否相等信峻,如果是基本數(shù)據(jù)類(lèi)型倦青,就是判斷他們的值是不是相等;如果==兩邊是對(duì)象的引用盹舞,那么指的是這兩個(gè)引用是否指向同一個(gè)對(duì)象产镐,及引用的值是否相等。
equals()是Object里的方法踢步。在Object的equals中购城,就是使用==來(lái)進(jìn)行比較鸳碧,比較的是引用。與==不同的是,在某些Object的子類(lèi)中撇叁,覆蓋了equals()方法,比如String中的equals()方法比較兩個(gè)字符串對(duì)象的內(nèi)容是否相同。
hashCode()方法也是繼承自O(shè)bject,它用來(lái)獲取一個(gè)對(duì)象的hash值唆缴,返回int值。Object.hashCode規(guī)定黍翎,equals()相等的對(duì)象面徽,它們的HashCode()返回值也必須相等,否則無(wú)法與集合類(lèi)結(jié)合在一起使用匣掸。(List, Set, Hashmap..)
4.?Object有哪些公用方法趟紊?
Object是所有類(lèi)的父類(lèi),任何類(lèi)都默認(rèn)繼承Object碰酝。
clone
保護(hù)方法霎匈,實(shí)現(xiàn)對(duì)象的淺復(fù)制,只有實(shí)現(xiàn)了Cloneable接口才可以調(diào)用該方法砰粹,否則拋出CloneNotSupportedException異常
equals
在Object中與==是一樣的唧躲,子類(lèi)一般需要重寫(xiě)該方法
hashCode
該方法用于哈希查找造挽,重寫(xiě)了equals方法一般都要重寫(xiě)hashCode方法碱璃。這個(gè)方法在一些具有哈希功能的Collection中用到
getClass
final方法,獲得運(yùn)行時(shí)類(lèi)型
wait
使當(dāng)前線程等待該對(duì)象的鎖饭入,當(dāng)前線程必須是該對(duì)象的擁有者嵌器,也就是具有該對(duì)象的鎖。wait()方法一直等待谐丢,直到獲得鎖或者被中斷爽航。wait(long timeout)設(shè)定一個(gè)超時(shí)間隔,如果在規(guī)定時(shí)間內(nèi)沒(méi)有獲得鎖就返回乾忱。
調(diào)用該方法后當(dāng)前線程進(jìn)入睡眠狀態(tài)讥珍,直到以下事件發(fā)生:
1. 其他線程調(diào)用了該對(duì)象的notify方法
2. 其他線程調(diào)用了該對(duì)象的notifyAll方法
3. 其他線程調(diào)用了interrupt中斷該線程
4. 時(shí)間間隔到了
此時(shí)該線程就可以被調(diào)度了,如果是被中斷的話就拋出一個(gè)InterruptedException異常
notify
喚醒在該對(duì)象上等待的某個(gè)線程
notifyAll
喚醒在該對(duì)象上等待的所有線程
toString
轉(zhuǎn)換成字符串窄瘟,一般子類(lèi)都有重寫(xiě)衷佃,否則打印句柄
5.?Java的四種引用,強(qiáng)弱軟虛蹄葱,用到的場(chǎng)景氏义。
1、強(qiáng)引用
強(qiáng)引用不會(huì)被GC回收图云,并且在java.lang.ref里也沒(méi)有實(shí)際的對(duì)應(yīng)類(lèi)型惯悠,平時(shí)工作接觸的最多的就是強(qiáng)引用。
Object obj = new Object();這里的obj引用便是一個(gè)強(qiáng)引用竣况。如果一個(gè)對(duì)象具有強(qiáng)引用克婶,那就類(lèi)似于必不可少的生活用品,垃圾回收器絕不會(huì)回收它。當(dāng)內(nèi)存空 間不足情萤,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤萝风,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來(lái)解決內(nèi)存不足問(wèn)題紫岩。
2规惰、軟引用
如果一個(gè)對(duì)象只具有軟引用,那就類(lèi)似于可有可物的生活用品泉蝌。如果內(nèi)存空間足夠歇万,垃圾回收器就不會(huì)回收它,如果內(nèi)存空間不足了勋陪,就會(huì)回收這些對(duì)象的內(nèi)存贪磺。只 要垃圾回收器沒(méi)有回收它,該對(duì)象就可以被程序使用诅愚。軟引用可用來(lái)實(shí)現(xiàn)內(nèi)存敏感的高速緩存寒锚。 軟引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用,如果軟引用所引用的對(duì)象被垃圾回收违孝,Java虛擬機(jī)就會(huì)把這個(gè)軟引用加入到與之關(guān)聯(lián)的引用隊(duì)列中
3刹前、弱引用
如果一個(gè)對(duì)象只具有弱引用,那就類(lèi)似于可有可物的生活用品雌桑。弱引用與軟引用的區(qū)別在于:只具有弱引用的對(duì)象擁有更短暫的生命周期喇喉。在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過(guò)程中,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象校坑,不管當(dāng)前內(nèi)存空間足夠與否拣技,都會(huì)回收它的內(nèi)存。不過(guò)耍目,由于垃圾回收器是一個(gè)優(yōu)先級(jí)很低的線程膏斤, 因此不一定會(huì)很快發(fā)現(xiàn)那些只具有弱引用的對(duì)象。 弱引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用邪驮,如果弱引用所引用的對(duì)象被垃圾回 收莫辨,Java虛擬機(jī)就會(huì)把這個(gè)弱引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。
4耕捞、幽靈引用(虛引用)
虛引用主要用來(lái)跟蹤對(duì)象被垃圾回收器回收的活動(dòng)衔掸。虛引用與軟引用和弱引用的一個(gè)區(qū)別在于:虛引用必須和引用隊(duì)列 (ReferenceQueue)聯(lián)合使用。當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí)俺抽,如果發(fā)現(xiàn)它還有虛引用敞映,就會(huì)在回收對(duì)象的內(nèi)存之前,把這個(gè)虛引用加入到與之關(guān)聯(lián)的引用隊(duì)列中磷斧。程序可以通過(guò)判斷引用隊(duì)列中是否已經(jīng)加入了虛引用振愿,來(lái)了解被引用的對(duì)象是否將要被垃圾回收捷犹。如果程序發(fā)現(xiàn)某個(gè)虛引用已經(jīng)被加入到引用隊(duì)列,那么就可以在所引用的對(duì)象的內(nèi)存被回收之前采取必要的行動(dòng)冕末。由于Object.finalize()方法的不安全性萍歉、低效性,常常使用虛引用完成對(duì)象回收前的資源釋放工作档桃。
6.?Hashcode的作用枪孩。
hashCode方法的主要作用是為了配合基于散列的集合一起正常運(yùn)行,這樣的散列集合包括HashSet藻肄、HashMap以及HashTable蔑舞。
為什么這么說(shuō)呢?考慮一種情況嘹屯,當(dāng)向集合中插入對(duì)象時(shí)攻询,如何判別在集合中是否已經(jīng)存在該對(duì)象了?(注意:集合中不允許重復(fù)的元素存在)州弟。比equals 更加有效率钧栖。
因此有人會(huì)說(shuō),可以直接根據(jù)hashcode值判斷兩個(gè)對(duì)象是否相等嗎婆翔?肯定是不可以的拯杠,因?yàn)椴煌膶?duì)象可能會(huì)生成相同的hashcode值。雖然不能根據(jù)hashcode值判斷兩個(gè)對(duì)象是否相等浙滤,但是可以直接根據(jù)hashcode值判斷兩個(gè)對(duì)象不等阴挣,如果兩個(gè)對(duì)象的hashcode值不等,則必定是兩個(gè)不同的對(duì)象纺腊。如果要判斷兩個(gè)對(duì)象是否真正相等,必須通過(guò)equals方法茎芭。
也就是說(shuō)對(duì)于兩個(gè)對(duì)象揖膜,如果調(diào)用equals方法得到的結(jié)果為true,則兩個(gè)對(duì)象的hashcode值必定相等梅桩;
如果equals方法得到的結(jié)果為false壹粟,則兩個(gè)對(duì)象的hashcode值不一定不同;
如果兩個(gè)對(duì)象的hashcode值不等宿百,則equals方法得到的結(jié)果必定為false趁仙;
如果兩個(gè)對(duì)象的hashcode值相等,則equals方法得到的結(jié)果未知垦页。
在有些情況下雀费,程序設(shè)計(jì)者在設(shè)計(jì)一個(gè)類(lèi)的時(shí)候?yàn)樾枰貙?xiě)equals方法,比如String類(lèi)痊焊,但是千萬(wàn)要注意盏袄,在重寫(xiě)equals方法的同時(shí)忿峻,必須重寫(xiě)hashCode方法。
7.?ArrayList辕羽、LinkedList逛尚、Vector的區(qū)別。
1刁愿、ArrayList绰寞、Vector、LinkedList類(lèi)都是java.util包中铣口,均為可伸縮數(shù)組克握。
2、ArrayList和Vector底層都是數(shù)組實(shí)現(xiàn)的枷踏,所以菩暗,索引數(shù)據(jù)快,刪除旭蠕、插入數(shù)據(jù)慢停团。
ArrayList采用異步的方式,性能好掏熬,屬于非線程安全的操作類(lèi)佑稠。(JDK1.2)
Vector采用同步的方式,性能較低旗芬,屬于線程安全的操作類(lèi)舌胶。(JDK1.0)
3、LinkedList底層是鏈表實(shí)現(xiàn)疮丛,所以幔嫂,索引慢,刪除誊薄、插入快履恩,屬于非線程安全的操作類(lèi)。
8.?String、StringBuffer與StringBuilder的區(qū)別片吊。
stringBuffer绽昏、StringBuilder和String一樣,也用來(lái)代表字符串俏脊。String類(lèi)是不可變類(lèi)全谤,任何對(duì)String的改變都 會(huì)引發(fā)新的String對(duì)象的生成;StringBuffer則是可變類(lèi)联予,任何對(duì)它所指代的字符串的改變都不會(huì)產(chǎn)生新的對(duì)象.
StringBufferd支持并發(fā)操作啼县,線性安全的材原,適 合多線程中使用。StringBuilder不支持并發(fā)操作季眷,線性不安全的余蟹,不適合多線程中使用。新引入的StringBuilder類(lèi)不是線程安全的子刮,但其在單線程中的性能比StringBuffer高威酒。
9.?Map、Set挺峡、List葵孤、Queue、Stack的特點(diǎn)與用法橱赠。
Collection 是對(duì)象集合尤仍, Collection 有兩個(gè)子接口 List 和 Set
List?可以通過(guò)下標(biāo)?(1,2..)?來(lái)取得值,值可以重復(fù)
而?Set?只能通過(guò)游標(biāo)來(lái)取值狭姨,并且值是不能重復(fù)的
ArrayList?宰啦,?Vector?,?LinkedList?是?List?的實(shí)現(xiàn)類(lèi)
ArrayList?是線程不安全的饼拍,?Vector?是線程安全的赡模,這兩個(gè)類(lèi)底層都是由數(shù)組實(shí)現(xiàn)的
LinkedList?是線程不安全的,底層是由鏈表實(shí)現(xiàn)的
Map?是鍵值對(duì)集合
HashTable?和?HashMap?是?Map?的實(shí)現(xiàn)類(lèi)
HashTable?是線程安全的师抄,不能存儲(chǔ)?null?值
HashMap?不是線程安全的漓柑,可以存儲(chǔ)?null?值
Stack類(lèi):繼承自Vector,實(shí)現(xiàn)一個(gè)后進(jìn)先出的棧叨吮。提供了幾個(gè)基本方法辆布,push、pop挤安、peak谚殊、empty、search等蛤铜。
Queue接口:提供了幾個(gè)基本方法,offer丛肢、poll围肥、peek等。已知實(shí)現(xiàn)類(lèi)有LinkedList蜂怎、PriorityQueue等穆刻。
Map
Map是鍵值對(duì),鍵Key是唯一不能重復(fù)的杠步,一個(gè)鍵對(duì)應(yīng)一個(gè)值氢伟,值可以重復(fù)榜轿。
TreeMap可以保證順序,HashMap不保證順序朵锣,即為無(wú)序的谬盐。
Map中可以將Key和Value單獨(dú)抽取出來(lái),其中KeySet()方法可以將所有的keys抽取正一個(gè)Set诚些。而Values()方法可以將map中所有的values抽取成一個(gè)集合飞傀。
Set
不包含重復(fù)元素的集合,set中最多包含一個(gè)null元素
只能用Lterator實(shí)現(xiàn)單項(xiàng)遍歷诬烹,Set中沒(méi)有同步方法砸烦。
List
有序的可重復(fù)集合。
可以在任意位置增加刪除元素绞吁。
用Iterator實(shí)現(xiàn)單向遍歷幢痘,也可用ListIterator實(shí)現(xiàn)雙向遍歷
Queue
Queue遵從先進(jìn)先出原則。
使用時(shí)盡量避免add()和remove()方法,而是使用offer()來(lái)添加元素家破,使用poll()來(lái)移除元素颜说,它的優(yōu)點(diǎn)是可以通過(guò)返回值來(lái)判斷是否成功。
LinkedList實(shí)現(xiàn)了Queue接口员舵。
Queue通常不允許插入null元素脑沿。
Stack
Stack遵從后進(jìn)先出原則。
Stack繼承自Vector马僻。
它通過(guò)五個(gè)操作對(duì)類(lèi)Vector進(jìn)行擴(kuò)展庄拇,允許將向量視為堆棧,它提供了通常的push和pop操作韭邓,以及取堆棧頂點(diǎn)的peek()方法措近、測(cè)試堆棧是否為空的empty方法等
用法
如果涉及堆棧,隊(duì)列等操作女淑,建議使用List
對(duì)于快速插入和刪除元素的瞭郑,建議使用LinkedList
如果需要快速隨機(jī)訪問(wèn)元素的,建議使用ArrayList
10.?HashMap和HashTable的區(qū)別鸭你。
1 HashMap不是線程安全的
HashMap是map接口的子類(lèi)屈张,是將鍵映射到值的對(duì)象,其中鍵和值都是對(duì)象袱巨,并且不能包含重復(fù)鍵阁谆,但可以包含重復(fù)值。HashMap允許null key和null value愉老,而hashtable不允許场绿。
2?? HashTable是線程安全。
HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn))嫉入,他們都完成了Map接口焰盗,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全璧尸,效率上可能高于Hashtable。
11.?HashMap和ConcurrentHashMap的區(qū)別熬拒,HashMap的底層源碼爷光。
Hashmap本質(zhì)是數(shù)組加鏈表。根據(jù)key取得hash值梦湘,然后計(jì)算出數(shù)組下標(biāo)瞎颗,如果多個(gè)key對(duì)應(yīng)到同一個(gè)下標(biāo),就用鏈表串起來(lái)捌议,新插入的在前面哼拔。
ConcurrentHashMap:在hashMap的基礎(chǔ)上,ConcurrentHashMap將數(shù)據(jù)分為多個(gè)segment瓣颅,默認(rèn)16個(gè)(concurrency level)倦逐,然后每次操作對(duì)一個(gè)segment加鎖,避免多線程鎖的幾率宫补,提高并發(fā)效率檬姥。
12.?TreeMap健民、HashMap、LindedHashMap的區(qū)別贫贝。
共同點(diǎn):
HashMap,LinkedHashMap,TreeMap都屬于Map秉犹;Map 主要用于存儲(chǔ)鍵(key)值(value)對(duì),根據(jù)鍵得到值稚晚,因此鍵不允許鍵重復(fù),但允許值重復(fù)崇堵。
不同點(diǎn):
1.HashMap里面存入的鍵值對(duì)在取出的時(shí)候是隨機(jī)的,也是我們最常用的一個(gè)Map.它根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問(wèn)速度客燕。在Map 中插入鸳劳、刪除和定位元素,HashMap 是最好的選擇也搓。
2.TreeMap取出來(lái)的是排序后的鍵值對(duì)赏廓。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會(huì)更好傍妒。
3. LinkedHashMap 是HashMap的一個(gè)子類(lèi)楚昭,如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實(shí)現(xiàn). ?(應(yīng)用場(chǎng)景:購(gòu)物車(chē)等需要順序的)
13.?Collection包結(jié)構(gòu),與Collections的區(qū)別拍顷。
Collection是集合類(lèi)的一個(gè)頂級(jí)接口,其直接繼承接口有List與Set
而Collections則是集合類(lèi)的一個(gè)工具類(lèi)/幫助類(lèi)塘幅,其中提供了一系列靜態(tài)方法昔案,用于對(duì)集合中元素進(jìn)行排序尿贫、搜索以及線程安全等各種操作。
Collection是個(gè)java.util下的接口踏揣,它是各種集合結(jié)構(gòu)的父接口庆亡。
Collections是個(gè)java.util下的類(lèi),它包含有各種有關(guān)集合操作的靜態(tài)方法捞稿。
Collection
1又谋、Collection是集合類(lèi)的頂級(jí)接口;
2娱局、實(shí)現(xiàn)接口和類(lèi)主要有Set彰亥、List、LinkedList衰齐、ArrayList任斋、Vector、Stack耻涛、Set废酷;
Collections
1、是針對(duì)集合類(lèi)的一個(gè)幫助類(lèi)抹缕,提供操作集合的工具方法澈蟆;
2、一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索卓研、排序趴俘、線程安全化等操作;
3鉴分、服務(wù)于Java的Collection的框架哮幢;
14.?try?catch?finally,try里有return志珍,finally還執(zhí)行么橙垢?
1、不管有木有出現(xiàn)異常伦糯,finally塊中代碼都會(huì)執(zhí)行柜某;
2、當(dāng)try和catch中有return時(shí)敛纲,finally仍然會(huì)執(zhí)行喂击;
3、finally是在return后面的表達(dá)式運(yùn)算后執(zhí)行的(此時(shí)并沒(méi)有返回運(yùn)算后的值淤翔,而是先把要返回的值保存起來(lái)翰绊,管finally中的代碼怎么樣,返回的值都不會(huì)改變,任然是之前保存的值)监嗜,所以函數(shù)返回值是在finally執(zhí)行前確定的谐檀;
4、finally中最好不要包含return裁奇,否則程序會(huì)提前退出桐猬,返回值不是try或catch中保存的返回值。
15.?Excption與Error包結(jié)構(gòu)刽肠。OOM你遇到過(guò)哪些情況溃肪,SOF你遇到過(guò)哪些情況。
Android的OOM(Out Of Memory)
當(dāng)內(nèi)存占有量超過(guò)了虛擬機(jī)的分配的最大值時(shí)就會(huì)產(chǎn)生內(nèi)存溢出(VM里面分配不出更多的page)音五。
一般出現(xiàn)情況:加載的圖片太多或圖片過(guò)大時(shí)惫撰、分配特大的數(shù)組、內(nèi)存相應(yīng)資源過(guò)多沒(méi)有來(lái)不及釋放放仗。
解決方法:
①在內(nèi)存引用上做處理
軟引用是主要用于內(nèi)存敏感的高速緩存润绎。在jvm報(bào)告內(nèi)存不足之前會(huì)清除所有的軟引用,這樣以來(lái)gc就有可能收集軟可及的對(duì)象诞挨,可能解決內(nèi)存吃緊問(wèn)題莉撇,避免內(nèi)存溢出。什么時(shí)候會(huì)被收集取決于gc的算法和gc運(yùn)行時(shí)可用內(nèi)存的大小惶傻。
②對(duì)圖片做邊界壓縮棍郎,配合軟引用使用
③顯示的調(diào)用GC來(lái)回收內(nèi)存
SOF (堆棧溢出 StackOverflow)
StackOverflowError 的定義:
當(dāng)應(yīng)用程序遞歸太深而發(fā)生堆棧溢出時(shí),拋出該錯(cuò)誤银室。
因?yàn)闂R话隳J(rèn)為1-2m涂佃,一旦出現(xiàn)死循環(huán)或者是大量的遞歸調(diào)用,在不斷的壓棧過(guò)程中蜈敢,造成棧容量超過(guò)1m而導(dǎo)致溢出辜荠。
棧溢出的原因:
遞歸調(diào)用
大量循環(huán)或死循環(huán)
全局變量是否過(guò)多
數(shù)組、List抓狭、map數(shù)據(jù)過(guò)大
[Java] Excption與Error包結(jié)構(gòu),OOM和SOF
16.?Java面向?qū)ο蟮娜齻€(gè)特征與含義伯病。
17.?Override和Overload的含義去區(qū)別。
方法的重寫(xiě)(Overriding)和重載(Overloading)是Java多態(tài)性的不同表現(xiàn)否过。
重寫(xiě)(Overriding)是父類(lèi)與子類(lèi)之間多態(tài)性的一種表現(xiàn)午笛,而重載(Overloading)是一個(gè)類(lèi)中多態(tài)性的一種表現(xiàn)。如果在子類(lèi)中定義某方法與其父類(lèi)有相同的名稱(chēng)和參數(shù)苗桂,我們說(shuō)該方法被重寫(xiě) (Overriding) 药磺。子類(lèi)的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類(lèi)中的定義煤伟,對(duì)它而言癌佩,父類(lèi)中的定義如同被"屏蔽"了木缝。如果在一個(gè)類(lèi)中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類(lèi)型或有不同的參數(shù)次序驼卖,則稱(chēng)為方法的重載(Overloading)氨肌。不能通過(guò)訪問(wèn)權(quán)限、返回類(lèi)型酌畜、拋出的異常進(jìn)行重載。
1. Override 特點(diǎn)
1卿叽、覆蓋的方法的標(biāo)志必須要和被覆蓋的方法的標(biāo)志完全匹配桥胞,才能達(dá)到覆蓋的效果;
2考婴、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致贩虾;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致沥阱,或者是其子類(lèi)缎罢;
4、方法被定義為final不能被重寫(xiě)考杉。
5策精、對(duì)于繼承來(lái)說(shuō),如果某一方法在父類(lèi)中是訪問(wèn)權(quán)限是private崇棠,那么就不能在子類(lèi)對(duì)其進(jìn)行重寫(xiě)覆蓋咽袜,如果定義的話,也只是定義了一個(gè)新方法枕稀,而不會(huì)達(dá)到重寫(xiě)覆蓋的效果询刹。(通常存在于父類(lèi)和子類(lèi)之間。)
2.Overload 特點(diǎn)
1萎坷、在使用重載時(shí)只能通過(guò)不同的參數(shù)樣式凹联。例如,不同的參數(shù)類(lèi)型哆档,不同的參數(shù)個(gè)數(shù)蔽挠,不同的參數(shù)順序(當(dāng)然,同一方法內(nèi)的幾個(gè)參數(shù)類(lèi)型必須不一樣虐呻,例如可以是fun(int, float)象泵, 但是不能為fun(int, int));
2斟叼、不能通過(guò)訪問(wèn)權(quán)限偶惠、返回類(lèi)型、拋出的異常進(jìn)行重載朗涩;
3忽孽、方法的異常類(lèi)型和數(shù)目不會(huì)對(duì)重載造成影響;
4、重載事件通常發(fā)生在同一個(gè)類(lèi)中兄一,不同方法之間的現(xiàn)象厘线。
5、存在于同一類(lèi)中出革,但是只有虛方法和抽象方法才能被覆寫(xiě)造壮。
其具體實(shí)現(xiàn)機(jī)制:
overload是重載,重載是一種參數(shù)多態(tài)機(jī)制骂束,即代碼通過(guò)參數(shù)的類(lèi)型或個(gè)數(shù)不同而實(shí)現(xiàn)的多態(tài)機(jī)制耳璧。 是一種靜態(tài)的綁定機(jī)制(在編譯時(shí)已經(jīng)知道具體執(zhí)行的是哪個(gè)代碼段)。
override是覆蓋展箱。覆蓋是一種動(dòng)態(tài)綁定的多態(tài)機(jī)制旨枯。即在父類(lèi)和子類(lèi)中同名元素(如成員函數(shù))有不同 的實(shí)現(xiàn)代碼。執(zhí)行的是哪個(gè)代碼是根據(jù)運(yùn)行時(shí)實(shí)際情況而定的混驰。
18.?Interface與abstract類(lèi)的區(qū)別攀隔。
abstract類(lèi)
1、抽象類(lèi)不能被實(shí)例化栖榨,實(shí)例化的工作應(yīng)該交由它的子類(lèi)來(lái)完成昆汹,它只需要有一個(gè)引用即可。
2治泥、抽象方法必須由子類(lèi)來(lái)進(jìn)行重寫(xiě)筹煮。
3、只要包含一個(gè)抽象方法的抽象類(lèi)居夹,該方法必須要定義成抽象類(lèi)败潦,不管是否還包含有其他方法。
4准脂、抽象類(lèi)中可以包含具體的方法劫扒,當(dāng)然也可以不包含抽象方法。
5狸膏、子類(lèi)中的抽象方法不能與父類(lèi)的抽象方法同名沟饥。
6、abstract不能與final并列修飾同一個(gè)類(lèi)湾戳。
7贤旷、abstract 不能與private、static砾脑、final或native并列修飾同一個(gè)方法幼驶。
接口
1、個(gè)Interface的方所有法訪問(wèn)權(quán)限自動(dòng)被聲明為public韧衣。確切的說(shuō)只能為public盅藻,當(dāng)然你可以顯示的聲明為protected购桑、private,但是編譯會(huì)出錯(cuò)氏淑!
2勃蜘、接口中可以定義“成員變量”假残,或者說(shuō)是不可變的常量守问,因?yàn)榻涌谥械摹俺蓡T變量”會(huì)自動(dòng)變?yōu)闉閜ublic static final匀归。可以通過(guò)類(lèi)命名直接訪問(wèn):ImplementClass.name。
3仿便、接口中不存在實(shí)現(xiàn)的方法。
4攒巍、實(shí)現(xiàn)接口的非抽象類(lèi)必須要實(shí)現(xiàn)該接口的所有方法嗽仪。抽象類(lèi)可以不用實(shí)現(xiàn)柒莉。
5兢孝、不能使用new操作符實(shí)例化一個(gè)接口,但可以聲明一個(gè)接口變量雳殊,該變量必須引用(refer to)一個(gè)實(shí)現(xiàn)該接口的類(lèi)的對(duì)象窗轩×∫眨可以使用 instanceof 檢查一個(gè)對(duì)象是否實(shí)現(xiàn)了某個(gè)特定的接口堤舒。例如:if(anObject instanceof Comparable){}。
6镀岛、在實(shí)現(xiàn)多接口的時(shí)候一定要避免方法名的重復(fù)漂羊。
Interface與abstract類(lèi)的區(qū)別
19.?Static?class?與non?static?class的區(qū)別。
Static class
1椭豫、用static修飾的是內(nèi)部類(lèi)赏酥,此時(shí)這個(gè)
內(nèi)部類(lèi)變?yōu)殪o態(tài)內(nèi)部類(lèi)裸扶;對(duì)測(cè)試有用搬素;
2熬尺、內(nèi)部靜態(tài)類(lèi)不需要有指向外部類(lèi)的引用;
3季二、靜態(tài)類(lèi)只能訪問(wèn)外部類(lèi)的靜態(tài)成員胯舷,不能訪問(wèn)外部類(lèi)的非靜態(tài)成員需纳;
non static class
1艺挪、非靜態(tài)內(nèi)部類(lèi)需要持有對(duì)外部類(lèi)的引用麻裳;
2津坑、非靜態(tài)內(nèi)部類(lèi)能夠訪問(wèn)外部類(lèi)的靜態(tài)和非靜態(tài)成員;
3眉反、一個(gè)非靜態(tài)內(nèi)部類(lèi)不能脫離外部類(lèi)實(shí)體被創(chuàng)建寸五;
4梳杏、一個(gè)非靜態(tài)內(nèi)部類(lèi)可以訪問(wèn)外部類(lèi)的數(shù)據(jù)和方法;
20.?java多態(tài)的實(shí)現(xiàn)原理叛溢。
21.?實(shí)現(xiàn)多線程的兩種方法:Thread與Runable楷掉。
Java有兩種方式實(shí)現(xiàn)多線程靖诗,第一個(gè)是繼承Thread類(lèi),第二個(gè)是實(shí)現(xiàn)Runnable接口鄙才。他們之間的聯(lián)系:
1攒庵、Thread類(lèi)實(shí)現(xiàn)了Runable接口浓冒。
2、都需要重寫(xiě)里面Run方法闲擦。
他們之間的區(qū)別“
1墅冷、實(shí)現(xiàn)Runnable的類(lèi)更具有健壯性寞忿,避免了單繼承的局限顶岸。
2、Runnable更容易實(shí)現(xiàn)資源共享搓逾,能多個(gè)線程同時(shí)處理一個(gè)資源恃逻。
22.?線程同步的方法:sychronized寇损、lock裳食、reentrantLock等诲祸。
線程同步的方法:sychronized救氯、lock、reentrantLock等總結(jié)分析
23.?鎖的等級(jí):方法鎖墩衙、對(duì)象鎖漆改、類(lèi)鎖挫剑。
java synchronized關(guān)鍵字的用法以及鎖的等級(jí):方法鎖樊破、對(duì)象鎖秀存、類(lèi)鎖
24.?寫(xiě)出生產(chǎn)者消費(fèi)者模式或链。
生產(chǎn)者消費(fèi)者模式-Java實(shí)現(xiàn)
25.?ThreadLocal的設(shè)計(jì)理念與作用澳盐。
ThreadLocal的設(shè)計(jì)與使用(原理篇)
26.?ThreadPool用法與優(yōu)勢(shì)。
【Java高級(jí)】ThreadPool用法與優(yōu)勢(shì)
線程池ThreadPoolExecutor使用簡(jiǎn)介
27.?Concurrent包里的其他東西:ArrayBlockingQueue粒没、CountDownLatch等等簇爆。
java.util.concurrent包分成了三個(gè)部分入蛆,分別是java.util.concurrent哨毁、java.util.concurrent.atomic和java.util.concurrent.lock扼褪。內(nèi)容涵蓋了并發(fā)集合類(lèi)话浇、線程池機(jī)制、同步互斥機(jī)制抄沮、線程安全的變量更新工具類(lèi)、鎖等等常用工具蹋订。
BlockingQueue接口定義了一種阻塞的FIFO queue露戒,每一個(gè)BlockingQueue都有一個(gè)容量智什,讓容量滿時(shí)往BlockingQueue中添加數(shù)據(jù)時(shí)會(huì)造成阻塞荠锭,當(dāng)容量為空時(shí)取元素操作會(huì)阻塞晨川。
ArrayBlockingQueue是一個(gè)由數(shù)組支持的有界阻塞隊(duì)列。在讀寫(xiě)操作上都需要鎖住整個(gè)容器呀页,因此吞吐量與一般的實(shí)現(xiàn)是相似的蓬蝶,適合于實(shí)現(xiàn)“生產(chǎn)者消費(fèi)者”模式丸氛。
CountDownLatch是JAVA提供在java.util.concurrent包下的一個(gè)輔助類(lèi)雪位,可以把它看成是一個(gè)計(jì)數(shù)器雹洗,其內(nèi)部維護(hù)著一個(gè)count計(jì)數(shù)卧波,只不過(guò)對(duì)這個(gè)計(jì)數(shù)器的操作都是原子操作港粱,同時(shí)只能有一個(gè)線程去操作這個(gè)計(jì)數(shù)器查坪,CountDownLatch通過(guò)構(gòu)造函數(shù)傳入一個(gè)初始計(jì)數(shù)值偿曙,調(diào)用者可以通過(guò)調(diào)用CounDownLatch對(duì)象的cutDown()方法望忆,來(lái)使計(jì)數(shù)減1启摄;如果調(diào)用對(duì)象上的await()方法歉备,那么調(diào)用者就會(huì)一直阻塞在這里,直到別人通過(guò)cutDown方法落午,將計(jì)數(shù)減到0溃斋,才可以繼續(xù)執(zhí)行睡互。
28.?wait()和sleep()的區(qū)別蛉威。
對(duì)于sleep()方法蚯嫌,我們首先要知道該方法是屬于Thread類(lèi)中的择示。而wait()方法栅盲,則是屬于Object類(lèi)中的谈秫。
sleep()方法導(dǎo)致了程序暫停執(zhí)行指定的時(shí)間鱼鼓,但是他的監(jiān)控狀態(tài)依然保持者迄本,當(dāng)指定的時(shí)間到了又會(huì)自動(dòng)恢復(fù)運(yùn)行狀態(tài)岸梨。在調(diào)用sleep()方法的過(guò)程中曹阔,線程不會(huì)釋放對(duì)象鎖赃份。而且sleep()只能自己到點(diǎn)了醒來(lái)抓韩,不能被喚醒谒拴。
wait()方法的時(shí)候英上,線程會(huì)放棄對(duì)象鎖苍日,進(jìn)入等待此對(duì)象的等待鎖定池相恃,只有針對(duì)此對(duì)象調(diào)用notify()方法后本線程才進(jìn)入對(duì)象鎖定池拦耐,準(zhǔn)備獲取對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)揩魂。
29.?foreach與正常for循環(huán)效率對(duì)比火脉。
需要循環(huán)數(shù)組結(jié)構(gòu)的數(shù)據(jù)時(shí)倦挂,建議使用普通for循環(huán)方援,因?yàn)閒or循環(huán)采用下標(biāo)訪問(wèn)犯戏,對(duì)于數(shù)組結(jié)構(gòu)的數(shù)據(jù)來(lái)說(shuō)先匪,采用下標(biāo)訪問(wèn)比較好呀非。
需要循環(huán)鏈表結(jié)構(gòu)的數(shù)據(jù)時(shí),一定不要使用普通for循環(huán)速缆,這種做法很糟糕艺糜,數(shù)據(jù)量大的時(shí)候有可能會(huì)導(dǎo)致系統(tǒng)崩潰倦踢。
30.?Java?IO與NIO辱挥。
NIO vs IO之間的理念上面的區(qū)別(NIO將阻塞交給了后臺(tái)線程執(zhí)行)
IO是面向流的晤碘,NIO是面向緩沖區(qū)的
Java IO面向流意味著每次從流中讀一個(gè)或多個(gè)字節(jié)园爷,直至讀取所有字節(jié)童社,它們沒(méi)有被緩存在任何地方扰楼;
NIO則能前后移動(dòng)流中的數(shù)據(jù),因?yàn)槭敲嫦蚓彌_區(qū)的
IO流是阻塞的浦辨,NIO流是不阻塞的
Java IO的各種流是阻塞的币厕。這意味著旦装,當(dāng)一個(gè)線程調(diào)用read() 或 write()時(shí),該線程被阻塞惭载,直到有一些數(shù)據(jù)被讀取描滔,或數(shù)據(jù)完全寫(xiě)入含长。該線程在此期間不能再干任何事情了
Java NIO的非阻塞模式拘泞,使一個(gè)線程從某通道發(fā)送請(qǐng)求讀取數(shù)據(jù)陪腌,但是它僅能得到目前可用的數(shù)據(jù)染簇,如果目前沒(méi)有數(shù)據(jù)可用時(shí)锻弓,就什么都不會(huì)獲取青灼。NIO可讓您只使用一個(gè)(或幾個(gè))單線程管理多個(gè)通道(網(wǎng)絡(luò)連接或文件)聚至,但付出的代價(jià)是解析數(shù)據(jù)可能會(huì)比從一個(gè)阻塞流中讀取數(shù)據(jù)更復(fù)雜扳躬。
非阻塞寫(xiě)也是如此贷币。一個(gè)線程請(qǐng)求寫(xiě)入一些數(shù)據(jù)到某通道役纹,但不需要等待它完全寫(xiě)入促脉,這個(gè)線程同時(shí)可以去做別的事情瘸味。
選擇器
Java NIO的選擇器允許一個(gè)單獨(dú)的線程來(lái)監(jiān)視多個(gè)輸入通道宫仗,你可以注冊(cè)多個(gè)通道使用一個(gè)選擇器,然后使用一個(gè)單獨(dú)的線程來(lái)“選擇”通道:這些通道里已經(jīng)有可以處理的輸入旁仿,或者選擇已準(zhǔn)備寫(xiě)入的通道藕夫。這種選擇機(jī)制,使得一個(gè)單獨(dú)的線程很容易來(lái)管理多個(gè)通道枯冈。
31.?反射的作用與原理毅贮。
32.?泛型常用特點(diǎn)尘奏,List能否轉(zhuǎn)為L(zhǎng)ist滩褥。
33.?解析XML的幾種方式的原理與特點(diǎn):DOM、SAX罪既、PULL铸题。
34.?Java與C++對(duì)比。
35.?Java1.7與1.8新特性琢感。
36.?設(shè)計(jì)模式:?jiǎn)卫洹⒐S、適配器驹针、責(zé)任鏈烘挫、觀察者等等。
37.?JNI的使用柬甥。
嘔心瀝血Android studio使用JNI實(shí)例
Java里有很多很雜的東西饮六,有時(shí)候需要你閱讀源碼,大多數(shù)可能書(shū)里面講的不是太清楚苛蒲,需要你在網(wǎng)上尋找答案卤橄。
推薦書(shū)籍:《java核心技術(shù)卷I》《Thinking?in?java》《java并發(fā)編程》《effictive?java》《大話設(shè)計(jì)模式》
參考