1. JDK 和 JRE 有什么區(qū)別?
- JDK:Java Development Kit 的簡稱,java 開發(fā)工具包,提供了 java 的開發(fā)環(huán)境和運(yùn)行環(huán)境。
- JRE:Java Runtime Environment 的簡稱,java 運(yùn)行環(huán)境,為 java 的運(yùn)行提供了所需環(huán)境。
注: JDK包含了JRE, 還包含編譯器javac, 還包含了很多java程序調(diào)試和分析工具.
2.== 和 equals 的區(qū)別是什么?
- 1.==對于基本類型來說是值比較; 對于引用類型來說比較的是對象引用地址.
- 2.equals默認(rèn)用于引用類型, 一般默認(rèn)用來比較對象引用地址. 重寫Object類equals方法, 則可以用于值比較, 例如:String類 和 Integer類, equals比較就是值是否相等.
3.Java基本數(shù)據(jù)類型以及其包裝類
java有8種基本數(shù)據(jù)類型 布爾類型 boolean Boolean

基本數(shù)據(jù)類型.png
- 1.java默認(rèn)整型是int, 整型(byte、short、int、long)
- 2.浮點(diǎn)型數(shù)據(jù)在不聲明的情況下默認(rèn)double型,如果要表示一個(gè)數(shù)據(jù)時(shí)float 型的,可以在數(shù)據(jù)后面加上 "F" 。
- 3.Java是面向?qū)ο笳Z言,其概念為一切皆為對象. 對象引用一般存放在棧中, 對象值一般存放在堆中. 但是基本類型它本質(zhì)上是數(shù)值, 一般存放在棧中.
- 4.在數(shù)據(jù)做為參數(shù)傳遞的時(shí)候,基本數(shù)據(jù)類型是值傳遞,而引用數(shù)據(jù)類型是引用傳遞(地址傳遞).
裝箱就是 自動(dòng)將基本數(shù)據(jù)類型轉(zhuǎn)換為包裝器類型;拆箱就是 自動(dòng)將包裝器類型轉(zhuǎn)換為基本數(shù)據(jù)類型。
Integer i1 = 127;
Integer i2 = 127;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2); //true
System.out.println(i3==i4); //false
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
而裝箱調(diào)用的是Integer.valueOf(int i)方法,即當(dāng)int值為-128~127之間時(shí),自動(dòng)裝箱時(shí),是不創(chuàng)建對象的,直接從緩存中獲取
所以i1和i2是同一個(gè)對象
Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;
System.out.println(i1==i2); // false
System.out.println(i3==i4); // false
Double類的valueOf方法會(huì)采用與Integer類的valueOf方法不同的實(shí)現(xiàn)。
注意,Integer、Short、Byte、Character、Long這幾個(gè)類的valueOf方法的實(shí)現(xiàn)是類似的。
Double、Float的valueOf方法的實(shí)現(xiàn)是類似的。
4.兩個(gè)對象的 hashCode()相同,則 equals()也一定為 true,對嗎?
不一定, 對于字符串長度為2, 對比其hashCode()就知道, 很容易找出2個(gè)相同hashCode字符串
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value; // value是 char[] val, 數(shù)組
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i]; // 長度為2字符串 h=31*s[0] + s[1]
}
hash = h;
}
return h;
}
-----------
String str1 = "通話"; //三個(gè)
String str2 = "重地"; //上下
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
5. final 在 java 中有什么作用?
- final修飾的類叫最終類, 該類不能被繼承.
- final修飾的方法不能被重寫.
- final修飾的變量叫常量, 其常量引用不可修改, 常量也必須初始化.
final、finally、finalize 有什么區(qū)別
- final上面說明了
- finally一般作用在try-catch代碼塊中, 在異常處理的時(shí)候, finally中的代碼一定會(huì)執(zhí)行, 一般用來存放一些關(guān)閉資源的代碼。
5 try
6 //要檢查的程序語句
7 {
8 int a[] = new int[5];
9 a[0] = 3;
10 a[1] = 1;
11 //a[1] = 0;//除數(shù)為0異常
12 //a[10] = 7;//數(shù)組下標(biāo)越界異常
13 int result = a[0]/a[1];
14 System.out.println(result);
15 }
16 catch(ArrayIndexOutOfBoundsException ex)
17 //異常發(fā)生時(shí)的處理語句
18 {
19 System.out.println("數(shù)組越界異常");
20 ex.printStackTrace();//顯示異常的堆棧跟蹤信息
21 }
22 catch(ArithmeticException ex)
23 {
24 System.out.println("算術(shù)運(yùn)算異常");
25 ex.printStackTrace();
26 }
27 finally
28 //這個(gè)代碼塊一定會(huì)被執(zhí)行
29 {
30 System.out.println("finally語句不論是否有異常都會(huì)被執(zhí)行。");
31 }
finally中的return 會(huì)覆蓋 try 或者catch中的返回值。
finally中的return或異常會(huì)抑制(消滅)前面try或者catch塊中的異常。
- finalize是一個(gè)方法,屬于Object類的一個(gè)方法,而Object類是所有類的父類,該方法由垃圾回收器調(diào)用finalize(),回收垃圾.
6.方法的重載 和 方法的重寫
- 方法重載: 發(fā)生在同一個(gè)類中,方法名必須相同,參數(shù)列表有一個(gè)不同即可(參數(shù)個(gè)數(shù), 類型, 順序), 方法返回值 和訪問修飾符都可以不同.
- 方法重寫: 發(fā)生在子類中, 子類重寫父類的方法, 必須保持方法名、參數(shù)列表必須相同, 返回值范圍小于等于父類, 拋出的異常范圍小于等于父類,訪問修飾符范圍大于等于父類。子類不能重寫父類的private方法.
7.String知識(shí): StringBuffer 和 StringBuilder 的區(qū)別是什么?
String對象每次改變的時(shí)候, 都會(huì)生成一個(gè)新的String對象, 然后指針指向新的String對象
1.性能:
StringBuffer每次對對象操作時(shí), 不會(huì)生成新的對象并改變對象引用. 相同情況下StringBuilder
比StringBuffer 性能提升10%.
2.線程安全
StringBuffer是線程安全的; StringBuilder 是線程不安全的;
3.數(shù)據(jù)可變和不可變
String的值不可變; StringBuffer和StringBuilder的值是可變的
8.String的不可變性.
String是一個(gè)final類,不可被繼承所以其字符序列不可變,
String對象的字符內(nèi)容是存儲(chǔ)在一個(gè)字符數(shù)組value[]中的,創(chuàng)建之后不能更改
String s1="abc"; 字符串常量存儲(chǔ)在字符串常量池里,目的是共享,并且字符串常量池中是不會(huì)存儲(chǔ)相同內(nèi)容的字符串的。
即s1,s2在棧中為一項(xiàng),二者常量池指的是同一常量
String s2="abc";
String是不可變類型的,對它進(jìn)行修改都需要重新造新的引用對象(開辟內(nèi)存空間)
String s3=new String("abc");字符串對象存儲(chǔ)在堆中,s3保存的地址值,是數(shù)據(jù)在堆空間中開辟以后對應(yīng)的地址值
方法區(qū):用于存放已被虛擬機(jī)加載的類信息,常量(常量池),靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。
棧:即虛擬機(jī)棧,用于存儲(chǔ)局部變量等。局部變量存放了編譯期可知長度的各種基本數(shù)據(jù)類型; 對象引用(不等同于對象本身,是對象在堆內(nèi)的首地址)方法執(zhí)行完自動(dòng)釋放
堆:此內(nèi)存區(qū)域的唯一目的就是存放對象實(shí)例,幾乎所有的對象實(shí)例都在這里分配內(nèi)存。
- String設(shè)置不可變的好處
1.字符串常量池中是不會(huì)存儲(chǔ)相同內(nèi)容的字符串
2.可以確保線程安全
9.String str="i"與 String str=new String("i")一樣嗎?
不一樣, 內(nèi)存的分配方式不一樣; 第一種是存儲(chǔ)在字符串常量池中, 屬于字符串常量;
第二種存儲(chǔ)在堆內(nèi)存中, 屬于字符串變量;
10.字符串常用方法
indexOf():返回指定字符的索引。
charAt():返回指定索引處的字符。
replace():字符串替換。
trim():去除字符串兩端空白。
split():分割字符串,返回一個(gè)分割后的字符串?dāng)?shù)組。
getBytes():返回字符串的 byte 類型數(shù)組。
length():返回字符串長度。
toLowerCase():將字符串轉(zhuǎn)成小寫字母。
toUpperCase():將字符串轉(zhuǎn)成大寫字符。
substring():截取字符串。
equals():字符串比較。
11.基本類型和引用類型?他們的區(qū)別
1.創(chuàng)建過程的不同, 基礎(chǔ)類型直接創(chuàng)建直接在棧上分配存儲(chǔ)空間,將數(shù)值存儲(chǔ)在棧上.
引用類型創(chuàng)建:
Person p1 = new Person(8, 8, 2000);
1).首先在棧內(nèi)存為對象引用p1分配空間;
2).然后在堆內(nèi)存中為Person()對象分配空間, 并為屬性設(shè)置初始值0, 0, 0;
3).調(diào)用相應(yīng)構(gòu)造方法, 為相應(yīng)屬性賦值8, 8, 2000;(注意這時(shí)候?qū)ο笠胮1和對象Person之間還沒有建立聯(lián)系)
4).將Person對象在堆中的地址, 賦值給棧中對象引用p1; 通過p1的地址可以找到堆中對象的具體信息.
2.參數(shù)傳遞不同, 基本類型是值傳遞, 而引用數(shù)據(jù)類型是地址傳遞;
12.面向?qū)ο缶幊倘筇匦? 封裝 繼承 多態(tài)
封裝:
把描述對象的屬性和行為的代碼封裝到一個(gè)類中, 屬性用變量定義, 行為用方法定義,這一過程就叫封裝.
繼承
子類繼承父類的特征和行為. 子類可以繼承父類非私有的方法,屬性. 子類也可以對父類進(jìn)行拓展,
可以重寫父類的方法. 缺點(diǎn)提高代碼的耦合性.
多態(tài)
運(yùn)行時(shí)多態(tài)和編譯時(shí)多態(tài)
多態(tài)前提: 1.要有繼承或者實(shí)現(xiàn)關(guān)系 2.要有覆蓋
具體參考:https://blog.csdn.net/doncoder/article/details/83243906
13.普通類和抽象類有哪些區(qū)別?
普通類不能包含抽象方法,抽象類可以包含抽象方法。
抽象類不能直接實(shí)例化,普通類可以直接實(shí)例化。
14.接口和抽象類的區(qū)別
1.實(shí)現(xiàn):抽象類的子類使用 extends 來繼承;接口必須使用 implements 來實(shí)現(xiàn)接口
2.接口的方法默認(rèn)是 public,接口中一般不能有方法實(shí)現(xiàn),而抽象類可以有非抽象的方法。
3.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能實(shí)現(xiàn)一個(gè)抽象類。接口自己本身可以通過extends關(guān)鍵字?jǐn)U展多個(gè)接口。
4.從設(shè)計(jì)層面來說,抽象是對類的抽象,是一種模板設(shè)計(jì),而接口是對行為的抽象,是一種行為的規(guī)范。
5.構(gòu)造函數(shù):抽象類可以有構(gòu)造函數(shù);接口不能有
15.抽象類能使用 final 修飾嗎?
不能,定義抽象類就是讓其他類繼承的,如果定義為 final 該類就不能被繼承,
這樣彼此就會(huì)產(chǎn)生矛盾,所以 final 不能修飾抽象類
16.Object類有哪些常用的方法?
equals 方法,getclass方法,hashCode 方法,toString 方法,wait 和 notify 系列的幾個(gè),