同步和異步、阻塞和非阻塞的區(qū)別
- 同步和異步捕犬、阻塞和非阻塞的區(qū)別
同步和異步主要指的是具體的通信過程。(從發(fā)出請求到接收響應(yīng)的過程)璧帝。
同步的特點就是調(diào)用者等待返回的結(jié)果渴庆。
異步的特點就是調(diào)用者發(fā)起請求,被調(diào)用者通過回調(diào)等形式來通知調(diào)用者下隧。 - 阻塞和非阻塞主要指的是調(diào)用者在等待返回結(jié)果時的狀態(tài)。阻塞時,在調(diào)用結(jié)果返回前宠能,當(dāng)前線程會被掛起,一直等到得到結(jié)果之后再返回定踱。非阻塞時棍潘,如果當(dāng)前線程不會馬上得到結(jié)果,那么調(diào)用者不會阻塞當(dāng)前線程,但是這種方式可以了解到亦歉,調(diào)用者需要定時輪詢查看處理狀態(tài)恤浪。
hashcode問題
- 什么是hashcode
hashcode主要是用來在散列存儲結(jié)構(gòu)中確定對象的存儲地址。通過hashcode找到數(shù)組的下標(biāo)肴楷,進而找到對應(yīng)的鏈表水由。 - java中規(guī)定
① 如果兩個對象相同,那么它們的hashcode值一定相同赛蔫。
② 如果兩個對象的hashcode相同砂客,那么它們不一定相同。 - 解釋
如果兩個對象的hashcode相同呵恢,只能得到兩個對象對應(yīng)的是同一個數(shù)組的下標(biāo)鞠值,它們可能是同一個對象,也有可能只是在同一條鏈表上而已渗钉。
transient關(guān)鍵字
作用:transient關(guān)鍵字修飾的變量將不會被序列化彤恶。
注意:transient關(guān)鍵字只能修飾變量不能修飾類和方法、一個靜態(tài)變量不會因為被transient修飾而序列化鳄橘。
@ToString
@Data
public class UserVO implements Serializable {
private String username;
private transient String pwd;
}
public class Test {
/**
* 將對象寫入到磁盤
* @param obj
* @throws Exception
*/
private static void writeObjToDisk(Object obj) throws Exception {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("E:/test/user.txt"));
objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();
}
/**
* 將磁盤上的對象讀出來
* @return
* @throws Exception
*/
private static Object readObjFromDisk() throws Exception {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("E:/test/user.txt"));
UserVO userVO = (UserVO) objectInputStream.readObject();
return userVO;
}
public static void main(String[] args) throws Exception {
UserVO user = new UserVO();
user.setUsername("Sunpy");
user.setPwd("123456789");
System.out.println(user.toString());
writeObjToDisk(user);
UserVO serializableUser = (UserVO) readObjFromDisk();
System.out.println(serializableUser.toString());
}
}
final關(guān)鍵字
- final修飾的類:final修飾的類無法被繼承声离、final修飾的類中的成員方法默認都為final。
- final修飾的方法:final修飾的方法不能被子類重寫瘫怜。
- final修飾的變量:final修飾的變量可以先聲明术徊,后賦值。final修飾的基本類型變量不可修改鲸湃,final修飾的引用類型赠涮,不能再指向其他對象(只是指向了對象的地址,被指向的對象的值可以改變)唤锉。
- final修飾的方法變量:如果變量為基本類型世囊,不會改變。如果變量為引用類型窿祥,對象本身不允許改變株憾,但是對象的屬性值可以改變。
static關(guān)鍵字
- static變量也稱作靜態(tài)變量晒衩,靜態(tài)變量和非靜態(tài)變量的區(qū)別是:靜態(tài)變量被所有的對象所共享嗤瞎,在內(nèi)存中只有一個副本,它當(dāng)且僅當(dāng)在類初次加載時會被初始化听系。而非靜態(tài)變量是對象所擁有的贝奇,在創(chuàng)建對象的時候被初始化,存在多個副本靠胜,各個對象擁有的副本互不影響掉瞳。
- static方法一般稱作靜態(tài)方法毕源,在靜態(tài)方法中不能訪問類的非靜態(tài)成員變量和非靜態(tài)成員方法,因為非靜態(tài)成員方法/變量都是必須依賴具體的對象才能夠被調(diào)用陕习。
組合與繼承的區(qū)別
- 組合通常就是在新類中使用現(xiàn)有類的功能霎褐,而不是現(xiàn)有類的結(jié)構(gòu)。新類中通過使用現(xiàn)有類的功能而完成新的功能该镣。組合這種形式就是一種顯式地調(diào)用冻璃。
- 繼承的意思就是父類和子類是同一類的東西。只是通過使用新類來擴展父類的功能损合。子類只是父類的一種特殊的類型省艳。繼承是一種隱式地調(diào)用。
- 組合說到底是通過has-a(有一個)這種方式來表達兩個事物之間的關(guān)系嫁审。繼承是通過is-a(是一個)這種方式來表達兩個事物之間的關(guān)系跋炕。
接口與抽象類的區(qū)別
- 什么是接口:
- 接口本身是一種對行為的一種抽象,實現(xiàn)接口的類將按照接口的規(guī)范約束行為土居。例如:人可以跑枣购,狗嬉探,貓都可以跑擦耀。人,狗涩堤,貓多種動物眷蜓,只要可以跑就可以實現(xiàn)跑這個行為的接口。
- 我們開發(fā)中經(jīng)常說給別人提供接口胎围,而不是說給別人提供實現(xiàn)類吁系。我們將屬性私有,通過接口中的行為來操作白魂。這樣封裝了內(nèi)部的實現(xiàn)汽纤。
- 當(dāng)我們對外提供接口,而不是直接暴露實現(xiàn)類福荸,這樣調(diào)用的類就實現(xiàn)了與提供類之間的解耦(外觀模式)蕴坪,在mvc模式中用的特多。
- 當(dāng)我們定義了一個接口敬锐,它只是一種行為的抽象背传,我們也可以提供多種實現(xiàn),這樣保證不用每次因為實現(xiàn)要改變而不停的改變實現(xiàn)類(策略模式)台夺。
- 什么是抽象類:
- 抽象類本身是一種對事物的抽象径玖。將多個事物抽象出一種共同特征的事物。例如:狗是動物颤介,貓是動物梳星,人也是動物赞赖。動物就是抽象類。貓狗人就是繼承動物的子類冤灾。
- 抽象類中既可以定義抽象方法薯定,也可以定義普通方法。子類繼承抽象類必須重寫抽象方法瞳购。
- 區(qū)別
- 一個類可以實現(xiàn)多個接口话侄,只能有一個繼承抽象類(java單繼承多實現(xiàn))。
- 接口只能定義抽象方法学赛,但是抽象類中可以定義抽象方法也可以定義普通方法年堆。