- JDK和JRE區(qū)別
JDK:Java Development Kit, Java開發(fā)工具包,包含開發(fā)環(huán)境和運(yùn)行環(huán)境请毛。
JRE:Java Runtime Environment车胡,Java運(yùn)行環(huán)境。
簡(jiǎn)而言之:JDK包含了JRE隙姿,還包含編譯源碼的編譯器javac。
如果你需要運(yùn)行 java 程序唉擂,只需安裝 JRE 就可以了餐屎,如果你需要編寫 java 程序,需要安裝 JDK玩祟。
- == 和 equals 的區(qū)別是什么腹缩?
對(duì)于==的比較,分基本類型和引用類型:
- 基本類型:在比較值空扎;
- 引用類型:比較的引用
對(duì)于equals比較藏鹊,一直是比較值
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
代碼解讀:因?yàn)?x 和 y 指向的是同一個(gè)引用,所以 == 也是 true勺卢,而 new String()方法則重寫開辟了內(nèi)存空間伙判,所以 == 結(jié)果為 false,而 equals 比較的一直是值黑忱,所以結(jié)果都為 true宴抚。
關(guān)于equals
equals 本質(zhì)上就是 ==,只不過(guò) String 和 Integer 等重寫了 equals 方法甫煞,把它變成了值比較菇曲。
先看兩個(gè)自定義類,這倆類沒(méi)有改寫equals方法抚吠,所以此時(shí)equals就是==常潮,比較的引用:
class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false
看equals源碼:
public boolean equals(Object obj) {
return (this == obj);
}
那么兩個(gè)String 對(duì)象為何比較的值:
String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true
我們看String 的equals方法源碼:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
1.先判斷是否引用一樣;
2.是否為String類型
3.用數(shù)組依次比較值
總結(jié) :== 對(duì)于基本類型來(lái)說(shuō)是值比較楷力,對(duì)于引用類型來(lái)說(shuō)是比較的是引用喊式;而 equals 默認(rèn)情況下是引用比較,只是很多類重新了 equals 方法萧朝,比如 String岔留、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等检柬。
兩個(gè)對(duì)象的 hashCode()相同献联,則 equals()也一定為 true,對(duì)嗎何址?
不對(duì)里逆,兩個(gè)對(duì)象的 hashCode()相同,equals()不一定 true用爪。
hashCode()說(shuō)到底就是返回一個(gè)int值原押,有可能會(huì)哈希沖突的。final 在 java 中有什么作用项钮?
- 修飾類:不能繼承
- 修飾方法:不能重寫
- 修飾變量:就是常量班眯,必須初始化希停,不能修改
java 中的 Math.round(-1.5) 等于多少烁巫?
等于 -1署隘,因?yàn)樵跀?shù)軸上取值時(shí),中間值(0.5)向右取整亚隙,所以正 0.5 是往上取整磁餐,負(fù) 0.5 是直接舍棄。String 屬于基礎(chǔ)的數(shù)據(jù)類型嗎阿弃?
String 不屬于基礎(chǔ)類型诊霹,基礎(chǔ)類型有 8 種:byte、boolean渣淳、char脾还、short、int入愧、float鄙漏、long、double棺蛛,而 String 屬于對(duì)象怔蚌。-
java 中操作字符串都有哪些類?它們之間有什么區(qū)別旁赊?
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术徊。
截屏2020-06-21下午3.39.36.png
StringBuffer 和 StringBuilder 最大的區(qū)別在于本刽,StringBuffer 是線程安全的,而 StringBuilder 是非線程安全的赠涮,但 StringBuilder 的性能卻高于 StringBuffer子寓,所以在單線程環(huán)境下推薦使用 StringBuilder,多線程環(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)存中。
String x = "張三";
String y = "張三";
String z = new String("張三");
System.out.println(x == y); // true
System.out.println(x == z); // false
為什么會(huì)輸出上邊的結(jié)果呢洛史,String x = "張三" 的方式惯殊,Java 虛擬機(jī)會(huì)將其分配到常量池中,而常量池中沒(méi)有重復(fù)的元素也殖,比如當(dāng)執(zhí)行“張三”時(shí)土思,java虛擬機(jī)會(huì)先在常量池中檢索是否已經(jīng)有“張三”,如果有那么就將“張三”的地址賦給變量,如果沒(méi)有就創(chuàng)建一個(gè)忆嗜,然后在賦給變量己儒;而 String z = new String(“張三”) 則會(huì)被分到堆內(nèi)存中,即使內(nèi)容一樣還是會(huì)創(chuàng)建新的對(duì)象捆毫。
- 如何將字符串反轉(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 類的常用方法都有那些绩卤?
indexOf():返回指定字符的索引途样。charAt():返回指定索引處的字符。
replace():字符串替換省艳。
trim():去除字符串兩端空白娘纷。
split():分割字符串,返回一個(gè)分割后的字符串?dāng)?shù)組跋炕。
getBytes():返回字符串的 byte 類型數(shù)組赖晶。
length():返回字符串長(zhǎng)度。
toLowerCase():將字符串轉(zhuǎn)成小寫字母辐烂。
toUpperCase():將字符串轉(zhuǎn)成大寫字符遏插。
substring():截取字符串。
equals():字符串比較纠修。
抽象類必須要有抽象方法嗎胳嘲?
不需要,抽象類不一定非要有抽象方法扣草。
abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
普通類和抽象類有哪些區(qū)別了牛?
抽象方法:普通類沒(méi),抽象類可以有
實(shí)例化:抽象類不能直接實(shí)例化抽象類能使用 final 修飾嗎辰妙?
不能鹰祸,定義抽象類就是讓其他類繼承的,如果定義為 final 該類就不能被繼承密浑,這樣彼此就會(huì)產(chǎn)生矛盾蛙婴,所以 final 不能修飾抽象類,如下圖所示尔破,編輯器也會(huì)提示錯(cuò)誤信息.接口和抽象類有什么區(qū)別街图?
實(shí)現(xiàn):接口用implement實(shí)現(xiàn)浇衬;抽象類用extends;
構(gòu)造函數(shù):接口不能有餐济;抽象類可以有
main方法:接口不能有耘擂;抽象類可以有
實(shí)現(xiàn)數(shù)量:類可以實(shí)現(xiàn)多個(gè)接口;只能繼承一個(gè)抽象方法颤介;
訪問(wèn)修飾符:接口默認(rèn)public;抽象類可以是任意訪問(wèn)修飾符梳星。java 中 IO 流分為幾種赞赖?
按功能分:輸入流和輸出流
按類型分:字節(jié)流和字符流
字節(jié)流和字符流的區(qū)別是:
- 字節(jié)流按 8 位傳輸以字節(jié)為單位輸入輸出數(shù)據(jù)滚朵,字符流按 16 位傳輸以字符為單位輸入輸出數(shù)據(jù)。
- 字節(jié)流可用于任何類型的對(duì)象前域,包括二進(jìn)制對(duì)象辕近,而字符流只能處理字符或者字符串; 字節(jié)流提供了處理任何類型的IO操作的功能匿垄,但它不能直接處理Unicode字符移宅,而字符流就可以
- 字節(jié)流在操作的時(shí)候本身是不會(huì)用到緩沖區(qū)(內(nèi)存)的,是與文件本身直接操作的椿疗,而字符流在操作的時(shí)候是使用到緩沖區(qū)的.
字節(jié)流在操作文件時(shí)漏峰,即使不關(guān)閉資源(close方法),文件也能輸出届榄,但是如果字符流不使用close方法的話浅乔,則不會(huì)輸出任何內(nèi)容,說(shuō)明字符流用的是緩沖區(qū)铝条,并且可以使用flush方法強(qiáng)制進(jìn)行刷新緩沖區(qū)靖苇,這時(shí)才能在不close的情況下輸出內(nèi)容
https://blog.csdn.net/rentian1/article/details/78291383
- BIO、NIO班缰、AIO 有什么區(qū)別贤壁?
- BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統(tǒng) IO埠忘,它的特點(diǎn)是模式簡(jiǎn)單使用方便脾拆,并發(fā)處理能力低。
- NIO:New IO 同步非阻塞 IO莹妒,是傳統(tǒng) IO 的升級(jí)名船,客戶端和服務(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():寫入文件踢步。