
JDK 和 JRE 有什么區(qū)別?
JDK:Java Development Kit 的簡(jiǎn)稱(chēng),java 開(kāi)發(fā)工具包,提供了 java 的開(kāi)發(fā)環(huán)境和運(yùn)行環(huán)境。
JRE:Java Runtime Environment 的簡(jiǎn)稱(chēng),java 運(yùn)行環(huán)境,為 java 的運(yùn)行提供了所需環(huán)境。 (推薦學(xué)習(xí):java常見(jiàn)面試題)
具體來(lái)說(shuō) JDK 其實(shí)包含了 JRE,同時(shí)還包含了編譯 java 源碼的編譯器 javac,還包含了很多 java 程序調(diào)試和分析的工具。簡(jiǎn)單來(lái)說(shuō):如果你需要運(yùn)行 java 程序,只需安裝 JRE 就可以了,如果你需要編寫(xiě) java 程序,需要安裝 JDK。
== 和 equals 的區(qū)別是什么?
對(duì)于基本類(lèi)型和引用類(lèi)型 == 的作用效果是不同的,如下所示:
基本類(lèi)型:比較的是值是否相同;
引用類(lèi)型:比較的是引用是否相同;
quals 本質(zhì)上就是 ==,只不過(guò) String 和 Integer 等重寫(xiě)了 equals 方法,把它變成了值比較。
== 對(duì)于基本類(lèi)型來(lái)說(shuō)是值比較,對(duì)于引用類(lèi)型來(lái)說(shuō)是比較的是引用;而 equals 默認(rèn)情況下是引用比較,只是很多類(lèi)重寫(xiě)了 equals 方法,比如 String、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等。
兩個(gè)對(duì)象的 hashCode()相同,則 equals()也一定為 true,對(duì)嗎?
不對(duì),兩個(gè)對(duì)象的 hashCode()相同,equals()不一定 true。
String str1 = "通話(huà)"; String str2 = "重地"; System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode())); System.out.println(str1.equals(str2));
執(zhí)行的結(jié)果:
str1:1179395 | str2:1179395 false
代碼解讀:很顯然“通話(huà)”和“重地”的 hashCode() 相同,然而 equals() 則為 false,因?yàn)樵谏⒘斜碇校琱ashCode()相等即兩個(gè)鍵值對(duì)的哈希值相等,然而哈希值相等,并不一定能得出鍵值對(duì)相等。
final 在 java 中有什么作用?
final 修飾的類(lèi)叫最終類(lèi),該類(lèi)不能被繼承。
final 修飾的方法不能被重寫(xiě)。
final 修飾的變量叫常量,常量必須初始化,初始化之后值就不能被修改。
java 中的 Math.round(-1.5) 等于多少?
等于 -1。
String 屬于基礎(chǔ)的數(shù)據(jù)類(lèi)型嗎?
String 不屬于基礎(chǔ)類(lèi)型,基礎(chǔ)類(lèi)型有 8 種:byte、boolean、char、short、int、float、long、double,而 String 屬于對(duì)象。
java 中操作字符串都有哪些類(lèi)?它們之間有什么區(qū)別?
操作字符串的類(lèi)有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的區(qū)別在于 String 聲明的是不可變的對(duì)象,每次操作都會(huì)生成新的 String 對(duì)象,然后將指針指向新的 String 對(duì)象,而 StringBuffer、StringBuilder 可以在原有對(duì)象的基礎(chǔ)上進(jìn)行操作,所以在經(jīng)常改變字符串內(nèi)容的情況下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的區(qū)別在于,StringBuffer 是線(xiàn)程安全的,而 StringBuilder 是非線(xiàn)程安全的,但 StringBuilder 的性能卻高于 StringBuffer,所以在單線(xiàn)程環(huán)境下推薦使用 StringBuilder,多線(xiàn)程環(huán)境下推薦使用 StringBuffer。
String str="i"與 String str=new String(“i”)一樣嗎?
不一樣,因?yàn)閮?nèi)存的分配方式不一樣。String str="i"的方式,java 虛擬機(jī)會(huì)將其分配到常量池中;而 String str=new String(“i”) 則會(huì)被分到堆內(nèi)存中。
如何將字符串反轉(zhuǎn)?
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。
示例代碼:
// StringBuffer reverse StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("abcdefg"); System.out.println(stringBuffer.reverse()); // gfedcba // StringBuilder reverse StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("abcdefg"); System.out.println(stringBuilder.reverse()); // gfedcba
String 類(lèi)的常用方法都有那些?
indexOf():返回指定字符的索引。 charAt():返回指定索引處的字符。 replace():字符串替換。 trim():去除字符串兩端空白。 split():分割字符串,返回一個(gè)分割后的字符串?dāng)?shù)組。 getBytes():返回字符串的 byte 類(lèi)型數(shù)組。 length():返回字符串長(zhǎng)度。 toLowerCase():將字符串轉(zhuǎn)成小寫(xiě)字母。 toUpperCase():將字符串轉(zhuǎn)成大寫(xiě)字符。 substring():截取字符串。 equals():字符串比較。
抽象類(lèi)必須要有抽象方法嗎?
不需要,抽象類(lèi)不一定非要有抽象方法。
示例代碼:
abstract class Cat { public static void sayHi() { System.out.println("hi~"); } }
上面代碼,抽象類(lèi)并沒(méi)有抽象方法但完全可以正常運(yùn)行。
普通類(lèi)和抽象類(lèi)有哪些區(qū)別?
普通類(lèi)不能包含抽象方法,抽象類(lèi)可以包含抽象方法。
抽象類(lèi)不能直接實(shí)例化,普通類(lèi)可以直接實(shí)例化。
抽象類(lèi)能使用 final 修飾嗎?
不能,定義抽象類(lèi)就是讓其他類(lèi)繼承的,如果定義為 final 該類(lèi)就不能被繼承,這樣彼此就會(huì)產(chǎn)生矛盾,所以 final 不能修飾抽象類(lèi),如下圖所示,編輯器也會(huì)提示錯(cuò)誤信息:

接口和抽象類(lèi)有什么區(qū)別?
實(shí)現(xiàn):抽象類(lèi)的子類(lèi)使用 extends 來(lái)繼承;接口必須使用 implements 來(lái)實(shí)現(xiàn)接口。
構(gòu)造函數(shù):抽象類(lèi)可以有構(gòu)造函數(shù);接口不能有。
main 方法:抽象類(lèi)可以有 main 方法,并且我們能運(yùn)行它;接口不能有 main 方法。
實(shí)現(xiàn)數(shù)量:類(lèi)可以實(shí)現(xiàn)很多個(gè)接口;但是只能繼承一個(gè)抽象類(lèi)。
訪(fǎng)問(wèn)修飾符:接口中的方法默認(rèn)使用 public 修飾;抽象類(lèi)中的方法可以是任意訪(fǎng)問(wèn)修飾符。
java 中 IO 流分為幾種?
按功能來(lái)分:輸入流(input)、輸出流(output)。
按類(lèi)型來(lái)分:字節(jié)流和字符流。
字節(jié)流和字符流的區(qū)別是:字節(jié)流按 8 位傳輸以字節(jié)為單位輸入輸出數(shù)據(jù),字符流按 16 位傳輸以字符為單位輸入輸出數(shù)據(jù)。
BIO、NIO、AIO 有什么區(qū)別?
BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統(tǒng) IO,它的特點(diǎn)是模式簡(jiǎn)單使用方便,并發(fā)處理能力低。
NIO:New IO 同步非阻塞 IO,是傳統(tǒng) IO 的升級(jí),客戶(hù)端和服務(wù)器端通過(guò) Channel(通道)通訊,實(shí)現(xiàn)了多路復(fù)用。
AIO:Asynchronous IO 是 NIO 的升級(jí),也叫 NIO2,實(shí)現(xiàn)了異步非堵塞 IO ,異步 IO 的操作基于事件和回調(diào)機(jī)制。
Files的常用方法都有哪些?
Files.exists():檢測(cè)文件路徑是否存在。 Files.createFile():創(chuàng)建文件。 Files.createDirectory():創(chuàng)建文件夾。 Files.delete():刪除一個(gè)文件或目錄。 Files.copy():復(fù)制文件。 Files.move():移動(dòng)文件。 Files.size():查看文件個(gè)數(shù)。 Files.read():讀取文件。 Files.write():寫(xiě)入文件。
站長(zhǎng)資訊網(wǎng)