這些基本數(shù)據(jù)類型為什么有對(duì)應(yīng)的包裝類姑丑?
1、因?yàn)榛緮?shù)據(jù)類型不具備面向?qū)ο蟮乃枷氪怯眩荒軐?shí)例化栅哀,沒(méi)有一些對(duì)應(yīng)的方法可進(jìn)行調(diào)用。
2、數(shù)據(jù)庫(kù)允許有NULL昌屉,數(shù)據(jù)處理無(wú)法進(jìn)行操作钙蒙。
裝箱與拆箱
1、裝箱是將值類型轉(zhuǎn)換成引用類型的過(guò)程间驮,拆箱就是將引用類型轉(zhuǎn)換成值類型的過(guò)程躬厌。
2、注:只有裝過(guò)箱的對(duì)象才能拆箱竞帽;
Integer a = 1; // 自動(dòng)裝箱 具體實(shí)現(xiàn)是調(diào)用valueOf(1)
int b = a; // 自動(dòng)拆箱 具體實(shí)現(xiàn)是調(diào)用intValue()
兩個(gè)Integer的引用對(duì)象傳給一個(gè)swap(交換)方法扛施,在方法內(nèi)部交換引用,返回后屹篓,兩個(gè)引用值是否發(fā)生變化疙渣?
1、不會(huì)發(fā)生變化堆巧,因?yàn)镴ava中所有的參數(shù)傳遞都是值傳遞妄荔,不存在引用傳遞。
2谍肤、如果想讓值發(fā)生變化啦租,可以通過(guò)反射機(jī)制修改引用地址,則swap方法需要如下:
public void swap(Integer a,Integer b){
// 反射獲取成員變量
Field value = Integer.class.getDeclaredField("value");
value.setAccessible(true);
int temp = a.intValue;
value.set(a,b.intValue);
value.set(b,temp);
}
兩個(gè)Integer引用值相同荒揣,是否是同一個(gè)對(duì)象篷角?
1、要看取值范圍系任,在-128 - 127之間則是同一個(gè)對(duì)象恳蹲,否則不是。
== 和 equals區(qū)別俩滥?
1嘉蕾、== 是位運(yùn)算符,如果是基本數(shù)據(jù)類型則比較存儲(chǔ)的值举农,如果是引用類型則比較的是堆內(nèi)存地址荆针。
2敞嗡、equals是Object的一個(gè)方法颁糟,比較的是地址。
集合與數(shù)組
image.png
為什么ArrayList的elementData加上transient修飾喉悴?
1棱貌、不被反序列化破壞,elementData支持序列化箕肃。
2婚脱、序列化的時(shí)候先調(diào)用writeObject里面的defaultWriteObject,從ArrayList里面去遍歷非transient的元素,檢索了序列化后文件大小障贸。
單例有多少種實(shí)現(xiàn)方法错森?哪些不會(huì)被序列化、反序列化破壞篮洁?怎么確保不會(huì)被破壞涩维?
1、餓漢式(線程不安全)
①構(gòu)造方法私有化
②在靜態(tài)語(yǔ)句塊實(shí)例化
③提供調(diào)用實(shí)例的方法
④空間換時(shí)間袁波,不管有沒(méi)有調(diào)用方法瓦阐,實(shí)例都創(chuàng)建
2、懶漢式(線程安全)
①構(gòu)造方法私有化
②在調(diào)用時(shí)判斷是否實(shí)例化
③時(shí)間換空間篷牌,調(diào)用方法時(shí)創(chuàng)建實(shí)例對(duì)象
3睡蟋、雙檢索懶漢式
①構(gòu)造方法私有化
②在調(diào)用時(shí)判斷是否實(shí)例化
③時(shí)間換空間,調(diào)用方法時(shí)創(chuàng)建實(shí)例對(duì)象
4枷颊、靜態(tài)內(nèi)部類
5戳杀、枚舉