part1

java中==和equals和hashCode的區別
A:java中的數據類型,可分爲兩類:
① ==
1.基本數據類型,也稱原始數據類型

byte,short,char,int,long,float,double,boolean 他們之間的比較,應用雙等號(==),比較的是他們的值。

2.引用類型(類、接口、數組)

當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較後的結果爲true,否則比較後結果爲false。

對象是放在堆中的,棧中存放的是對象的引用(地址)。由此可見’=='是對棧中的值進行比較的。如果要比較堆中對象的內容是否相同,那麼就要重寫equals方法了。
②equals
1、默認情況(沒有覆蓋equals方法)下equals方法都是調用Object類的equals方法,而Object的equals方法主要用於判斷對象的內存地址引用是不是同一個地址(是不是同一個對象)。
2 、要是類中覆蓋了equals方法,那麼就要根據具體的代碼來確定equals方法的作用了,覆蓋後一般都是通過對象的內容是否相等來判斷對象是否相等。例如String的equals方法即是判斷值是否相等。
這裏對equals重新需要注意五點:
1 自反性:對任意引用值X,x.equals(x)的返回值一定爲true.
2 對稱性:對於任何引用值x,y,當且僅當y.equals(x)返回值爲true時,x.equals(y)的返回值一定爲true;
3 傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true
4 一致性:如果參與比較的對象沒任何改變,則對象比較的結果也不應該有任何改變
5 非空性:任何非空的引用值X,x.equals(null)的返回值一定爲false
③hashCode
hashCode()方法返回的就是一個數值,從方法的名稱上就可以看出,其目的是生成一個hash碼。hash碼的主要用途就是在對對象進行散列的時候作爲key輸入,據此很容易推斷出,我們需要每個對象的hash碼儘可能不同,這樣才能保證散列的存取性能。事實上,Object類提供的默認實現確實保證每個對象的hash碼不同(在對象的內存地址基礎上經過特定算法返回一個hash碼)。Java採用了哈希表的原理。哈希(Hash)實際上是個人名,由於他提出一哈希算法的概念,所以就以他的名字命名了。 哈希算法也稱爲散列算法,是將數據依特定算法直接指定到一個地址上。初學者可以這樣理解,hashCode方法實際上返回的就是對象存儲的物理地址(實際可能並不是)。
④eqauls方法和hashCode方法關係
Java對於eqauls方法和hashCode方法是這樣規定的:

(1)同一對象上多次調用hashCode()方法,總是返回相同的整型值。

(2)如果a.equals(b),則一定有a.hashCode() 一定等於 b.hashCode()。

(3)如果!a.equals(b),則a.hashCode() 不一定等於 b.hashCode()。此時如果a.hashCode() 總是不等於 b.hashCode(),會提高hashtables的性能。

(4)a.hashCode()==b.hashCode() 則 a.equals(b)可真可假

(5)a.hashCode()!= b.hashCode() 則 a.equals(b)爲假。

1、equals方法用於比較對象的內容是否相等(覆蓋以後)

2、hashcode方法只有在集合中用到

3、當覆蓋了equals方法時,比較對象是否相等將通過覆蓋後的equals方法進行比較(判斷對象的內容是否相等)。

4、將對象放入到集合中時,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,如果不相等直接將該對象放入集合中。如果hashcode值相等,然後再通過equals方法判斷要放入對象與集合中的任意一個對象是否相等,如果equals判斷不相等,直接將該元素放入到集合中,否則不放入。

int、char、long各佔多少字節數
在這裏插入圖片描述
int與integer的區別
int是基本數據類型,integer是int的包裝數據類型,integer使用前必須初始化,它的默認值爲null,int的默認值爲0,integer是對象的概念,可以用new實例化。

探探對java多態的理解
1、面向對象的三大基本特徵:封裝、繼承、多態

Java中繼承的概念是:繼承是指一個對象直接使用另一對象的屬性和方法(此處引用百度百科)。也就是當一個子類繼承了一個父類時,子類也同時繼承了父類的非靜態屬性和方法(可以繼承父類的private方法、變量、只是無法通過子類對象修改),那麼意思就是子類對象可以調用父類的方法並且可以訪問父類的變量(只能改變非私有變量)。

2、多態是指:父類引用指向子類對象,在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。

3、實現多態的三要素:繼承 重寫 父類引用指向子類對象
一般通過兩種方式實現多態:覆蓋(重寫)、重載。
這兩種方式有什麼區別又有什麼聯繫?
首先區別:
1.覆蓋要求子類中的某一方法名和參數和父類中的某一方法名和參數完全一致。而重載只要求方法名一樣而參數名必須不 一致
2.覆蓋要求子類中的方法與父類中被覆蓋的方法返回類型必須一致。而重載可以不一致(參數列表必須不一致)。
3.覆蓋要求子類覆蓋父類的方法中不能有新拋出的異常類型。而重載允許有新拋出的異常類型。
4.覆蓋要求子類覆蓋父類的方法的訪問權限必須比父類的對應方法大(public > protected > default > private)。而重載 則沒有這種限制。
聯繫:
1.都是Java中多態性的典型體現。
2.都基於Java的繼承機制。

String、StringBuffer、StringBuilder區別
三者在執行速度方面的比較:StringBuilder > StringBuffer > String
(1)如果要操作少量的數據用 String;

(2)多線程操作字符串緩衝區下操作大量數據 StringBuffer;

(3)單線程操作字符串緩衝區下操作大量數據 StringBuilder。

什麼是內部類?內部類的作用
內部類分類:
1普通內部類(成員內部類)
2 局部內部類(方法內或者代碼塊內)
局部內部類和局部變量一樣,不能被public、protected、private和static修飾,只能訪問方法中定義爲final類型的局部變量。分爲靜態局部內部類(位於靜態方法內或者靜態代碼塊內)和非靜態局部內部類。
3 匿名內部類
匿名內部類沒有類名的內部類,不使用關鍵字class、extends、implements,沒有構造函數,必須繼承其他類或實現其他接口。匿名內部類的好處是代碼更加簡潔緊湊,但壞處是易讀性下降。一般應用於GUI編程中實現事件處理等。
4嵌套內部類
內部類是static時,稱作是嵌套類。則1)創建嵌套類的對象時不再需要其外圍類的對象;2)不能從嵌套類的對象中訪問非靜態的外圍類對象。
靜態內部類不能訪問外部類的普通成員變量,只能訪問外部類中的靜態成員和靜態方法。

抽象類和接口區別
在這裏插入圖片描述

抽象類的意義
1,爲子類提供一個公共的類型;

2,封裝子類中重複內容(成員變量和方法);

3,定義有抽象方法,子類雖然有不同的實現,但該方法的定義是一致的。

抽象類與接口的應用場景
interface的應用場合
A. 類與類之前需要特定的接口進行協調,而不在乎其如何實現。
B. 作爲能夠實現特定功能的標識存在,也可以是什麼接口方法都沒有的純粹標識。
C. 需要將一組類視爲單一的類,而調用者只通過接口來與這組類發生聯繫。
D. 需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯繫。

4、abstract class的應用場合
一句話,在既需要統一的接口,又需要實例變量或缺省的方法的情況下,就可以使用它。最常見的有:
A. 定義了一組接口,但又不想強迫每個實現類都必須實現所有的接口。可以用abstract class定義一組方法體,甚至可以是空方法體,然後由子類選擇自己所感興趣的方法來覆蓋。
B. 某些場合下,只靠純粹的接口不能滿足類與類之間的協調,還必需類中表示狀態的變量來區別不同的關係。abstract的中介作用可以很好地滿足這一點。
C. 規範了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,可以共享的,無需子類分別實現;而另一些方法卻需要各個子類根據自己特定的狀態來實現特定的功能

抽象類是否可以沒有方法和屬性?
抽象類中可以沒有抽象方法,但有抽象方法的一定是抽象類。所以,java中 抽象類裏面可以沒有抽象方法。注意即使是沒有抽象方法和屬性的抽象類,也不能被實例化。

父類的靜態方法能否被子類重寫
父類的靜態方法可以被子類繼承,但是不能重寫。

進程和線程的區別
進程是資源(CPU、內存等)分配的基本單位,它是程序執行時的一個實例。程序運行時系統就會創建一個進程,併爲它分配資源,然後把該進程放入進程就緒隊列,進程調度器選中它的時候就會爲它分配CPU時間,程序開始真正運行。

線程是程序執行時的最小單位,它是進程的一個執行流,是CPU調度和分派的基本單位,一個進程可以由很多個線程組成,線程間共享進程的所有資源,每個線程有自己的堆棧和局部變量。

線程和進程各自有什麼區別和優劣呢?
進程是資源分配的最小單位,線程是程序執行的最小單位。

進程有自己的獨立地址空間,每啓動一個進程,系統就會爲它分配地址空間,建立數據表來維護代碼段、堆棧段和數據段,這種操作非常昂貴。而線程是共享進程中的數據的,使用相同的地址空間,因此CPU切換一個線程的花費遠比進程要小很多,同時創建一個線程的開銷也比進程要小很多。

線程之間的通信更方便,同一進程下的線程共享全局變量、靜態變量等數據,而進程之間的通信需要以通信的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點。

但是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另外一個進程造成影響,因爲進程有自己獨立的地址空間。

final,finally,finalize的區別
finalize()是在java.lang.Object裏定義的,也就是說每一個對象都有這麼個方法。這個方法在gc啓動,該對象被回收的時候被調用。其實gc可以回收大部分的對象(凡是new出來的對象,gc都能搞定,一般情況下我們又不會用new以外的方式去創建對象),所以一般不需要實現finalize。
特殊情況下,需要實現finalize,當對象被回收的時候釋放一些資源,比如:一個socket鏈接,在對象初始化時創建,整個生命週期內有效,那麼就需要實現finalize,關閉這個鏈接。
使用finalize還需要注意一個事,調用super.finalize();
一個對象的finalize()方法只會被調用一次,而且finalize()被調用不意味着gc會立即回收該對象,所以有可能調用finalize()後,該對象又不需要被回收了,然後到了真正要被回收的時候,因爲前面調用過一次,所以不會調用finalize(),產生問題。 所以,推薦不要使用finalize()方法,它跟析構函數不一樣。
  
序列化的方式
實現Serializable / Parcelable 接口

Serializable 和Parcelable 的區別
Serializable 是java中的類,Parcelable 是安卓特有的類。
Parcelable的實現需要重寫許多方法比較複雜,效率高,佔用內存相對少,
Serializable 實現簡單,內存開銷大。

靜態屬性和靜態方法是否可以被繼承?是否可以被重寫?以及原因?
可以被自雷繼承但不能被子類重寫
原因:
static修飾函數/變量時,其實是全局函數/變量,它與任何類都沒有關係。靠這個類的好處就是這個類的成員函數調用static方法不用帶類名。
注意:static關鍵字可以用修飾代碼塊.static代碼塊可以置於類中的任何一個位置,並可以有多個static代碼塊。在類初次被加載時,會按照靜態代碼塊的順序來執行,並且只會執行一次。

靜態內部類的設計意圖
靜態內部類與非靜態內部類之間存在一個最大的區別:非靜態內部類在編譯完成之後會隱含地保存着一個引用,該引用是指向創建它的外圍內,但是靜態內部類卻沒有。
沒有這個引用就意味着:它的創建是不需要依賴於外圍類的。
它不能使用任何外圍類的非static成員變量和方法。
匿名內部類

1、匿名內部類是沒有訪問修飾符的。

2、new 匿名內部類,這個類首先是要存在的。

3、當所在方法的形參需要被匿名內部類使用,那麼這個形參就必須爲final。

4、匿名內部類沒有明面上的構造方法,編譯器會自動生成一個引用外部類的構造方法。

成員內部類、靜態內部類、局部內部類和匿名內部類的理解,以及項目中的應用

談談對kotlin的理解

閉包和局部內部類的區別
http://www.javashuo.com/article/p-dhuzorbf-ek.html

string 轉換成 integer的方式及原理
parseInt(String s)–內部調用parseInt(s,10)(默認爲10進制)
正常判斷null,進制範圍,length等
判斷第一個字符是否是符號位
循環遍歷確定每個字符的十進制值
通過*= 和-= 進行計算拼接
判斷是否爲負值 返回結果。

泛型中extends和super的區別
上界通配符和下界通配符
·<? extends T>限定參數類型的上界:參數類型必須是T或T的子類型
·<? super T> 限定參數類型的下界:參數類型必須是T或T的超類型
總結爲:
·<? extends T> 只能用於方法返回,告訴編譯器此返參的類型的最小繼承邊界爲T,T和T的父類都能接收,但是入參類型無法確定,只能接受null的傳入
·<? super T>只能用於限定方法入參,告訴編譯器入參只能是T或其子類型,而返參只能用Object類接收
?既不能用於入參也不能用於返參。

哪些情況下的對象會被垃圾回收機制處理掉?
兩種判斷方法。

引用計數法

這種方法是在對象的頭處維護一個計數器Counter,當有一個引用指向對象的時候counter就加一,當不在引用此對象時就讓counter減一。所以,當counter等於零的時候虛擬機就認爲此對象時可以被回收的。看起來好像有點道理,但是這種方法存在一個致命的問題:

可達性分析算法

Java就是使用此方法作爲判斷對象是否可被回收的。虛擬機會先將一些對象定義爲GC Roots,從GC Roots出發一直沿着引用鏈向下尋找,如果某個對象不能通過GC Roots尋找到,那麼虛擬機就認爲該對象可以被回收。我們舉個例子,如下圖:
在這裏插入圖片描述
當對象D不在引用對象A時,儘管A、B、C互相還持有引用,GC依然會回收ABC所佔用的內存。那麼還有個疑問,什麼樣的對象可以被看做是GC Roots呢?
虛擬機棧(棧楨中的本地變量表)中的引用的對象
方法區中的類靜態屬性引用的對象
方法區中的常量引用的對象
本地方法棧中JNI(Native方法)的引用的對象

講一下常見編碼方式?
ASCII碼:共有128個,用一個字節的低7位表示

ISO8859-1:在ASCII碼的基礎上涵蓋了大多數西歐語言字符,仍然是單字節編碼,它總共能表示256個字符

GB2312:全稱爲《信息交換用漢字編碼字符集基本集》,它是雙字節編碼,總的編碼範圍是A1~F7
A1~A9 ·符號區
B0~F7 漢字區

GBK:數字交換用漢字編碼字符集》,它可能是單字節、雙字節或者四字節編碼,與GB2312編碼兼容

UTF-16:具體定義了Unicode字符在計算機中的存取方法。採用2字節來表示Unicode轉化格式,它是定長的表示方法,不論什麼字符都可以用兩個字節表示

UTF-8: UTF-8採用一種變長技術,每個編碼區域有不同的字碼長度,不同的字符可以由1~6個字節組成。
如果一個字節,最高位爲0,表示這是一個ASCII字符(00~7F)
如果一個字節,以11開頭,連續的1的個數暗示這個字符的字節數

utf-8編碼中的中文佔幾個字節;int型幾個字節?
utf-8的編碼規則:
如果一個字節,最高位爲0,表示這是一個ASCII字符(00~7F)
如果一個字節,以11開頭,連續的1的個數暗示這個字符的字節數
一個utf8數字佔1個字節
一個utf8英文字母佔1個字節
少數是漢字每個佔用3個字節,多數佔用4個字節。

靜態代理和動態代理的區別,什麼場景使用?

所謂靜態也就是在程序運行前就已經存在代理類的字節碼文件,代理類和委託類的關係在運行前就確定了。
優點:使用者只關心業務邏輯,不需要着眼內部實現,方便後期的變更和部分共用代碼的統一處理
缺點:當代理類中出現的被代理類越來越多時,內部就會顯得非常臃腫。反而不利於管理閱讀。
應用:一些第三方框架的代理,便後後期替換或者定製化變更。
動態代理類的源碼是在程序運行期間由JVM根據反射等機制動態的生成,所以不存在代理類的字節碼文件。代理類和委託類的關係是在程序運行時確定。
優點:擁有靜態代理的優點,同時省去了很多代碼,並且擴展性更強,通過反射可以執行任意類型的被代理類方法
缺點:只能代理實現了接口的類,而沒有實現接口的類就不能實現動態代理。�通過反射在性能上可以會有一定程度上的性能損耗。
應用:被代理類龐大時,需要在某些方法執行前後處理一些事情時,亦或接口類與實現類經常變動時(因爲使用反射所以方法的增刪改並不需要修改invoke方法)。
http://www.javashuo.com/article/p-oqyclglx-bn.html
https://www.jianshu.com/p/ba54b0f23c16

Java的異常體系
Throwable (Exception,Error)

談談你對解析與分派的認識

修改對象A的equals方法的簽名,那麼使用HashMap存放這個對象實例的時候,會調用哪個equals方法?

Java中實現多態的機制是什麼?

如何將一個Java對象序列化到文件裏?

說說你對Java反射的理解

說說你對Java註解的理解
https://mp.weixin.qq.com/s/NwlIy_knmx4Es7kFnk0gRQ?

說說你對依賴注入的理解

說一下泛型原理,並舉例說明
泛型可以消除代碼中的強制類型轉換,同時獲得一個附加的類型檢查層,該檢查層可以防止有人將錯誤類型的鍵或值保存在集合中。這就是泛型所做的工作。

Java中String的瞭解

String爲什麼要設計成不可變的?

Object類的equal和hashCode方法重寫,爲什麼?