1.抽象和封裝的不同點
抽象和封裝是互補的概念。一方面,抽象關(guān)注對象的行為菇怀。另一方面,封裝關(guān)注對象行為的細節(jié)哟楷。一般是通過隱藏對象內(nèi)部狀態(tài)信息做到封裝,因此否灾,封裝可以看成是用來提供抽象的一種策略卖擅。
2.重載和重寫的區(qū)別
重載: 發(fā)生在同一個類中,方法名必須相同坟冲,參數(shù)類型不同磨镶、個數(shù)不同、順序不同健提,方法返回值和訪問修飾符可以不同琳猫,發(fā)生在編譯時。
重寫: 發(fā)生在父子類中私痹,方法名脐嫂、參數(shù)列表必須相同,返回值范圍小于等于父類紊遵,拋出的異常范圍小于等于父類账千,訪問修飾符范圍大于等于父類;如果父類方法訪問修飾符為private則子類就不能重寫該方法暗膜。
3.字符型常量和字符串常量的區(qū)別
字符常量是單引號引起的一個字符 字符串常量是雙引號引起的若干個字符字符常量相當(dāng)于一個整形值(ASCII值),可以參加表達式運算 字符串常量代表一個地址值(該字符串在內(nèi)存中存放位置)字符常量只占一個字節(jié) 字符串常量占若干個字節(jié)(至少一個字符結(jié)束標(biāo)志)4.成員變量與局部變量的區(qū)別有那些匀奏?
從語法形式上,看成員變量是屬于類的学搜,而局部變量是在方法中定義的變量或是方法的參數(shù)娃善;成員變量可以被public,private,static等修飾符所修飾,而局部變量不能被訪問控制修飾符及static所修飾瑞佩;但是聚磺,成員變量和局部變量都能被final所修飾;從變量在內(nèi)存中的存儲方式來看炬丸,成員變量是對象的一部分瘫寝,而對象存在于堆內(nèi)存,局部變量存在于棧內(nèi)存從變量在內(nèi)存中的生存時間上看稠炬,成員變量是對象的一部分焕阿,它隨著對象的創(chuàng)建而存在,而局部變量隨著方法的調(diào)用而自動消失酸纲。成員變量如果沒有被賦初值捣鲸,則會自動以類型的默認值而賦值(一種情況例外被final修飾但沒有被static修飾的成員變量必須顯示地賦值);而局部變量則不會自動賦值闽坡。5.講講對static的理解栽惶?Java中是否可以覆蓋一個private或者是static的方法?
如果一個類的變量或者方法前面有static修飾疾嗅,那么表明這個方法或者變量屬于這個類外厂,也就是說可以在不創(chuàng)建對象的情況下直接使用
當(dāng)父類的方法被private修飾時,表明該方法為父類私有代承,對其他任何類都是不可見的汁蝶,因此如果子類定了一個與父類一樣的方法,這對于子類來說相當(dāng)于是一個新的私有方法论悴,且如果要進行向上轉(zhuǎn)型掖棉,然后去調(diào)用該“覆蓋方法”,會產(chǎn)生編譯錯誤
static方法時編譯時靜態(tài)綁定的膀估,屬于類幔亥,而覆蓋是運行時動態(tài)綁定的(動態(tài)綁定的多態(tài)),因此不能覆蓋.
6.是否可以在static環(huán)境中訪問非static變量?
static變量在Java中是屬于類的察纯,它在所有的實例中的值是一樣的帕棉。
當(dāng)類被Java虛擬機載入的時候,會對static變量進行初始化饼记。
如果代碼嘗試不用實例來訪問非static的變量香伴,編譯器會報錯,因為這些變量還沒有被創(chuàng)建出來具则,還沒有跟任何實例關(guān)聯(lián)上即纲。
7.Java支持的基本數(shù)據(jù)類型有哪些?
java支持的基本數(shù)據(jù)類型有以下9種:byte,shot,int,long,float,double,char,boolean,void.
8.怎么理解JAVA的自動拆箱裝箱博肋?
所謂自動裝箱就是將基本數(shù)據(jù)類型自動的轉(zhuǎn)換為對應(yīng)的對象包裝類型低斋,而拆箱就是將對象包裝類型轉(zhuǎn)換為基本數(shù)據(jù)類型。
java中的自動拆裝箱通常發(fā)生在變量賦值的過程中束昵,如:把int轉(zhuǎn)化成Integer拔稳,double轉(zhuǎn)化成double就是自動裝箱,反之就是自動拆箱
在實際中锹雏,應(yīng)該注意自動拆裝箱巴比,因為有時可能因為java自動裝箱機制,而導(dǎo)致創(chuàng)建了許多對象礁遵,對于內(nèi)存小的平臺會造成壓力轻绞。
9. 重寫和重載是什么?
重寫:發(fā)生在子類與父類之間,表示子類中的方法可以與父類中的某個方法的名稱和參數(shù)完全相同佣耐,通過子類創(chuàng)建的實例對象調(diào)用這個方法時政勃,將調(diào)用子類中的定義方法,這相當(dāng)于把父類中定義的那個完全相同的方法給覆蓋了兼砖,這也是面向?qū)ο缶幊痰亩鄳B(tài)性的一種表現(xiàn)奸远。重載:是指在一個類中既棺,可以有多個相同名稱的方法,但是他們的參數(shù)列表的個數(shù)或類型不同懒叛,當(dāng)調(diào)用該方法時丸冕,根據(jù)傳遞的參數(shù)類型調(diào)用對應(yīng)參數(shù)列表的方法。當(dāng)參數(shù)列表相同但返回值不同時薛窥,將會出現(xiàn)編譯錯誤胖烛,這并不是重載,因為jvm無法根據(jù)返回值類型來判斷應(yīng)該調(diào)用哪個方法诅迷。10.Java支持多繼承么佩番?如果不支持,如何實現(xiàn)?
不支持罢杉,Java不支持多繼承趟畏。每個類都只能繼承一個類,但是可以實現(xiàn)多個接口屑那。
在java中是單繼承的拱镐,也就是說一個類只能繼承一個父類。
java中實現(xiàn)多繼承有兩種方式,一是接口持际,而是內(nèi)部類.
11.什么是值傳遞和引用傳遞沃琅?Java中是值傳遞還是引用傳遞,還是都有?
值傳遞:就是在方法調(diào)用的時候蜘欲,實參是將自己的一份拷貝賦給形參益眉,在方法內(nèi),對該參數(shù)值的修改不影響原來實參姥份。引用傳遞:是在方法調(diào)用的時候郭脂,實參將自己的地址傳遞給形參,此時方法內(nèi)對該參數(shù)值的改變澈歉,就是對該實參的實際操作展鸡。在java中只有一種傳遞方式,那就是值傳遞.可能比較讓人迷惑的就是java中的對象傳遞時埃难,對形參的改變依然會影響到該對象的內(nèi)容莹弊。
12.接口和抽象類的區(qū)別是什么?
接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法涡尘。類可以實現(xiàn)很多個接口忍弛,但是只能繼承一個抽象類類如果要實現(xiàn)一個接口,它必須要實現(xiàn)接口聲明的所有方法考抄。但是细疚,類可以不實現(xiàn)抽象類聲明的所有方法,當(dāng)然川梅,在這種情況下疯兼,類也必須得聲明成是抽象的然遏。抽象類可以在不提供接口方法實現(xiàn)的情況下實現(xiàn)接口。Java 接口中聲明的變量默認都是 final 的镇防。抽象類可以包含非 final 的變量啦鸣。Java 接口中的成員函數(shù)默認是 public 的潮饱。抽象類的成員函數(shù)可以是 private来氧,protected 或者是 public 。接口是絕對抽象的香拉,不可以被實例化(java 8已支持在接口中實現(xiàn)默認的方法)啦扬。抽象類也不可以被實例化,但是凫碌,如果它包含 main 方法的話是可以被調(diào)用的扑毡。13.構(gòu)造器(constructor)是否可被重寫(override)?
構(gòu)造方法是不能被子類重寫的,但是構(gòu)造方法可以重載
簡單的講盛险,就是說一個類可以有多個構(gòu)造方法瞄摊。
14. String, StringBuffer StringBuilder的區(qū)別
String 的長度是不可變的;StringBuffer的長度是可變的苦掘,線程安全换帜;如果對一個字符串要經(jīng)常改變的話,就一定不要用String,否則會創(chuàng)建許多無用的對象出來.15.HashMap的工作原理是什么?
HashMap內(nèi)部是通過一個數(shù)組實現(xiàn)的鹤啡,只是這個數(shù)組比較特殊惯驼,數(shù)組里存儲的元素是一個Entry實體(在JAVA8中為Node),這個Entry實體主要包含key递瑰、value以及一個指向自身的next指針祟牲。
HashMap是基于hashing實現(xiàn)的,當(dāng)進行put操作時抖部,根據(jù)傳遞的key值得到它的hashcode说贝,然后再用這個hashcode與數(shù)組的長度進行模運算,得到一個int值慎颗,就是Entry要存儲在數(shù)組的位置(下標(biāo))乡恕;當(dāng)通過get方法獲取指定key的值時,會根據(jù)這個key算出它的hash值(數(shù)組下標(biāo))哗总,根據(jù)這個hash值獲取數(shù)組下標(biāo)對應(yīng)的Entry几颜,然后判斷Entry里的key,hash值或者通過equals()比較是否與要查找的相同讯屈,如果相同蛋哭,返回value,否則的話涮母,遍歷該鏈表(有可能就只有一個Entry谆趾,此時直接返回null)躁愿,直到找到為止,否則返回null沪蓬。
HashMap之所以在每個數(shù)組元素存儲的是一個鏈表彤钟,是為了解決hash沖突問題,當(dāng)兩個對象的hash值相等時跷叉,那么一個位置肯定是放不下兩個值的逸雹,于是hashmap采用鏈表來解決這種沖突,hash值相等的兩個元素會形成一個鏈表云挟。
16.HashMap與Hashtable的區(qū)別是什么?
Hashtable基于Dictionary類梆砸,而HashMap是基于AbstractMap。Dictionary是任何可將鍵映射到相應(yīng)值的類的抽象父類园欣,而AbstractMap是基于Map接口的實現(xiàn)帖世,它以最大限度地減少實現(xiàn)此接口所需的工作。HashMap和Hashtable都實現(xiàn)了Map接口沸枯,Hashtable基于Dictionary類日矫,而HashMap是基于AbstractMap。Dictionary是任何可將鍵映射到相應(yīng)值的類的抽象父類绑榴,而AbstractMap是基于Map接口的實現(xiàn)哪轿,它以最大限度地減少實現(xiàn)此接口所需的工作。HashMap允許鍵和值是null彭沼,而Hashtable不允許鍵或者值是null缔逛。Hashtable是同步(線程安全)的,而HashMap不是同步(非線程安全)姓惑。因此褐奴,HashMap更適合于單線程環(huán)境,而Hashtable適合于多線程環(huán)境于毙。HashMap提供了可供應(yīng)用迭代的鍵的集合敦冬,因此,HashMap是快速失敗的唯沮。另一方面脖旱,Hashtable提供了對鍵的列舉(Enumeration)。17.CorrentHashMap的工作原理
ConcurrenHashMap說是HashMap的升級版
ConcurrentHashMap是線程安全的介蛉,但是與Hashtable相比萌庆,實現(xiàn)線程安全的方式不同。
Hashtable是通過對hash表結(jié)構(gòu)進行鎖定币旧,是阻塞式的践险,當(dāng)一個線程占有這個鎖時,其他線程必須阻塞等待其釋放鎖。
ConcurrentHashMap是采用分離鎖的方式巍虫,它并沒有對整個hash表進行鎖定彭则,而是局部鎖定,也就是說當(dāng)一個線程占有這個局部鎖時占遥,不影響其他線程對hash表其他地方的訪問俯抖。
ConcurrentHashMap內(nèi)部有一個Segment<K,V>數(shù)組,該Segment對象可以充當(dāng)鎖。Segment對象內(nèi)部有一個HashEntry<K,V>數(shù)組瓦胎,于是每個Segment可以守護若干個桶(HashEntry),每個桶又有可能是一個HashEntry連接起來的鏈表芬萍,存儲發(fā)生碰撞的元素。
每個ConcurrentHashMap在默認并發(fā)級下會創(chuàng)建包含16個Segment對象的數(shù)組凛捏,每個數(shù)組有若干個桶担忧,當(dāng)進行put方法時,通過hash方法對key進行計算坯癣,得到hash值,找到對應(yīng)的segment最欠,然后對該segment進行加鎖示罗,然后調(diào)用segment的put方法進行存儲操作,此時其他線程就不能訪問當(dāng)前的segment芝硬,但可以訪問其他的segment對象蚜点,不會發(fā)生阻塞等待。
在Java8中拌阴,ConcurrentHashMap不再使用Segment分離鎖绍绘,而是采用一種樂觀鎖CAS算法來實現(xiàn)同步問題,但其底層還是“數(shù)組+鏈表->紅黑樹”的實現(xiàn)迟赃。
18.Array和ArrayList有什么區(qū)別陪拘?
Array可以容納基本類型和對象,而ArrayList只能容納對象纤壁。Array是指定大小的左刽,而ArrayList大小是固定的Array可以包含基本類型和對象類型,ArrayList只能包含對象類型酌媒。Array大小是固定的欠痴,ArrayList的大小是動態(tài)變化的。19.ArrayList和LinkedList有什么區(qū)別秒咨?
ArrayList和LinkedList都實現(xiàn)了List接口ArrayList是基于數(shù)組實現(xiàn)喇辽,它的底層是數(shù)組。它可以以O(shè)(1)時間復(fù)雜度對元素進行隨機訪問雨席。LinkedList是基于鏈表實現(xiàn)菩咨,每一個元素都和它的前一個和后一個元素鏈接在一起,在這種情況下,查找某個元素的時間復(fù)雜度是O(n)旦委。ArrayList在查找時速度快LinkedList的插入奇徒,添加,刪除操作速度更快缨硝,因為當(dāng)元素被添加到集合任意位置的時候摩钙,不需要像數(shù)組那樣重新計算大小或者是更新索引。LinkedList比ArrayList更占內(nèi)存查辩,因為LinkedList為每一個節(jié)點存儲了兩個引用胖笛,一個指向前一個元素,一個指向下一個元素宜岛。20.哪些集合類提供對元素的隨機訪問长踊?
ArrayList、HashMap萍倡、TreeMap和HashTable類提供對元素的隨機訪問身弊。
21.HashSet的底層實現(xiàn)是什么?
HashSet的實現(xiàn)是依賴于HashMap的,HashSet的值都是存儲在HashMap中的列敲。
在HashSet的構(gòu)造法中會初始化一個HashMap對象阱佛,HashSet不允許值重復(fù)。
因此戴而,HashSet的值是作為HashMap的key存儲在HashMap中的凑术,當(dāng)存儲的值已經(jīng)存在時返回false。
22.Comparable和Comparator接口的區(qū)別所意。
Comparable接口只包含一個compareTo()方法淮逊。這個方法可以個給兩個對象排序。具體來說扶踊,它返回負數(shù)泄鹏,0,正數(shù)來表明輸入對象小于姻檀,等于命满,大于已經(jīng)存在的對象。Comparator接口包含compare()和equals()兩個方法绣版。compare()方法用來給兩個輸入?yún)?shù)排序胶台,返回負數(shù),0杂抽,正數(shù)表明第一個參數(shù)是小于诈唬,等于,大于第二個參數(shù)缩麸。
equals()方法需要一個對象作為參數(shù)铸磅,它用來決定輸入?yún)?shù)是否和comparator相等。只有當(dāng)輸入?yún)?shù)也是一個comparator并且輸入?yún)?shù)和當(dāng)前comparator的排序結(jié)果是相同的時候,這個方法才返回true阅仔。
23.HashSet和TreeSet有什么區(qū)別吹散?
HashSet是由一個hash表來實現(xiàn)的,因此八酒,它的元素是無序的空民。add(),remove()羞迷,contains()方法的時間復(fù)雜度是O(1)界轩。TreeSet是由一個樹形的結(jié)構(gòu)來實現(xiàn)的,它里面的元素是有序的衔瓮。因此浊猾,add(),remove()热鞍,contains()方法的時間復(fù)雜度是O(logn)葫慎。24. Java中==與equals的區(qū)別
"==" 的作用是判斷兩個對象的地址是不是相等。即判斷兩個對象是不是同一個對象碍现。(基本數(shù)據(jù)類型==比較的是值幅疼,引用數(shù)據(jù)類型==比較的是內(nèi)存地址)equals() : 它的作用也是判斷兩個對象是否相等。但它一般有兩種使用情況:類沒有覆蓋equals()方法昼接。則通過equals()比較該類的兩個對象時,等價于通過“==”比較這兩個對象悴晰。類覆蓋了equals()方法慢睡。一般,我們都覆蓋equals()方法來兩個對象的內(nèi)容相等铡溪;若它們的內(nèi)容相等漂辐,則返回true(即,認為這兩個對象相等)棕硫。25.你重寫過 hashcode 和 equals 么髓涯,為什么重寫equals時必須重寫hashCode方法?
hashCode() 的作用是獲取哈希碼哈扮,也稱為散列碼纬纪;它實際上是返回一個int整數(shù)。這個哈希碼的作用是確定該對象在哈希表中的索引位置滑肉。如果兩個對象相等包各,則hashcode一定也是相同的如果兩個對象相等,對兩個對象分別調(diào)用equals方法都返回true如果兩個對象有相同的hashcode值,它們也不一定是相等的因此靶庙,equals方法被覆蓋過问畅,則hashCode方法也必須被覆蓋
hashCode()的默認行為是對堆上的對象產(chǎn)生獨特值。如果沒有重寫hashCode(),則該class的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數(shù)據(jù))
26.Java的四種引用护姆,強弱軟虛矾端,用到的場景
強引用:如果一個對象具有強引用,它就不會被垃圾回收器回收卵皂。即使當(dāng)前內(nèi)存空間不足秩铆,JVM也不會回收它,而是拋出 OutOfMemoryError 錯誤渐裂,使程序異常終止豺旬。如果想中斷強引用和某個對象之間的關(guān)聯(lián),可以顯式地將引用賦值為null柒凉,這樣一來的話族阅,JVM在合適的時間就會回收該對象軟引用:在使用軟引用時,如果內(nèi)存的空間足夠膝捞,軟引用就能繼續(xù)被使用坦刀,而不會被垃圾回收器回收,只有在內(nèi)存不足時蔬咬,軟引用才會被垃圾回收器回收鲤遥。弱引用:具有弱引用的對象擁有的生命周期更短暫。因為當(dāng) JVM 進行垃圾回收林艘,一旦發(fā)現(xiàn)弱引用對象盖奈,無論當(dāng)前內(nèi)存空間是否充足,都會將弱引用回收狐援。不過由于垃圾回收器是一個優(yōu)先級較低的線程钢坦,所以并不一定能迅速發(fā)現(xiàn)弱引用對象虛引用:顧名思義,就是形同虛設(shè)啥酱,如果一個對象僅持有虛引用爹凹,那么它相當(dāng)于沒有引用,在任何時候都可能被垃圾回收器回收镶殷。