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方法等 |