基礎(chǔ)
- 談?wù)勀銓?duì)Java的理解
- 平臺(tái)無(wú)關(guān)性
- GC
- 語(yǔ)言特性
- 面向?qū)ο?/li>
- 類(lèi)庫(kù)
- 異常處理
- 談?wù)勀銓?duì)一次編譯,到處運(yùn)行這句話(huà)的理解?
- 在Java中,我們使用Javac命令對(duì)程序進(jìn)行編譯,他會(huì)生成一個(gè).class文件,我們可以直接在不同的操作系統(tǒng)上運(yùn)行這個(gè).class文件,因?yàn)槊恳粋€(gè)操作系統(tǒng)有不同的JVM,Java語(yǔ)言在不同系統(tǒng)運(yùn)行時(shí)不需要進(jìn)行編譯,Java虛擬機(jī)在執(zhí)行字節(jié)碼的時(shí)候,把字節(jié)碼轉(zhuǎn)換從具體平臺(tái)上的機(jī)器指令.
數(shù)據(jù)類(lèi)型
- Java的基本數(shù)據(jù)類(lèi)型
- 基本數(shù)據(jù)類(lèi)型有:byte/8位,char/16位,short/16位,int/32位,float/32位,long/64位,double/64位
- 什么是自動(dòng)裝箱,自動(dòng)拆箱
- 每一個(gè)基本數(shù)據(jù)類(lèi)型都有一個(gè)對(duì)象的包裝類(lèi),基本類(lèi)型和包裝類(lèi)型之間的賦值使用自動(dòng)裝箱與拆箱完成.int的包裝類(lèi)是Integer,比如說(shuō)
Integer a = 3;
自動(dòng)裝箱,調(diào)用了Integer.valueOf(2);
new Integer(123)
和Integer.valueof(123)
的區(qū)別在哪里?
-
new Integer(123)
每次都會(huì)新建一個(gè)對(duì)象; -
Integer.valueof(123)
會(huì)使用IntegerCache里面的對(duì)象,多次調(diào)用取得同一個(gè)對(duì)象的引用 - Integer緩存池的大小是-128 ~ 127;
String
- 講講String類(lèi)為什么不可變?為什么這樣設(shè)計(jì)?
- String被聲明為final,因此它不可被繼承.
- String內(nèi)部使用char類(lèi)型的數(shù)組存儲(chǔ)數(shù)據(jù),并且char數(shù)組用final修飾,數(shù)組不可變,保證String不可變
- String類(lèi)不可變,線(xiàn)程安全;
- 保證HashCode哈希值的不可變性
- String類(lèi)不可變.每次都要在堆里面創(chuàng)建一個(gè)對(duì)象,性能價(jià)差
- String,StringBuffer,StringBuilder區(qū)別?
- String是一個(gè)不可變類(lèi),一旦一個(gè)String對(duì)象被創(chuàng)建之后,包含在這個(gè)對(duì)象中的字符串是不可修改,直到銷(xiāo)毀.
- StringBuffer對(duì)象表示一個(gè)字符序列可變的字符串,可以通過(guò)提供的,append().insert(),reverse()等方法改變這個(gè)字符串,一旦獲得了自己想要的字符串,可以通過(guò)toString()方法將他轉(zhuǎn)變成一個(gè)String對(duì)象.
- StringBuilder和StringBuffer類(lèi)似,只不過(guò),StringBuilder線(xiàn)程不安全,StringBuffer線(xiàn)程安全.但是StringBuilder效率高.
- String str = "i" 和 String str = new String("i")一樣嗎?
- 不一樣,內(nèi)存分配方式不一樣,前者Java虛擬機(jī)會(huì)將其分配到常量池中,而后者會(huì)被分配到堆內(nèi)存中,堆用來(lái)存放對(duì)象.
- 請(qǐng)你講講&和&&的區(qū)別?
- & 和 && 都能作為邏輯與操作,但是 && 具有短路功能,當(dāng)左邊的條件表達(dá)式返回false則無(wú)需繼續(xù)執(zhí)行右邊表達(dá)式,而 & 都需要進(jìn)行.
- & 還能作為與運(yùn)算符
- 你還知道哪些運(yùn)算符?
-
~
按位非,單目運(yùn)算符,將操作數(shù)的每個(gè)位全部取反 -
^
按位異或,兩位相同返回0,不相同返回1 -
<<
左移運(yùn)算符 -
>>
右移運(yùn)算符 -
>>>
無(wú)符號(hào)右移運(yùn)算符
- ==和equals的區(qū)別?
- ==: 如果比較的是基本數(shù)據(jù)類(lèi)型,則比較的是數(shù)值是否相等,如果比較的是引用類(lèi)型,比較的是他們的對(duì)象的地址是否相等.
- equals:用來(lái)比較兩個(gè)對(duì)象的內(nèi)容是否相等,equals不能用來(lái)比較基本數(shù)據(jù)類(lèi)型,如果沒(méi)有重寫(xiě)equals,判斷兩個(gè)對(duì)象的內(nèi)存地址是否相等
- 為什么重寫(xiě)equals還要重寫(xiě)hashcode?
- equals():判斷兩個(gè)對(duì)象的內(nèi)存地址是否相等
- hashcode(): 根據(jù)兩個(gè)對(duì)象的內(nèi)存地址生成的hash碼是否相等
- 當(dāng)你HashMap里面key存儲(chǔ)的是引用類(lèi)型的數(shù)據(jù)的時(shí)候,HashMap中put時(shí)候會(huì)判斷key是否有重復(fù),先求出key的hashcode(),若相等在比較equals(),若相等,則認(rèn)為他們是相同的,不能兩個(gè)都put進(jìn)去;
- 如果你只重寫(xiě)了equals()方法,那么會(huì)出現(xiàn),表面兩個(gè)對(duì)象的地址相等,但還是能夠put進(jìn)去,因?yàn)楸举|(zhì)上他們的hashcode()還是不同的.
- 重寫(xiě)hashcode()是為了同一個(gè)key,能夠得到相同的hashcode值,這樣Hashmap能夠定位到我們指定的key上;重寫(xiě)equals()是為了向Hashmap表明當(dāng)前對(duì)象的key上保存的對(duì)象是相等的,這樣我們才真正獲得了這個(gè)key所對(duì)應(yīng)的鍵值對(duì).
關(guān)鍵字
- 講講Java里面的final關(guān)鍵字
- final可以用來(lái)修飾基本類(lèi)型變量,表明變量不可變;也可以修飾引用類(lèi)型變量,表示引用的地址不會(huì)改變.
- final可以用來(lái)修飾方法:表明方法不能被重寫(xiě)
- final可以用來(lái)修飾類(lèi):表明方法不能被繼承
- 講講static關(guān)鍵字
- static可以用來(lái)修飾變量,說(shuō)明這是一個(gè)靜態(tài)變量,或者類(lèi)變量,可以直接使用類(lèi)名來(lái)訪(fǎng)問(wèn)
- static可以用來(lái)修飾方法,說(shuō)明這是一個(gè)靜態(tài)方法,說(shuō)明他在類(lèi)加載的過(guò)程中就存在了,它不依賴(lài)任何實(shí)例,可以通過(guò)類(lèi)名訪(fǎng)問(wèn).
- 靜態(tài)語(yǔ)句塊在類(lèi)初始化時(shí)只運(yùn)行一次