Java 拾遺一

1. 九種基本數(shù)據(jù)類型的大小畜疾,以及他們的封裝類

數(shù)據(jù)類型 大小(字節(jié)) 封裝類型 默認(rèn)值 取值范圍
byte 1 Byte (byte)0 [-2^7龟再, -2^7-1]
short 2 Short (short)0 [-2^15囊榜, -2^15-1]
int 4 Integer 0 [-2^31审胸, -2^31-1]
long 8 Long 0L [-2^63, -2^63-1]
float 4 Float 0.0f [-2^31卸勺, -2^31-1]
double 8 Double 0.0d [-2^63砂沛, -2^63-1]
boolean - Boolean false -
char 2 Character \u0000(null)
void - Void - -

Java二進(jìn)制數(shù)編碼:
[原碼]就是前面所介紹的二進(jìn)制定點(diǎn)表示法,即最高位為符號位曙求,“0”表示正碍庵,“1”表示負(fù),其余位表示數(shù)值的大小悟狱。
[反碼]表示法規(guī)定:正數(shù)的反碼與其原碼相同静浴;負(fù)數(shù)的反碼是對其原碼逐位取反,但符號位除外挤渐。
[補(bǔ)碼]表示法規(guī)定:正數(shù)的補(bǔ)碼與其原碼相同苹享;負(fù)數(shù)的補(bǔ)碼是在其反碼的末位加1。

Java 使 用 補(bǔ) 碼 來 表 示 二 進(jìn) 制 數(shù) ,在 補(bǔ)碼表示中 ,最高位為符號位 ,正 數(shù)的符號位為 0,負(fù) 數(shù)為 1浴麻。
最大的應(yīng)該是0111 1111 即127
最小的應(yīng)該是1000 0000 即-128(按位取反得问,然后對整數(shù)加1)
byte 是1個(gè)字節(jié)也就是8位負(fù)數(shù)的補(bǔ)碼是該 數(shù)絕對值的原碼按位取反 ,然 后對 整個(gè)數(shù)加 1

2. Switch 能否用 String 做參數(shù)囤攀?

Java 5 以前,Switch 只支持 byte宫纬、short焚挠、char、int 類型漓骚;
Java 5 開始蝌衔,Switch 引入 enum 類型;
Java 7 開始认境,Switch 引入 String 類型胚委。

3. equals 與 == 的區(qū)別?

equals 操作表示連個(gè)變量是否為同一個(gè)對象的引用叉信,即比較堆內(nèi)存中存放的地址亩冬;
== 操作對于基本數(shù)據(jù)類型比較的是他們的值,對于非基本數(shù)據(jù)類型比較的是變量在堆內(nèi)存地址是否相同硼身。

4. Object 有哪些公用方法硅急?

公用方法 訪問權(quán)限及修飾符 作用
getClass public/final/native 獲得運(yùn)行時(shí)類型
hashCode public/native 該方法用于哈希查找,可以減少在查找中使用 equals 的次數(shù);
重寫 equals 方法一般都要重寫 hashCode佳遂;
在一些具有哈希功能的 Collection 中用到营袜,在 HashSet 中如果不重寫 hashCode 會(huì)將兩個(gè) equals 的對象都加入進(jìn)去。
equals public Object 中的 equal 和 == 的作用是一樣的丑罪;
String 等子類中的 equals 方法是比較值的荚板,是因?yàn)?String 重寫了 equals 方法。
clone public/native 實(shí)現(xiàn)對象淺復(fù)制吩屹,只有在實(shí)現(xiàn)了 Cloneable 接口時(shí)才可以調(diào)用該方法
toString public 將對象轉(zhuǎn)為字符串
notify public/final/native 該方法喚醒在該對象上等待的某個(gè)線程
notifyAll public/final/native 該方法喚醒在該對象上等待的所有線程
wait public/final/native 使當(dāng)前線程等待該對象鎖跪另;
1.該方法必須在獲取到該對象的同步鎖后才能調(diào)用;
2.其它線程調(diào)用 notify 或是 wait 達(dá)到超時(shí)時(shí)間或者其它線程調(diào)用了 interrupt 中斷了該線程煤搜,此時(shí)該線程就可以被調(diào)度了免绿,如果是 interrupt 的則拋出異常;
3.調(diào)用對象的 wait 方法導(dǎo)致該線程阻塞擦盾;
finalize public/final/native 該方法用于釋放資源嘲驾。因?yàn)闊o法確定該方法什么時(shí)候被調(diào)用,很少使用

5. Java的四種引用(強(qiáng)軟弱虛)迹卢,用到的場景

引用類型 使用場景 GC
強(qiáng)引用 String str = "hello" 強(qiáng)引用指向的對象永遠(yuǎn)不會(huì)被 GC辽故,及時(shí)拋出 OOM
軟引用(SoftReference) SoftReference aSoftRef=new SoftReference(aRef);
可以用來實(shí)現(xiàn)內(nèi)存敏感的高速緩存,防止內(nèi)存泄露腐碱,增強(qiáng)程序健壯性
內(nèi)存空間足夠時(shí)不會(huì)被 GC榕暇,內(nèi)存空間不足時(shí)就會(huì)回收這些對象
弱引用(WeakReference) WeakReference<People>reference=new WeakReference<People>(new People("zhouqian",20));
當(dāng) JVM 進(jìn)行垃圾回收時(shí),無論內(nèi)存是否充足都會(huì)回收被弱引用關(guān)聯(lián)的對象
虛引用(PhantomReference) ReferenceQueue<String> queue = new ReferenceQueue<String>();
PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);
虛引用必須和引用隊(duì)列關(guān)聯(lián)使用
任何時(shí)候都可能被垃圾回收器回收

ReferenceQueue:
1.Reference queues, to which registered reference objects are appended by the garbage collector after the appropriate reachability changes are detected.
(Reference queues,在適當(dāng)?shù)臅r(shí)候檢測到對象的可達(dá)性發(fā)生改變后,垃圾回收器就將已注冊的引用對象添加到此隊(duì)列中)
2.Reference 類首先把內(nèi)存分為4種狀態(tài)Active彤枢,Pending,Enqueued筒饰,Inactive

6. hashcode 方法的作用

hashcode 方法返回該對象的哈希碼值缴啡。支持該方法是為哈希表提供一些優(yōu)點(diǎn),例如瓷们,java.util.Hashtable 提供的哈希表业栅。
hashCode 的常規(guī)協(xié)定是:
1.在 Java 應(yīng)用程序執(zhí)行期間,在同一對象上多次調(diào)用 hashCode 方法時(shí)谬晕,必須一致地返回相同的整數(shù)碘裕,前提是對象上 equals 比較中所用的信息沒有被修改。
從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行攒钳,該整數(shù)無需保持一致帮孔。
如果根據(jù) equals(Object) 方法,兩個(gè)對象是相等的不撑,那么在兩個(gè)對象中的每個(gè)對象上調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果文兢。
2.當(dāng)equals方法被重寫時(shí),通常有必要重寫 hashCode 方法焕檬,以維護(hù) hashCode 方法的常規(guī)協(xié)定姆坚,該協(xié)定聲明相等對象必須具有相等的哈希碼。
3.如果根據(jù) equals(java.lang.Object) 方法实愚,兩個(gè)對象不相等兼呵,那么在兩個(gè)對象中的任一對象上調(diào)用 hashCode 方法必定會(huì)生成不同的整數(shù)結(jié)果。
4.由 Object 類定義的 hashCode 方法確實(shí)會(huì)針對不同的對象返回不同的整數(shù)腊敲。為不相等的對象生成不同整數(shù)結(jié)果可以提高哈希表的性能击喂。

7. ArrayList、LinkedList兔仰、Vector 的區(qū)別

類型 特點(diǎn)
ArrayList 是線程不安全的茫负;是一個(gè)大小可變的數(shù)組;插入和移除元素代價(jià)高昂乎赴,因?yàn)椴迦牒鸵瞥貢r(shí)需要移動(dòng)既有的元素忍法;
LinkedList 是一個(gè)雙向鏈表;插入和移除元素代價(jià)低廉榕吼;隨機(jī)訪問元素內(nèi)容代價(jià)高昂饿序;
Vector 與 ArrayList 相似,但是是線程安全的羹蚣;已經(jīng)棄用原探;

8. String、StringBuffer 與 StringBuilder 的區(qū)別

類型 特點(diǎn)
String 是字符串常量;String 對象一旦創(chuàng)建之后該對象是不可更改的咽弦;
StringBuffer 是字符串變量徒蟆;線程安全;適用于多線程下載字符緩沖區(qū)進(jìn)行大量操作的情況型型;
StringBuilder 是字符串變量段审;線程不安全;適用于單線程下載字符緩沖區(qū)進(jìn)行大量操作的情況闹蒜;

常量池(onstant pool):
指的是在編譯期被確定寺枉,并被保存在已編譯的.class文件中的一些數(shù)據(jù)。它包括了關(guān)于類绷落、方法姥闪、接口等中的常量,也包括字符串常量砌烁。

  • String str = "abc" 和 String str1 = new String("abc"):
1. String str1 = "abc"; 
  System.out.println(str1 == "abc"); 

步驟: 
1) 棧中開辟一塊空間存放引用str1筐喳;
2) String池中開辟一塊空間,存放String常量"abc"往弓; 
3) 引用str1指向池中String常量"abc"疏唾;
4) str1所指代的地址即常量"abc"所在地址,輸出為true函似; 

2. String str2 = new String("abc"); 
  System.out.println(str2 == "abc"); 

步驟: 
1) 棧中開辟一塊空間存放引用str2槐脏; 
2) 堆中開辟一塊空間存放一個(gè)新建的String對象"abc"; 
3) 引用str2指向堆中的新建的String對象"abc"撇寞;
4) str2所指代的對象地址為堆中地址顿天,而常量"abc"地址在池中,輸出為false蔑担; 

3. String str3 = new String("abc"); 
  System.out.println(str3 == str2); 

步驟: 
1) 棧中開辟一塊空間存放引用str3牌废;
2) 堆中開辟一塊新空間存放另外一個(gè)(不同于str2所指)新建的String對象; 
3) 引用str3指向另外新建的那個(gè)String對象 啤握;
4) str3和str2指向堆中不同的String對象鸟缕,地址也不相同,輸出為false排抬; 

4. String str4 = "a" + "b"; 
  System.out.println(str4 == "ab"); 

步驟: 
1) 棧中開辟一塊空間存放引用str4懂从; 
2) 根據(jù)編譯器合并已知量的優(yōu)化功能,池中開辟一塊空間蹲蒲,存放合并后的String常量"ab"番甩; 
3) 引用str4指向池中常量"ab";
4) str4所指即池中常量"ab"届搁,輸出為true缘薛; 

5. final String s = "a"; //注意:這里s用final修飾窍育,相當(dāng)于一個(gè)常量
  String str5 = s + "b"; 
  System.out.println(str5 == "ab"); 

步驟: 
同四

6. String s1 = "a"; 
  String s2 = "b"; 
  String str6 = s1 + s2; 
  System.out.println(str6 == "ab"); 

步驟: 
1) 棧中開辟一塊中間存放引用s1,s1指向池中String常量"a"宴胧, 
2) 棧中開辟一塊中間存放引用s2漱抓,s2指向池中String常量"b", 
3) 棧中開辟一塊中間存放引用str5恕齐, 
4) s1 + s2通過StringBuilder的最后一步toString()方法還原一個(gè)新的String對象"ab"辽旋,因此堆中開辟一塊空間存放此對象, 
5) 引用str6指向堆中(s1 + s2)所還原的新String對象檐迟, 
6) str6指向的對象在堆中,而常量"ab"在池中码耐,輸出為false 

7. String str7 = "abc".substring(0, 2); 
  
步驟: 
1) 棧中開辟一塊空間存放引用str7追迟, 
2) substring()方法還原一個(gè)新的String對象"ab"(不同于str6所指),堆中開辟一塊空間存放此對象骚腥, 
3) 引用str7指向堆中的新String對象敦间, 

8. String str8 = "abc".toUpperCase(); 
  
步驟: 
1) 棧中開辟一塊空間存放引用str6, 
2) toUpperCase()方法還原一個(gè)新的String對象"ABC"束铭,池中并未開辟新的空間存放String常量"ABC"廓块, 
3) 引用str8指向堆中的新String對象
9.String s="abc";
  String s1=s;
  System.out.println(s1=="abc");
  s=s+"hello";
  System.out.println(s1=="abc");
  System.out.println(s=="abc");


步驟:
1)棧中開辟一塊空間存放s;
2)Sting池中開辟一塊空間用于存放"abc"契沫,棧中開辟一塊空間存放變量s1带猴;
3)系統(tǒng)輸出true,在堆中開辟一塊空間用于存放"abchello"懈万;
4)引用s指向堆中的"abchello"拴清;
5)系統(tǒng)輸出true,然后輸出false会通;

9. Map口予、Set、List涕侈、Queue沪停、Stack 的特點(diǎn)與用法

類型 特點(diǎn) 用法
Map 鍵值對 Map中可以將Key和Value單獨(dú)抽取出來,其中KeySet()方法可以將所有的keys抽取成一個(gè)Set裳涛。而Values()方法可以將map中所有的values抽取成一個(gè)Set
Set 不包含重復(fù)元素的集合 -
List 有序的可重復(fù)集合木张;涉及堆棧,隊(duì)列等操作调违,建議使用List窟哺;快速插入和刪除元素的,建議使用LinkedList技肩;需要快速隨機(jī)訪問元素的且轨,建議使用ArrayList -
Queue 遵從先進(jìn)先出原則 使用時(shí)盡量避免add()和remove()方法,而是使用offer()來添加元素浮声,使用poll()來移除元素,它的優(yōu)點(diǎn)是可以通過返回值來判斷是否成功
Stack 遵從后進(jìn)先出原則 它提供了通常的push和pop操作旋奢,以及取堆棧頂點(diǎn)的peek()方法泳挥、測試堆棧是否為空的empty方法等
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市至朗,隨后出現(xiàn)的幾起案子屉符,更是在濱河造成了極大的恐慌,老刑警劉巖锹引,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矗钟,死亡現(xiàn)場離奇詭異,居然都是意外死亡嫌变,警方通過查閱死者的電腦和手機(jī)吨艇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腾啥,“玉大人东涡,你說我怎么就攤上這事√却” “怎么了疮跑?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凸舵。 經(jīng)常有香客問我祖娘,道長,這世上最難降的妖魔是什么贞间? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任贿条,我火速辦了婚禮,結(jié)果婚禮上增热,老公的妹妹穿的比我還像新娘整以。我一直安慰自己,他們只是感情好峻仇,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布公黑。 她就那樣靜靜地躺著,像睡著了一般摄咆。 火紅的嫁衣襯著肌膚如雪凡蚜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天吭从,我揣著相機(jī)與錄音朝蜘,去河邊找鬼。 笑死涩金,一個(gè)胖子當(dāng)著我的面吹牛谱醇,可吹牛的內(nèi)容都是我干的暇仲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼副渴,長吁一口氣:“原來是場噩夢啊……” “哼奈附!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起煮剧,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤斥滤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后勉盅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佑颇,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年草娜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漩符。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驱还,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凸克,到底是詐尸還是另有隱情议蟆,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布咐容,位于F島的核電站蚂维,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔚约。R本人自食惡果不足惜涂籽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一评雌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砂轻,春花似錦斤吐、人聲如沸厨喂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽故响。三九已至,卻和暖如春伪冰,著一層夾襖步出監(jiān)牢的瞬間贮聂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工吓懈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耻警,地道東北人甘穿。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓梢杭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妨托。 傳聞我的和親對象是個(gè)殘疾皇子兰伤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345