對於關係操做符 ==html
對於使用 equals 方法,內部實現分爲三個步驟:java
Java 中全部內置的類的 equals 方法的實現步驟均是如此,特別是諸如 Integer,Double 等包裝器類。如如下 String
中的 equals
方法實現android
// String.java
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
複製代碼
hashcode是系統用來快速檢索對象而使用git
equals方法本意是用來判斷引用的對象是否一致github
重寫equals方法和hashcode方法時,equals方法中用到的成員變量也一定會在hashcode方法中用到,只不過前者做爲比較項,後者做爲生成摘要的信息項,本質上所用到的數據是同樣的,從而保證兩者的一致性面試
Java 基本類型佔用的字節數安全
注:1字節(byte)=8位(bits)網絡
多態是指父類的某個方法被子類重寫時,能夠產生本身的功能行爲,同一個操做做用於不一樣對象,能夠有不一樣的解釋,產生不一樣的執行結果。多線程
多態的三個必要條件:併發
而後可使用結合里氏替換法則進一步的談理解
里氏替換法則 ---- 全部引用基類的地方必須能透明地使用其子類的對象
注意 在類中調用其餘類時務必要使用父類或接口,若是不能使用父類或接口,則說明類的設計已經違背了LSP原則
注意 若是子類不能完整地實現父類的方法,或者父類的某些方法在子類中已經發生「畸變」,則建議斷開父子繼承關係,採用依賴、彙集、組合等關係代替繼承
在項目中,採用里氏替換原則時,儘可能避免子類的「個性」,一旦子類有「個性」,這個子類和父類之間的關係就很難調和了, 把子類當作父類使用,子類的「個性」被抹殺——委屈了點;把子類單獨做爲一個業務來使用,則會讓代碼間的耦合關係變得撲朔迷離——缺少類替換的標準
StringBuffer 和 String 同樣都是用來存儲字符串的,只不過因爲他們內部的實現方式不一樣,致使他們所使用的範圍不一樣,對於 StringBuffer 而言,他在處理字符串時,如果對其進行修改操做,它並不會產生一個新的字符串對象,因此說在內存使用方面它是優於 String 的
StringBuilder 也是一個可變的字符串對象,他與 StringBuffer 不一樣之處就在於它是線程不安全的,基於這點,它的速度通常都比 StringBuffer 快
String 字符串的拼接會被 JVM 解析成 StringBuilder 對象拼接,在這種狀況下 String 的速度比 StringBuffer 的速度快
str +=」b」等同於 str = new StringBuilder(str).append(「b」).toString();
內部類使得多重繼承的解決方案變得更加完整
使用內部類最吸引人的緣由是:每一個內部類都能獨立地繼承一個(接口的)實現,因此不管外圍類是否已經繼承了某個(接口的)實現,對於內部類都沒有影響
使用內部類才能實現多重繼承
當咱們在建立某個外圍類的內部類對象時,此時內部類對象一定會捕獲一個指向那個外圍類對象的引用,只要咱們在訪問外圍類的成員時,就會用這個引用來選擇外圍類的成員
在成員內部類中要注意兩點,
靜態內部類與非靜態內部類之間存在一個最大的區別,咱們知道非靜態內部類在編譯完成以後會隱含地保存着一個引用,該引用是指向建立它的外圍內,可是靜態內部類卻沒有。沒有這個引用就意味着:
匿名內部類用法
public class TryUsingAnonymousClass {
public void useMyInterface() {
final Integer number = 123;
System.out.println(number);
MyInterface myInterface = new MyInterface() {
@Override
public void doSomething() {
System.out.println(number);
}
};
myInterface.doSomething();
System.out.println(number);
}
}
複製代碼
編譯後的結果
class TryUsingAnonymousClass$1 implements MyInterface {
private final TryUsingAnonymousClass this$0;
private final Integer paramInteger;
TryUsingAnonymousClass$1(TryUsingAnonymousClass this$0, Integer paramInteger) {
this.this$0 = this$0;
this.paramInteger = paramInteger;
}
public void doSomething() {
System.out.println(this.paramInteger);
}
}
複製代碼
由於匿名內部類最終用會編譯成一個單獨的類,而被該類使用的變量會以構造函數參數的形式傳遞給該類,例如:Integer paramInteger,若是變量 不定義成final的,paramInteger在匿名內部類被能夠被修改,進而形成和外部的paramInteger不一致的問題,爲了不這種不一致的狀況,由於Java 規定匿名內部類只能訪問final修飾的外部變量
靜態方法與靜態成員變量能夠被繼承,可是不能被重寫。它對子類隱藏,所以靜態方法也不能實現多態
進程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。
final 用於聲明屬性,方法和類, 分別表示屬性不可變, 方法不可覆蓋, 類不可繼承.
finally 是異常處理語句結構的一部分,表示老是執行.
finalize 是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等. JVM不保證此方法總被調用.
Serializable是Java中的序列化接口,其使用起來簡單但 是開銷很大,序列化和反序列化過程須要大量I/O操做。而Parcelable是Android中的序列化方式,所以更適合用在Android平臺上,它的缺點就是使用起來稍微麻煩 點,可是它的效率很高,這是Android推薦的序列化方式,所以咱們要首選Parcelable。Parcelable主要用在內存序列化上,經過Parcelable將對象序列化到存儲設備 中或者將對象序列化後經過網絡傳輸也都是能夠的,可是這個過程會稍顯複雜,所以在這兩種狀況下建議你們使用Serializable。
因人而異,請自行整理答案
Integer a = 2;
private void test() {
String s1 = a.toString(); //方式一
String s2 = Integer.toString(a); //方式二
String s3 = String.valueOf(a); //方式三
}
複製代碼
方式一源碼:
public String toString() {
return toString(value);
}
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(buf, true);
}
複製代碼
能夠看出
方式一
最終調用的是方式二
經過toString()方法,能夠把整數(包括0)轉化爲字符串,可是 Integer 若是是 null 的話,就會報空指針異常
方式三源碼:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
複製代碼
能夠看出 當 Integer 是null的時候,返回的String是 字符串 "null" 而不是 null