1寓免、java中==和equals和hashCode的區(qū)別
1)==若是基本數(shù)據(jù)類型比較胸梆,是比較值,若是引用類型扫责,則比較的是他們在內(nèi)存中的存放地址榛鼎。對象是存放在堆中,棧中存放的對象的引用鳖孤,所以==是對棧中的值進行比較者娱,若返回true代表變量的內(nèi)存地址相等;
2)equals是Object類中的方法苏揣,Object類的equals方法用于判斷對象的內(nèi)存地址引用是不是同一個地址(是不是同一個對象)黄鳍。若是類中覆蓋了equals方法,就要根據(jù)具體代碼來確定平匈,一般覆蓋后都是通過對象的內(nèi)容是否相等來判斷對象是否相等框沟。
3)hashCode()計算出對象實例的哈希碼,在對象進行散列時作為key存入增炭。之所以有hashCode方法忍燥,因為在批量的對象比較中,hashCode比較要比equals快隙姿。在添加新元素時梅垄,先調(diào)用這個元素的hashCode方法,一下子能定位到它應該旋轉(zhuǎn)的物理位置输玷,若該位置沒有元素队丝,可直接存儲;若該位置有元素饲嗽,就調(diào)用它的equals方法與新元素進行比較炭玫,若相同則不存,不相同貌虾,就放到該位置的鏈表末端吞加。
4)equals與hashCode方法關系:
hashCode()是一個本地方法,實現(xiàn)是根據(jù)本地機器上關的。equals()相等的對象衔憨,hashCode()也一定相等叶圃;hashCode()不等,equals()一定也不等践图;hashCode()相等掺冠,equals()可能相等,也可能不等码党。
所以在重寫equals(Object obj)方法德崭,有必要重寫hashCode()方法,確保通過equals(Object obj)方法判斷結(jié)果為true的兩個對象具備相等的hashCode()返回值揖盘。
5)equals與==的關系:
Integer b1 = 127;在java編譯時被編譯成Integer b1 = Integer.valueOf(127);對于-128到127之間的Integer值眉厨,用的是原生數(shù)據(jù)類型int,會在內(nèi)存里供重用兽狭,也就是這之間的Integer值進行==比較時憾股,只是進行int原生數(shù)據(jù)類型的數(shù)值進行比較。而超出-128?127的范圍箕慧,進行==比較時是進行地址及數(shù)值比較服球。
2、int颠焦、char斩熊、long各占多少字節(jié)數(shù)
int\float占用4個字節(jié),short\char占用2個字節(jié)伐庭,long占用8個字節(jié)座享,byte/boolean占用1個字節(jié)
基本數(shù)據(jù)類型存放在棧里,包裝類棧里存放的是對象的引用似忧,即值的地址,而值存放在堆里丈秩。
3盯捌、int與integer的區(qū)別
Integer是int的包裝類,int則是java的一種基本數(shù)據(jù)類型蘑秽,Integer變量必須實例化才能使用饺著,當new一個Integer時,實際是生成一個指向此對象的引用肠牲,而int是直接存儲數(shù)據(jù)的值幼衰,Integer默認值是null,而int默認值是0
4缀雳、談談對java多態(tài)的理解
同一個消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式渡嚣,在執(zhí)行期間判斷所引用的對象的實際類型,根據(jù)其實際的類型調(diào)用其相應的方法。
作用:消除類型之間的耦合關系识椰。實現(xiàn)多態(tài)的必要條件:繼承绝葡、重寫(因為必須調(diào)用父類中存在的方法)、父類引用指向子類對象
5腹鹉、String藏畅、StringBuffer、StringBuilder區(qū)別
都是字符串類功咒,String類中使用字符數(shù)組保存字符串愉阎,因有final修飾符,String對象是不可變的力奋,每次對String操作都會生成新的String對象榜旦,這樣效率低,且浪費內(nèi)存空間刊侯。但線程安全章办。
StringBuilder和StringBuffer也是使用字符數(shù)組保存字符,但這兩種對象都是可變的滨彻,即對字符串進行append操作藕届,不會產(chǎn)生新的對象。它們的區(qū)別是:StringBuffer對方法加了同步鎖亭饵,是線程安全的休偶,StringBuilder非線程安全。
6辜羊、什么是內(nèi)部類踏兜?內(nèi)部類的作用
內(nèi)部類指在類的內(nèi)部再定義另一個類。
內(nèi)部類的作用:1)實現(xiàn)多重繼承八秃,因為java中類的繼承只能單繼承碱妆,使用內(nèi)部類可達到多重繼承;2)內(nèi)部類可以很好的實現(xiàn)隱藏昔驱,一般非內(nèi)部類疹尾,不允許有private或protected權(quán)限的,但內(nèi)部類可以骤肛;3)減少了類文件編譯后產(chǎn)生的字節(jié)碼文件大心杀尽;
內(nèi)部類在編譯完后也會產(chǎn)生.class文件腋颠,但文件名稱是:外部類名稱$內(nèi)部類名稱.class繁成。分為以下幾種:
1)成員內(nèi)部類,作為外部類的一個成員存在淑玫,與外部類的屬性巾腕、方法并列面睛,成員內(nèi)部類持有外部類的引用,成員內(nèi)部類不能定義static變量和方法祠墅。應用場合:每一個外部類都需要一個內(nèi)部類實例侮穿,內(nèi)部類離不開外部類存在。
2)靜態(tài)內(nèi)部類毁嗦,內(nèi)部類以static聲明亲茅,其他類可通過外部類.內(nèi)部類來訪問。特點:不會持有外部類的引用狗准,可以訪問外部類的靜態(tài)變量克锣,若要訪問成員變量須通過外部類的實例訪問。應用場合:內(nèi)部類不需要外部類的實例腔长,僅為外部類提供或邏輯上屬于外部類袭祟,邏輯上可單獨存在。設計的意義:加強了類的封裝性(靜態(tài)內(nèi)部類是外部類的子行為或子屬性捞附,兩者保持著一定關系)巾乳,提高了代碼的可讀性(相關聯(lián)的代碼放在一起)。
3)匿名內(nèi)部類鸟召,在整個操作中只使用一次胆绊,沒有名字,使用new創(chuàng)建欧募,沒有具體位置压状。
4)局部內(nèi)部類,在方法內(nèi)或是代碼塊中定義類跟继,
7种冬、抽象類和接口區(qū)別
抽象類在類前面須用abstract關鍵字修飾,一般至少包含一個抽象方法舔糖,抽象方法指只有聲明娱两,用關鍵字abstract修飾,沒有具體的實現(xiàn)的方法金吗。因抽象類中含有無具體實現(xiàn)的方法谷婆,固不能用抽象類創(chuàng)建對象。當然如果只是用abstract修飾類而無具體實現(xiàn)辽聊,也是抽象類。抽象類也可以有成員變量和普通的成員方法期贫。抽象方法必須為public或protected(若為private跟匆,不能被子類繼承,子類無法實現(xiàn)該方法)通砍。若一個類繼承一個抽象類玛臂,則必須實現(xiàn)父類中所有的抽象方法烤蜕,若子類沒有實現(xiàn)父類的抽象方法,則也應該定義為抽象類迹冤。
接口用關鍵字interface修飾讽营,接口也可以含有變量和方法,接口中的變量會被隱式指定為public static final變量泡徙。方法會被隱式的指定為public abstract橱鹏,接口中的所有方法均不能有具體的實現(xiàn),即接口中的方法都必須為抽象方法堪藐。若一個非抽象類實現(xiàn)某個接口莉兰,必須實現(xiàn)該接口中所有的方法。
區(qū)別:
1)抽象類可以提供成員方法實現(xiàn)的細節(jié)礁竞,而接口只能存在抽象方法糖荒;
2)抽象類的成員變量可以是各種類型,而接口中成員變量只能是public static final類型模捂;
3)接口中不能含有靜態(tài)方法及靜態(tài)代碼塊捶朵,而抽象類可以有靜態(tài)方法和靜態(tài)代碼塊;
4)一個類只能繼承一個抽象類狂男,用extends來繼承撮奏,卻可以實現(xiàn)多個接口硫豆,用implements來實現(xiàn)接口。
7.1、抽象類的意義
抽象類是用來提供子類的通用性尊浓,用來創(chuàng)建繼承層級里子類的模板,減少代碼編寫吓揪,有利于代碼規(guī)范化包帚。
7.2、抽象類與接口的應用場景
抽象類的應用場景:1)規(guī)范了一組公共的方法兔毙,與狀態(tài)無關唾琼,可以共享的,無需子類分別實現(xiàn)澎剥;而另一些方法卻需要各個子類根據(jù)自己特定狀態(tài)來實現(xiàn)特定功能锡溯;
2)定義一組接口,但不強迫每個實現(xiàn)類都必須實現(xiàn)所有的方法哑姚,可用抽象類定義一組方法體可以是空方法體祭饭,由子類選擇自己感興趣的方法來覆蓋;
7.3****叙量、抽象類是否可以沒有方法和屬性倡蝙?
可以
7.4、接口的意義
1)有利于代碼的規(guī)范绞佩,對于大型項目寺鸥,對一些接口進行定義猪钮,可以給開發(fā)人員一個清晰的指示,防止開發(fā)人員隨意命名和代碼混亂胆建,影響開發(fā)效率烤低。
2)有利于代碼維護和擴展,當前類不能滿足要求時笆载,不需要重新設計類扑馁,只需要重新寫了個類實現(xiàn)對應的方法。
3)解耦作用宰译,全局變量的定義檐蚜,當發(fā)生需求變化時,只需改變接口中的值即可沿侈。
4)直接看接口闯第,就可以清楚知道具體實現(xiàn)類間的關系,代碼交給別人看缀拭,別人也能立馬明白咳短。
8、泛型中extends和super的區(qū)別
<? extends T>限定參數(shù)類型的上界蛛淋,參數(shù)類型必須是T或T的子類型咙好,但對于List<? extends T>,不能通過add()來加入元素褐荷,因為不知道<? extends T>是T的哪一種子類勾效;
<? super T>限定參數(shù)類型的下界,參數(shù)類型必須是T或T的父類型叛甫,不能能過get()獲取元素层宫,因為不知道哪個超類;
9其监、父類的靜態(tài)方法能否被子類重寫萌腿?靜態(tài)屬性和靜態(tài)方法是否可以被繼承?
父類的靜態(tài)方法和屬性不能被子類重寫抖苦,但子類可以繼承父類靜態(tài)方法和屬性毁菱,如父類和子類都有同名同參同返回值的靜態(tài)方法show(),聲明的實例Father father = new Son(); (Son extends Father)锌历,會調(diào)用father對象的靜態(tài)方法贮庞。靜態(tài)是指在編譯時就會分配內(nèi)存且一直存在,跟對象實例無關究西。
10窗慎、進程和線程的區(qū)別
進程:具有一定獨立功能的程序,是系統(tǒng)進行資源分配和調(diào)度運行的基本單位怔揩。
線程:進程的一個實體捉邢,是CPU調(diào)度的苯單位,也是進程中執(zhí)行運算的最小單位商膊,即執(zhí)行處理機調(diào)度的基本單位伏伐,如果把進程理解為邏輯上操作系統(tǒng)所完成的任務,線程則表示完成該任務的許多可能的子任務之一晕拆。
關系:一個進程可有多個線程藐翎,至少一個;一個線程只能屬于一個進程实幕。同一進程的所有線程共享該進程的所有資源吝镣。不同進程的線程間要利用消息通信方式實現(xiàn)同步。
區(qū)別:進程有獨立的地址空間昆庇,而多個線程共享內(nèi)存末贾;進程具有一個獨立功能的程序,線程不能獨立運行整吆,必須依存于應用程序中拱撵;
11、final表蝙,finally拴测,finalize的區(qū)別
final:變量、類府蛇、方法的修飾符集索,被final修飾的類不能被繼承,變量或方法被final修飾則不能被修改和重寫汇跨。
finally:異常處理時提供finally塊來執(zhí)行清除操作务荆,不管有沒有異常拋出,此處代碼都會被執(zhí)行扰法。如果try語句塊中包含return語句蛹含,finally語句塊是在return之后運行;
finalize:Object類中定義的方法塞颁,若子類覆蓋了finalize()方法浦箱,在在垃圾收集器將對象從內(nèi)存中清除前,會執(zhí)行該方法祠锣,確定對象是否會被回收酷窥。
12、序列化Serializable 和Parcelable 的區(qū)別
序列化:將一個對象轉(zhuǎn)換成可存儲或可傳輸?shù)臓顟B(tài)伴网,序列化后的對象可以在網(wǎng)絡上傳輸蓬推,也可以存儲到本地,或?qū)崿F(xiàn)跨進程傳輸澡腾;
為什么要進行序列化:開發(fā)過程中沸伏,我們需要將對象的引用傳給其他activity或fragment使用時糕珊,需要將這些對象放到一個Intent或Bundle中,再進行傳遞毅糟,而Intent或Bundle只能識別基本數(shù)據(jù)類型和被序列化的類型红选。
Serializable:表示將一個對象轉(zhuǎn)換成可存儲或可傳輸?shù)臓顟B(tài)。
Parcelable:與Serializable實現(xiàn)的效果相同姆另,也是將一個對象轉(zhuǎn)換成可傳輸?shù)臓顟B(tài)喇肋,但它的實現(xiàn)原理是將一個完整的對象進行分解,分解后的每一部分都是Intent所支持的數(shù)據(jù)類型迹辐,這樣實現(xiàn)傳遞對象的功能蝶防。
Parcelable****實現(xiàn)序列化的重要方法:序列化功能是由writeToParcel完成,通過Parcel中的write方法來完成明吩;反序列化由CREATOR完成间学,內(nèi)部標明了如何創(chuàng)建序列化對象及數(shù)級,通過Parcel的read方法完成贺喝;內(nèi)容描述功能由describeContents方法完成菱鸥,一般直接返回0。
區(qū)別:Serializable在序列化時會產(chǎn)生大量臨時變量躏鱼,引起頻繁GC氮采。Serializable本質(zhì)上使用了反射,序列化過程慢染苛。Parcelable不能將數(shù)據(jù)存儲在磁盤上鹊漠,在外界變化時,它不能很好的保證數(shù)據(jù)的持續(xù)性茶行。
選擇原則:若僅在內(nèi)存中使用躯概,如activity\service間傳遞對象,優(yōu)先使用Parcelable畔师,它性能高娶靡。若是持久化操作,優(yōu)先使用Serializable
注意:靜態(tài)成員變量屬于類看锉,不屬于對象姿锭,固不會參與序列化的過程;用transient關鍵字編輯的成員變量不會參與序列化過程伯铣;可以通過重寫writeObject()和readObject()方法來重寫系統(tǒng)默認的序列化和反序列化呻此。
13、談談對kotlin的理解
特點:1)代碼量少且代碼末尾沒有分號腔寡;2)空類型安全(編譯期處理了各種null情況焚鲜,避免執(zhí)行時異常);3)函數(shù)式的,可使用lambda表達式忿磅;4)可擴展方法(可擴展任意類的的屬性)糯彬;5)互操作性強,可以在一個項目中使用kotlin和java兩種語言混合開發(fā)葱她;
14情连、string 轉(zhuǎn)換成 integer的方式及原理
1)parseInt(String s)內(nèi)部調(diào)用parseInt(s, 10)默認為10進制 。
2)正常判斷null\進制范圍览效,length等。
3)判斷第一個字符是否是符號位虫几。
4)循環(huán)遍歷確定每個字符的十進制值锤灿。
5)通過*=和-=進行計算拼接。
6)判斷是否為負值返回結(jié)果辆脸。
謝謝你的閱讀但校,如果您覺得這篇博文對你有幫助,請點贊或者喜歡啡氢,讓更多的人看到状囱!祝你每天開心愉快!