昨天參加了惠裝網的面試,有些題不會做的,記錄下來
switch語句能否作用在byte、long、String上
Java1.7以前:byte、short、int、char
Java1.7開始:新增String
因此switch語句不能作用在long上,看下面代碼:
public class Test {public static void main(String[] args) {long b=126L; //將b的類型改為byte、short、int、char都可以正常執行switch(b){ //b類型為long時,提示編譯錯誤:Incompatible Types,Found"long", required "byte、short、int、char"case 125:System.out.println("A");break;case 126:System.out.println("B");break;case 127:System.out.println("C");break;}}
}
Java中如何跳出當前的多重嵌套循環
先看代碼:
public class Test {public static void main(String[] args) {lable1:for(int i=0;i<8;i++) { //循環1System.out.println("i= "+i); lable2:for(int j=0;j<5;j++) { //循環2System.out.println(" j= " + j); lable3:for(int m=0;m<2;m++) { //循環3if (j == 2) {System.out.println(" j==2 break lable2;");break lable2; //j==2時,退出循環2,也就是上層循環}System.out.println(" m= " + m);}}}}
}
break語句一般只能退出當前循環
嵌套循環中如果要退出上面幾層的循環,那得先給該層循環定義一個標簽,在break語句處指定標簽名即可
注意的是,break只能退出包含了這個break語句的代碼塊,包括直接和間接的
break除了可用于退出嵌套循環,實際上可用于用標簽定義的代碼塊,比如下面這樣
public class Test {public static void main(String[] args) {lable1:{lable2:{lable3:{for(int i=0;i<=3;i++) {if (i==2) {break lable2;}else{System.out.println("i= " + i);}}}System.out.println("lable2的輸出,不會被執行");}System.out.println("lable3的i==2,終止lable2的執行");}}
}
HashTable與HashMap的區別
同步:HashTable的方法是同步的,而HashMap不是
null:HashTable的key和value都不能有null,而HashMap的key可以有一個null,value可以有多個null
遍歷:HashTable和HashMap都有values()、entrySet()、keySet()方法返回key的集合進行遍歷,但HashTable多了個elements()方法,可以返回Enumeration對象進行遍歷
hash值:HashTable直接使用Object的hashCode()的返回值,但HashMap還要進行一番計算
數組大小:HashTable默認大小是11,增加方式是2*old+1; 而HashMap默認是16,成倍增加
參考:http://blog.csdn.net/tianfeng701/article/details/7588091
hashCode()方法的作用
在HashMap、HashTable等集合類中,用于確定元素的存放位置,可以實現快速查找
其他: 兩個對象equals那么其hashCode一定要想等,反過來,hashCode相等,不一定equals,一個桶里可以放多個不equals的對象
序列化接口的id有什么用
可以將一個對象保存到硬盤或者在網絡上傳輸,這就需要對象的序列化。
查看Java標準庫中的類,很多都有一個“serialVersionUID”的屬性,比如HashMap是這樣的:
private static final long serialVersionUID = 362498820763181265L;
這個serialVersionUID的作用是什么呢?
就是為了保證對象在反序列化后的類跟序列化前的類能夠兼容。誰知道一個對象序列化后多久會反序列化呢,幾秒、幾天還是幾年,萬一反序列化的時候,原來的那個類進行了很多修改呢,還能反序列化為那個類型嗎?
簡單的說,這個id就是為了版本的兼容性。
那么如何指定這個id呢?
如果不特別指定,那系統會根據這個類的成員變量等信息計算一個hash。這種情況下,如果一個類后來增加刪除了幾個屬性,就很可能導致反序列化的失敗。因此最好還是自己指定一個id。
是不是id相同,就一定能反序列化成功呢?不是。如果那個類進行了一些非兼容性改動,那即使id相同,也會失敗。
構造器是否能被重寫
不能。構造器不能被繼承,不能被重寫。可以重載
Java中是否存在內存泄漏
Java有垃圾回收機制,不可達對象都會被垃圾回收器自動回收,一般而言,不會出現內存泄漏,但還是有可能的。
如果內存中存在大量的無用但可達的對象、長生命周期對象持有短生命周期對象,內存就可能會爆掉。考慮這兩種情況
- 一個類的靜態屬性指向了一個集合對象,而這個對象還會持續增大。
- 一個單例類持有外部對象的引用,這些外部對象在這個單例類的生命期內都是可達的,如果這些外部對象特別大或者持續增長而不能減小。