1、抽象類和接口的區(qū)別
抽象類用來捕捉子類的公共特性,不能被實(shí)例化,只能用作被子類繼承的超類。
接口是抽象方法的集合,若一個(gè)類實(shí)現(xiàn)了某接口,就必須實(shí)現(xiàn)接口中的所有抽象方法。
| 參數(shù) | 抽象類 | 接口 |
|---|---|---|
| 默認(rèn)方法實(shí)現(xiàn) | 可以有默認(rèn)方法 | 無默認(rèn)方法,JAVA1.8之后有默認(rèn)方法 |
| 實(shí)現(xiàn)方式 | extends | implement |
| 繼承性態(tài) | 單繼承 | 多實(shí)現(xiàn) |
| 構(gòu)造器 | 可以有構(gòu)造器 | 無構(gòu)造器 |
2、java的異常有哪幾類?分別怎么使用?
編譯時(shí)異常:
IOException
SQLException
parseException
CloneNotSupportException
運(yùn)行時(shí)異常:
NullpointerException
ArrayIndexOutOfBoundsException
NoClassDefFoundException
ClassCastException
OutOfMemoryException
ArithmeticException
IllegalArgumentException: 非法參數(shù)異常
IllegalThreadStateException: 非法線程狀態(tài)異常
NumberFormatException: 數(shù)據(jù)格式異常
PatternSyntaxException:
使用:
1、throws
2、try{}catch(Exception e){}
3、常用的集合類有哪些?比如List如何排序?
Collection:
List:
ArrayList
LinkedList
Set:
HashSet
LinkedHashSet
SortedSet
Map:
HashMap
LinkedHashMap
ConcourrentHashMap
List如何排序:
要排序的對(duì)象實(shí)現(xiàn)Comparable接口
Collections.sort()方法
4、內(nèi)存溢出是怎么回事?請(qǐng)舉一個(gè)例子?
OutOfMemroyException:PermGen space
啟動(dòng)程序時(shí)加載信息過大,超過Permanment Generation space空間大小
OutOfMemoryException:Java heap space
程序運(yùn)行過程中,很多對(duì)象沒有被垃圾回收機(jī)制回收
StackOverFlowError
棧中保存對(duì)象過多,可能出現(xiàn)在遞歸方法調(diào)用過多的情況
5、hashCode方法的作用
在不允許重復(fù)的集合中,比如set、hashTable、HashMap中,在put過程中,保證數(shù)據(jù)不重復(fù),先通過比較hashcode,若hashcode不同,則兩個(gè)對(duì)象肯定不一樣,若hashcode相同,才調(diào)用equals方法,一定程度上提高put的速率。
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
先判斷key是否為空
不為空的話,生成hashcode
根據(jù)hashcode找到對(duì)應(yīng)桶的位置
對(duì)應(yīng)位置上若有key相同的數(shù)據(jù),則覆蓋原數(shù)據(jù)
添加數(shù)據(jù)到對(duì)應(yīng)的位置
6、保證hashmap的線程安全
1、使用hashTable,相應(yīng)的方法都加了鎖
2、java.util.Collections.synchronizedMap(Map)對(duì)map進(jìn)行封裝
3、使用concurrentHashMap
7、創(chuàng)建一個(gè)類的實(shí)例都有哪些辦法?
new
反射
類實(shí)現(xiàn)克隆接口,克隆一個(gè)實(shí)例
實(shí)現(xiàn)序列化接口的類,通過IO流反序列化讀取一個(gè)類,獲得實(shí)例。
8、Servlet的生命周期
1、加載和實(shí)例化
2、初始化
3、調(diào)用service方法
4、銷毀
9、如何用Java分配一段連續(xù)的1G的內(nèi)存空間?需要注意些什么?
ByteBuffer.allocateDirect(102410241024)
10、什么是java序列化,如何實(shí)現(xiàn)java序列化?(寫一個(gè)實(shí)例)?
序列化是java處理對(duì)象流的一種機(jī)制,可對(duì)序列化后的對(duì)象進(jìn)行讀寫操作,也可在網(wǎng)路進(jìn)行傳輸。
實(shí)現(xiàn)java序列化,對(duì)象要實(shí)現(xiàn)serializable接口,該對(duì)象的類名、簽名、字段、數(shù)值都會(huì)被編碼
11、java使用jdbc連接數(shù)據(jù)庫的步驟
獲得數(shù)據(jù)庫連接驅(qū)動(dòng)Driver
獲得數(shù)據(jù)庫連接Connection
獲得statement對(duì)象
用statement對(duì)象執(zhí)行數(shù)據(jù)庫操作
處理執(zhí)行結(jié)果
若有異常,進(jìn)行異常處理
不管是否有異常都要關(guān)閉JDBC對(duì)象,以釋放JDBC資源,requestSet、statement、connection
12、select count(),count(1), count(col_name) from dual 區(qū)別
1)、count(col_name),統(tǒng)計(jì)的col_name中不會(huì)統(tǒng)計(jì)null,其他兩者會(huì)統(tǒng)計(jì)null
2)、有主鍵,count(主鍵)比較快
3)、一般情況下count(1)比count()快,但是表中只有一個(gè)列,count(*)比較快
4)、在InnoDb中執(zhí)行select count(1) from table 會(huì)做行數(shù)的統(tǒng)計(jì),而MyISAM中,會(huì)直接讀取已存取好的總數(shù)。但是select count(1) from table where col='' ,加了篩選條件之后二者是一樣的去統(tǒng)計(jì)行數(shù)。