1.Object有多少個函數(shù)?
Object有九個函數(shù):
- final Class <? extends Object> getClass()返回一個對象的運(yùn)行時類,例如下面的代碼:
`
public class ObjectTest<T> extends Object{
public static void main(String[] args) {
Object a = new ObjectTest<String>();
Object b = new ObjectTest<Integer>();
System.out.println(a.getClass());
System.out.println(b.getClass());
System.out.println((new ObjectTest<String>()).getClass());
System.out.println(a.hashCode());
System.out.println(b.hashCode());
}
}
返回結(jié)果相同,getClass都是返回ObjectTest,都是相同的。 - int hashCode:Java程序運(yùn)行期間炬搭,在同一個對象對此調(diào)用此函數(shù)赡麦,必須返回相同值痘拆,前提是equals比較所用信息沒有被修改奄抽。如果equals方法判定兩個對象相等,那么hashCode生成相同的整數(shù)結(jié)果酝枢。如果equals判定不相等,hashCode一定產(chǎn)生不同整數(shù)結(jié)果悍手。Object類定義的hashCode方法確實(shí)會針對不同的對象返回不同值帘睦,一般是通過將該對象的內(nèi)部地址轉(zhuǎn)換為一個整數(shù)來實(shí)現(xiàn)袍患。
- boolean equals,自反對稱傳遞竣付。
- Object clone() throws CloneNotSupportedException诡延,必須要將Clonable接口實(shí)現(xiàn)才能調(diào)用,否則拋出異常古胆。Clonable接口本身并無內(nèi)容肆良,只是表明此對象可以使用Clone函數(shù)。
- toString
- finalize()方法逸绎,JVM內(nèi)存回收時調(diào)用惹恃,如果子類覆蓋了,對象一定要執(zhí)行一次內(nèi)存回收棺牧。
- wait 導(dǎo)致當(dāng)前線程等待巫糙,直到該對象的notify或notifyAll被執(zhí)行。即申請持有鎖颊乘。
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
該方法必須同步執(zhí)行的参淹,否則會拋出IllegalMonitorStateException。 - notify 隨機(jī)選擇一個對象疲牵,解除阻塞狀態(tài)承二,告知鎖解除。智能在同步方法或同步方法塊中執(zhí)行纲爸,且調(diào)用者必須持有鎖亥鸠。
- notifyall 通知所有線程。其余與上者相同识啦。
2.JVM的垃圾回收機(jī)制介紹负蚊?
見第四條OOM發(fā)生。
3.介紹GNU颓哮?操作系統(tǒng)加載家妆?
4.Object的HashCode如果不實(shí)現(xiàn)的話返回值是什么?
由地址轉(zhuǎn)換的hash值冕茅。
1.做了什么項目伤极?了解什么框架?
2.數(shù)據(jù)庫范式定義姨伤?
參考:http://www.cnblogs.com/zhanht/p/5401699.html
參考:http://blog.csdn.net/qingking520/article/details/52937728
第一范式(1NF):屬性(實(shí)體所具有的某一特性)不可分哨坪。
第二范式(2NF):滿足第一范式,并且乍楚,一定要有一個主鍵当编,非主屬性完全依賴于主鍵。一個屬性在候選碼中出現(xiàn)就是主屬性徒溪。與之相對的就是非主屬性忿偷。完全指不是部分金顿,而是全部。
第三范式(3NF):首先是 2NF鲤桥,另外非主鍵列必須直接依賴于主鍵揍拆,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴于非主鍵列 B芜壁,非主鍵列 B 依賴于主鍵的情況礁凡。依賴傳遞。即依賴是唯一的慧妄。
BC范式(BCNF):符合3NF顷牌,并且,主屬性不依賴主屬性塞淹。
第四范式:要求把同一表內(nèi)多對多關(guān)系刪除窟蓝。
第五范式:從最終結(jié)構(gòu)建立原始結(jié)構(gòu)。
3.排序算法饱普?
4.Java內(nèi)存溢出运挫?
簡述下個人思路:JVM運(yùn)行時數(shù)據(jù)區(qū)域包括線程私有的本地方法棧、虛擬機(jī)棧套耕、程序計數(shù)器谁帕,線程共享的方法區(qū)和堆。會發(fā)生OOM的公有本地方法棧(椃肱郏可以動態(tài)擴(kuò)展匈挖,否則StackOverFlowError)嗤栓、虛擬機(jī)棧(椄改埽可以動態(tài)擴(kuò)展)七婴、方法區(qū)(包括方法區(qū)和運(yùn)行時常量池)冈爹、堆(大頭)。
什么時候發(fā)生OOM(主要以堆來闡述)澄耍,當(dāng)堆(新生代奢米,主要是Eden)沒有足夠的內(nèi)存時發(fā)起一次MinorGC(針對新生代油湖,復(fù)制法检激,其余還有標(biāo)記-清楚肴捉、標(biāo)記-整理),使用可達(dá)性分析(Python計數(shù)法)叔收;如果晉升導(dǎo)致老年代滿了每庆,則觸發(fā)一次MajorGC(老年代)。永久代滿了使用FullGC(清理整個空間今穿,包括永久代)。執(zhí)行完了發(fā)現(xiàn)還沒有內(nèi)存伦籍,才OOM蓝晒。
5.線程與進(jìn)程的區(qū)別腮出?
線程調(diào)度的單位,進(jìn)程是資源分配的單位芝薇。
6.為什么要序列化胚嘲?什么場景用到?有哪些方法洛二?弊端馋劈?
序列化:將一個對象編碼成一個字節(jié)流,稱作將該對象序列化晾嘶;相反的過程稱為反序列化妓雾。
應(yīng)用場景:對象被序列化后,其編碼就能從一臺虛擬機(jī)傳輸?shù)搅硗庖慌_虛擬機(jī)垒迂,或者存儲到磁盤上械姻。
如何實(shí)現(xiàn):
- 實(shí)現(xiàn)Serializable接口
將Java對象根據(jù)屬性值轉(zhuǎn)換為字節(jié)序列,transient。static關(guān)鍵字則沒辦法實(shí)例化机断,舉例(HashMap的modCount)楷拳。場景,持久化吏奸、網(wǎng)絡(luò)傳輸欢揖、進(jìn)程通信、緩存等奋蔚。Serializable實(shí)際上就是用了一個獨(dú)立于你實(shí)現(xiàn)構(gòu)造函數(shù)之外的構(gòu)造函數(shù)去創(chuàng)建
弊端:1.大端小端2.破壞單例她混。
付出的代價(隱含了可能的失敗): - 如果沒有顯示化聲明私有靜態(tài)的final的long域下的UID旺拉,則系統(tǒng)會更具類的實(shí)現(xiàn)自動生成該標(biāo)識产上,那么,當(dāng)修改類的時候蛾狗,可能造成發(fā)布版本的變化晋涣。
- 增加了出現(xiàn)Bug和安全漏洞的可能性。通常情況下對象是利用構(gòu)造器來創(chuàng)建的沉桌,序列化機(jī)制是一種語言之外的對象創(chuàng)建機(jī)制谢鹊。因此反序列化具備與其他構(gòu)造器相同的特點(diǎn),由于沒有顯示的構(gòu)造器留凭,很可能導(dǎo)致疏忽構(gòu)造過程的規(guī)約佃扼。
- 加大測試負(fù)擔(dān)。
- 盡量不使用自定義序列化形式蔼夜,使用默認(rèn)序列化形式將出很多狀況兼耀,具體詳見《Effective Java》第75條。
- 序列化植入代碼,引用指向本對象可變的引用瘤运,導(dǎo)致程序發(fā)生不可逆轉(zhuǎn)的變化窍霞,《Effective Java》第76條。
- 反序列化破壞單例模式拯坟,詳情見《Effective Java》第77條但金。
7.java反射機(jī)制的實(shí)現(xiàn)原理
所謂反射機(jī)制就是java語言運(yùn)行時擁有一項自觀的能力。通過這種能力可以徹底了解自身的情況為下一步的動作做準(zhǔn)備郁季,Java反射機(jī)制的實(shí)現(xiàn)主要借四個類:class冷溃、Constructor、Field梦裂、Method似枕。
反射是指在運(yùn)行時能查看一個類的狀態(tài)及特征,并能進(jìn)行動態(tài)管理的功能塞琼。
反射的應(yīng)用場景:在Java程序中許多對象在運(yùn)行時都會出現(xiàn)兩種類型:編譯時類型和運(yùn)行時類型菠净。編譯時的類型由聲明該對象時使用的類型決定,運(yùn)行時的類型由實(shí)際賦給對象的類型決定
如:Person p =new Student();
編譯時類型為Person彪杉,而運(yùn)行時為Student毅往。
除此之外,程序在運(yùn)行時還可能接收到外部傳入的一個對象派近,該對象的編譯時類型為Object攀唯,但程序又需要調(diào)用該對象運(yùn)行時類型的方法。為了這些問題程序需要在運(yùn)行時發(fā)現(xiàn)對象和類的真實(shí)信息渴丸。然而侯嘀,如果編譯時根本無法預(yù)知該對象和類可能屬于哪些類,程序只依靠運(yùn)行時信息來發(fā)現(xiàn)該對象和類的真實(shí)信息谱轨,此時就必須使用反射戒幔。
7.1 java的類裝載系統(tǒng)與反射
其實(shí)也是一個java類加載和對象初始化過程。
java虛擬機(jī)中有兩種類裝載器:啟動類裝載器和自定義類裝載器土童。前者是jvm的一部分诗茎,后者是java程序的一部分,不同的裝載器放在不同的命名空間中献汗。
反射是以免鏡子敢订,能夠在鏡子中看到這個類中“所有”的東西。
有三種方法可以在程序中獲得class:
- 使用Class中的forname()靜態(tài)方法獲得class對象罢吃。
- 得到該類的一個對象使用(Object九大方法之一)getClass獲得楚午。
- 運(yùn)行時已經(jīng)知道類名,使用類名.class獲得尿招。
而反射在JVM中的實(shí)現(xiàn)如下: - 一矾柜、Class.forName的實(shí)現(xiàn):在JDK中阱驾,可以發(fā)現(xiàn)最終調(diào)用的是native方法forName0(),它在C中調(diào)用的實(shí)際是findClassFromClassLoader()怪蔑,原理與ClassLoader的流程(加載啊易、連接)一樣。
- 二饮睬、getDeclaredFields0的實(shí)現(xiàn):在JDK源碼中,可以知道class.getDeclaredFields()方法實(shí)際調(diào)用的是native方法getDeclaredFields0()篮奄,它主要實(shí)現(xiàn)步驟如下:
1.根據(jù)Class結(jié)構(gòu)體信息捆愁,獲取field_count與fields[]字段,這個字段早已在load過程中被放入了
2.根據(jù)field_count的大小分配內(nèi)存窟却、創(chuàng)建數(shù)組昼丑。
3.將數(shù)組進(jìn)行forEach循環(huán),通過fields[]中的信息依次創(chuàng)建對象夸赫。
4.返回數(shù)組指針菩帝。 - 三、Method.invoke的實(shí)現(xiàn):
1.創(chuàng)建Frame
2.如果對象flag為native茬腿,交給native_handler進(jìn)行處理
3.在frame中執(zhí)行java代碼
4.彈出Frame
5.返回執(zhí)行結(jié)果的指針 - 四呼奢、class.newInstance的實(shí)現(xiàn):
1.檢測權(quán)限、預(yù)分配空間大小等參數(shù)
2.創(chuàng)建Object對象切平,并malloc分配空間
3.通過Method.invoke調(diào)用構(gòu)造函數(shù)(<init>())
4.返回Object指針
(tips:java類加載將將.class中的二進(jìn)制流文件轉(zhuǎn)化為方法區(qū)(內(nèi)存)中的Class對象)
7.2 JavaRTTI與反射
RTTI(Run-Time Type Identification握础,通過運(yùn)行時類型識別)的含義就是在運(yùn)行時識別一個對象的類型,其對應(yīng)的類是Class對象悴品,每個java里面的類都對應(yīng)一個Class對象(在編寫并且編譯后)禀综,這個對象被保存在這個類的同名class文件里。
類加載器在類被第一次靜態(tài)調(diào)用(見java類加載)時會把那個對應(yīng)的Class對象加載到內(nèi)存中苔严。
根據(jù)上文可以知道定枷,獲取Class獨(dú)享有三種方法。通過Class對象用戶可以在運(yùn)行時動態(tài)得到大量關(guān)于這個類的信息届氢,包括接口欠窒,父類,方法悼沈,靜態(tài)成員贱迟,甚至是像newInstance()方法這樣的一個實(shí)現(xiàn)“虛擬構(gòu)造器”的一種方式。所謂的虛擬構(gòu)造器絮供,就是聲明“我不知道你的確切類型衣吠,至少在編譯期不知道,但是我就是要正確的創(chuàng)建你的一個對象”壤靶。
RTTI的核心:Class對象缚俏、instanceof關(guān)鍵字、強(qiáng)制類型裝換。
RTTI的限制忧换?顯然它在編譯時必須知道一個非常重要的東西:類名(全類名)
Java中有時候在編譯器為程序生成代碼很久之后才會出現(xiàn)要處理的那個類恬惯,那么這個時候怎么才能處理這個類呢,即在編譯的時候根本無法獲知這個對象所屬的類亚茬。答案就是利用Java的反射機(jī)制酪耳。Java的反射與RTTI的區(qū)別就在于編譯時不需要知道任何事情,匿名對象的信息在運(yùn)行時確定下來就可以刹缝。
8.Java是如何處理整型的溢出和下溢的碗暗?
Java更具類型的大小,將計算結(jié)果中的對應(yīng)低階字節(jié)存儲到對應(yīng)的值里梢夯。