JAVA必問面試題

2020-08-13 00:16:26

一.JDK JRE JVM的關係?

1.JDK是java的核心,包括了Java執行環境JRE、JVM和Java工具和Java基礎類庫
2.JRE是執行JAVA的執行時環境,包含JVM和Java核心類庫。
3.JVM是java虛擬機器的縮寫,是整個java實現跨平臺的最核心的部分,能夠執行以Java語言寫作的軟體程式。
在这里插入图片描述

二.JAVA的基本型別有哪些,和參照型別的區別?

1.基本型別的值就是一個數字,一個字元或者一個布爾值.
八大基本型別byte,short,int,long,foiat,double,char,boolean
在这里插入图片描述
2.參照型別:
是一個物件型別,他的值是指向記憶體空間的參照
參照數據 型別如:( 類Class,介面Interface,陣列[] )

三.存取修飾符 public,private,protected,以及不寫(預設)時的區別

1 public : 對所有類可見。使用物件:類、介面、變數、方法
2 private : 在同一類內可見。使用物件:變數、方法。 注意:不能修飾類(外部類)
3 protected : 對同一包內的類和所有子類可見。使用物件:變數、方法。 注意:不能修飾類(外部類)
4 default (即預設,什麼也不寫,不使用任何關鍵字): 在同一包內可見,不使用任何修飾符。使用物件:類、介面、變數、方法。
在这里插入图片描述

四.final finally finalize區別?

  1. final可以修飾類、變數、方法,修飾類表示該類不能被繼承、修飾方法表示該方法不能被重寫、修飾變數表
  2. finally一般作用在try-catch程式碼塊中,在處理異常的時候,通常我們將一定要執行的程式碼方法finally程式碼塊
    中,表示不管是否出現異常,該程式碼塊都會執行,一般用來存放一些關閉資源的程式碼。
  3. finalize是一個方法,屬於Object類的一個方法,而Object類是所有類的父類別,該方法一般由垃圾回收器來呼叫,當我們呼叫System.gc() 方法的時候,由垃圾回收器呼叫finalize(),回收垃圾,一個物件是否可回收的最後判斷。

五.this和super的區別?

  1. this是代表本類物件的參照,super代表父類別的物件參照
  2. this用於區分區域性變數和成員變數,super用於區分本類變數和父類別變數
  3. this和super不能同時出現在同一個構造方法中
  4. this()和super()都指的是物件,所以,均不可以在static環境中使用。包括:static變數,static方法,static語句塊。

六.break ,continue ,return 的區別及作用

  1. break 跳出總上一層回圈,不再執行回圈(結束當前的回圈體)
  2. continue 跳出本次回圈,繼續執行下次回圈(結束正在執行的回圈 進入下一個回圈條件)
  3. return 程式返回,不再執行下面 下麪的程式碼(結束當前的方法 直接返回)

七.JAVA常見的內部排序演算法有哪些?寫出氣泡排序

  1. 排序演算法可以分爲內部排序和外部排序。
    內部排序是數據記錄在記憶體中進行排序。
    外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要存取外存。
    常見的內部排序演算法有:氣泡排序、選擇排序、插入排序、希爾排序、快速排序、歸併排序等。
    在这里插入图片描述
  2. 氣泡排序,是通過每一次遍歷獲取最大/最小值
    將最大值/最小值放在尾部/頭部
    然後除開最大值/最小值,剩下的數據在進行遍歷獲取最大/最小值

3.程式碼如下:

public static void main(String[] args) {
        int arr[] = {8, 5, 3, 2, 4};
        //冒泡
        for (int i = 0; i < arr.length; i++) {
            //外層回圈,遍歷次數
            for (int j = 0; j < arr.length - i - 1; j++) {
                //內層回圈,升序(如果前一個值比後一個值大,則交換)
                //內層回圈一次,獲取一個最大值
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

3.1 排序過程(紅色:移動的數據)
5,3,2,4,8
3,2,4,5,8
2,3,4,5,8
2,3,4,5,8
2,3,4,5,8

  1. 其它排序演算法參考:https://www.cnblogs.com/ll409546297/p/10956960.html

八.抽象類(abstract class) 和介面( interface) 有什麼區別?

  1. 相同點:
    A. 兩者都是抽象類,都不能被範例化他們的子類都實現已宣告的方法
    B.可以將抽象類和介面型別作爲參照型別
    C. 一個類如果繼承了某個抽象類或者實現了某個介面都需要對其中的抽象方法全部進行實現,否則該類仍然需要被宣告爲抽象類

  2. 不同點:
    A. interface實現需要通過implements , 而abstract 需要繼承用extends.
    B. 一個類可以實現多個interface,但一個類只能繼承一個abstract class.
    C. interface強調特定功能的實現,而abstract class強調所屬關係
    D. 儘管interface實現類及abstrct class的子類都必須要實現相應的抽象方法,但實現的形式不同。interface中的每一個方法都是抽象方法,都只是宣告的 (declaration, 沒有方法體),實現類必須要實現。而abstract class的子類可以有選擇地實現
    在这里插入图片描述

九.物件導向的基本特徵,各特徵有什麼優點?

物件導向的三大特徵,封裝,繼承,多型.

  1. 封裝性:private關鍵字修飾
    類的封裝性爲類的成員提供公有、預設、保護和私有等存取許可權,目的是隱藏類中的私有變數和類中方法的實現細節

  2. 繼承:extends關鍵字修飾
    A.java只支援單繼承,可以傳遞(爺爺,兒子,孫子的關係)
    B.相當於子類把父類別的功能複製了一份,不能繼承父類別的私有成員
    C.像是is a 的關係,多用於功能的修改,子類可以擁有父類別的功能的同時,進行功能拓展

3.多型:
指同一個實體同時具有多種形式。它是物件導向程式設計(OOP)的一個重要特徵。主要是指同一個物件,在不同時刻,代表的物件不一樣,指的是物件的多種形態。
多型特點:
A.編譯看左邊,執行看右邊
B. 要有方法的重寫
C. 父類別參照指向子類物件,如:Animal a = new Dog(); – 小到大,向上轉型
D.多型的前提是繼承
E.多型可以讓我們不用關心某個物件到底是什麼具體型別,就可以使用該物件的某些方法。
F.提高了程式的擴充套件性和可維護性

注意:預設情況下面 下麪向物件有 3 大特性,封裝、繼承、多型,如果面試官問讓說出4 大特性,那麼我們就把抽象加上去。

十.什麼是String?他和StringBuilder/StringBuffer有什麼區別?

一. String

  1. 是一個封裝char[]陣列的物件.
  2. String是參照型別,底層是被final修飾的字元陣列.是不可變的字元,每拼接一次就會產生一個新的物件,而由於垃圾回收機制 機製的原理,原有的物件不會立馬被回收,這是對記憶體極大的消耗
  3. 利用 String 類,在做字串拼接的過程效率極其低下
  4. 建立String物件:
    在这里插入图片描述
    二.StringBuilder/StringBuffer
  5. StringBuilder(執行緒不安全)和StringBuffer(執行緒安全)底層是可變的字元陣列
  6. StringBuilder和StringBuffer 是可變長度的,可以利用append方法向原有物件拼接,然後用toString方法將其轉化爲String型別;這兩個相比起來StringBuilder的效率更高,因爲他是非執行緒安全的,不需要花費資源去維護同步鎖。
  7. 使用場景
    (1).如果要操作少量的數據使用String。
    (2).單執行緒操作字串緩衝區下操作大量數據使用StringBuilder。
    (3).多執行緒操作字串緩衝區下操作大量數據使用StringBuffer。
    (4)StringBuilder一般使用在方法內部來完成類似"+"功能,因爲是執行緒不安全的,所以用完以後可以丟棄。StringBuffer主要用在全域性變數中
    (5) 在執行效率上,StringBuilder > StringBuffer > String
    (6)原始碼體現:本質上都是在呼叫父類別抽象類AbstractStringBuilder來幹活,只不過Buffer把程式碼加了同步關鍵字,使得程式可以保證執行緒安全問題。