java中==和equals和hashCode的區別
== 的作用:
基本類型:比較的就是值是否相同
引用類型:比較的就是地址值是否相同(確切的說,是堆內存地址)
equals 的作用:
引用類型:默認情況下,比較的是地址值。
public boolean equals(Object anObject) {
2 if (this == anObject) {
3 return true;
4 }
5 if (anObject instanceof String) {
6 String anotherString = (String)anObject;
7 int n = value.length;
8 if (n == anotherString.value.length) {
9 char v1[] = value;
10 char v2[] = anotherString.value;
11 int i = 0;
12 while (n-- != 0) {
13 if (v1[i] != v2[i])
14 return false;
15 i++;
16 }
17 return true;
18 }
19 }
20 return false;
21 }
String類中被復寫的equals()方法其實是比較兩個字符串的內容
hashCode:
在Java中任何一個對象都具備equals(Object obj)和hashcode()這兩個方法,因為他們是在Object類中定義的。
hashcode()方法返回一個int數,在Object類中的默認實現是“將該對象的內部地址轉換成一個整數返回”。
hashcode是系統用來快速檢索對象而使用
如果 x 和 y 的 hashCode() 不相等,那么 x.equals(y) 一定返回 “false” ;
int、char、long各占多少字節數
整型:
byte:1個字節 8位 -128~127
short :2個字節 16位
int :4個字節 32位
long:8個字節 64位
浮點型:
float:4個字節 32 位
double :8個字節 64位
char:2個字節。
Java多態性理解
用一句話概括就是:事物在運行過程中存在不同的狀態
多態的存在有三個前提:
1.要有繼承關系
2.子類要重寫父類的方法
3.父類引用指向子類對,
String、StringBuffer、StringBuilder區別
StringBuffer、StringBuilder和String一樣,也用來代表字符串。String類是不可變類,任何對String的改變都 會引發新的String對象的生成;StringBuffer則是可變類,任何對它所指代的字符串的改變都不會產生新的對象。既然可變和不可變都有了,為何還有一個StringBuilder呢?相信初期的你,在進行append時,一般都會選擇StringBuffer吧!
先說一下集合的故事,HashTable是線程安全的,很多方法都是synchronized方法,而HashMap不是線程安全的,但其在單線程程序中的性能比HashTable要高。StringBuffer和StringBuilder類的區別也是如此,他們的原理和操作基本相同,區別在于StringBufferd支持并發操作,線性安全的,適 合多線程中使用。StringBuilder不支持并發操作,線性不安全的,不適合多線程中使用。新引入的StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高。
抽象類和接口的區別,使用場景
1、相同點
A. 兩者都是抽象類,都不能實例化。
B. interface實現類及abstrct class的子類都必須要實現已經聲明的抽象方法。
2.、不同點
A. interface需要實現,要用implements,而abstract class需要繼承,要用extends。
B. 一個類可以實現多個interface,但一個類只能繼承一個abstract class。
C. interface強調特定功能的實現,而abstract class強調所屬關系。
D. 盡管interface實現類及abstrct class的子類都必須要實現相應的抽象方法,但實現的形式不同。interface中的每一個方法都是抽象方法,都只是聲明的(declaration, 沒有方法體),實現類必須要實現。而abstract class的子類可以有選擇地實現。
3、interface的應用場合
A. 類與類之前需要特定的接口進行協調,而不在乎其如何實現。
B. 作為能夠實現特定功能的標識存在,也可以是什么接口方法都沒有的純粹標識。
C. 需要將一組類視為單一的類,而調用者只通過接口來與這組類發生聯系。
D. 需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯系。
4、abstract class的應用場合
一句話,在既需要統一的接口,又需要實例變量或缺省的方法的情況下,就可以使用它。最常見的有:
A. 定義了一組接口,但又不想強迫每個實現類都必須實現所有的接口。可以用abstract class定義一組方法體,甚至可以是空方法體,然后由子類選擇自己所感興趣的方法來覆蓋。
B. 某些場合下,只靠純粹的接口不能滿足類與類之間的協調,還必需類中表示狀態的變量來區別不同的關系。abstract的中介作用可以很好地滿足這一點。
C. 規范了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,可以共享的,無需子類分別實現;而另一些方法卻需要各個子類根據自己特定的狀態來實現特定的功能
final,finally,finalize的區別
final 用于申明屬性,方法和類,表示屬性不可變,方法不可以被覆蓋,類不可以被繼承。
finally 是異常處理語句結構中,表示總是執行的部分。
finallize 表示是object類一個方法,在垃圾回收機制中執行的時候會被調用被回收對象的方法。允許回收此前未回收的內存垃圾。所有object都繼承了 finalize()方法
成員內部類、靜態內部類、局部內部類和匿名內部類的理解,以及項目中的應用
一個靜態內部類不需要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象可以直接生成:
匿名內部類也就是沒有名字的內部類
匿名內部類
正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫
但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口
java-string轉換成integer的方式及原理
https://www.jianshu.com/p/9eebb4f2ccb1
String的特性
這說明了String的一個重要特性,String 是value不可改變的
然而String類還使用了final來修飾,表明String的第二個重要特性,,它的所有成員變量也都是final的。** String是不可被繼承的**
Hashtable 與 HashMap 的簡單比較
HashTable 基于 Dictionary 類,而 HashMap 是基于 AbstractMap。Dictionary 是任何可將鍵映射到相應值的類的抽象父類,而 AbstractMap 是基于 Map 接口的實現,它以最大限度地減少實現此接口所需的工作。
HashMap 的 key 和 value 都允許為 null,而 Hashtable 的 key 和 value 都不允許為 null。HashMap 遇到 key 為 null 的時候,調用 putForNullKey 方法進行處理,而對 value 沒有處理;Hashtable遇到 null,直接返回 NullPointerException。
Hashtable 方法是同步,而HashMap則不是。我們可以看一下源碼,Hashtable 中的幾乎所有的 public 的方法都是 synchronized 的,而有些方法也是在內部通過 synchronized 代碼塊來實現。所以有人一般都建議如果是涉及到多線程同步時采用 HashTable,沒有涉及就采用 HashMap,但是在 Collections 類中存在一個靜態方法:synchronizedMap(),該方法創建了一個線程安全的 Map 對象,并把它作為一個封裝的對象來返回。
List、Set、Map的區別
List:
1.可以允許重復的對象。
2.可以插入多個null元素。
3.是一個有序容器,保持了每個元素的插入順序,輸出的順序就是插入的順序。
4.常用的實現類有 ArrayList、LinkedList 和 Vector。ArrayList 最為流行,它提供了使用索引的隨意訪問,而 LinkedList 則對于經常需要從 List 中添加或刪除元素的場合更為合適。
Set:
1 不允許重復對象
2 無序容器,你無法保證每個元素的存儲順序,TreeSet通過 Comparator 或者 Comparable 維護了一個排序順序。
3 只允許一個 null 元素
Map:
Map不是collection的子接口或者實現類。Map是一個接口。
Map 的 每個 Entry 都持有兩個對象,也就是一個鍵一個值,Map 可能會持有相同的值對象但鍵對象必須是唯一的。
TreeMap 也通過 Comparator 或者 Comparable 維護了一個排序順序。
Map 里你可以擁有隨意個 null 值但最多只能有一個 null 鍵。
HashSet 的源碼是挺簡單的,內部都是用 HashMap 來實現的。利用了 HashMap 的 key 不能重復這個原理來實現 HashSet 。
SparseArray兩個數組mKeys、mValues分別存放int與Object,其默認長度為10,mKeys為有序列表,通過二分查找,找到要插入的key對應的index (這里相對于查找hash表應該算是費時間吧,但節省了內存,所以是 時間換取了空間)
通過二分查找到的index,將Value插入到mValues數組的對應位置
markdown
ArrayMap和SparseArray有點類似;其中含有兩個數組,一個是mHashes(key的hash值數組,為一個有序數組),另一個數組存儲的是key和value,其中key和value是成對出現的,key存儲在數組的偶數位上,value存儲在數組的奇數位上。
集合Set實現Hash怎么防止碰撞
重寫hashcode()和equles()方法
WebSocket與socket的區別
Socket 是操作系統內置的一套操作 TCP/IP 協議的網絡(套接字)的方法;
Websocket 是跟 HTTP 對應的,基于 TCP 協議之上的「長連接」協議。
對安卓簽名的理解
應用可以被不同的簽名文件簽名(如果有源代碼或者反編譯后重新編譯)
同一個應用如果簽名不同則不能覆蓋安裝
Serializable原理
Serializable是Java為我們提供的一個標準化的序
Java原生序列化方式是通過實現Serializable接口實現的. 不實現該接口會導致無法序列化, 拋出異常
將對象轉換為字節流, 用于網絡傳輸, 例如用于RPC遠程調用。
將對象保存到磁盤, 例如tomcat的鈍化和活化.
transient關鍵字:這個類的有些屬性需要序列化,而其他屬性不需要被序列化,打個比方,如果一個用戶有一些敏感信息(如密碼,銀行卡號等),為了安全起見,不希望在網絡操作
https://juejin.im/entry/5bf622436fb9a04a0b21cbe7
原文
作者:快感的感知
鏈接:https://www.jianshu.com/p/5ed769dde6cc