Java基礎(chǔ)一

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è), 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容