Java基礎(面試複習整理)

基礎知識和語法

Java語言初識

  • 電腦語言發展

    • 機器語言、彙編、C、C++、Java
  • Java的誕生與發展

    • 1995

      • JavaSE

      • JavaME

        • Android
      • JavaEE

    • 2006(大數據)

      • Hadoop

      • Spark

        • 流式計算
      • Scala

  • JDK

    • 開發工具包

      • 配置環境變數

        • JAVA_HOME

          • D:\JDK8_211
        • path

          • ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
        • CLASSPATH

          • .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
        • 驗證安裝DOS

          • java -version
  • JRE

    • Java程式運行環境
    • 包含JVM,Java程式運行
  • 跨平台原理

    • 在JVM上運行,無視作業系統

HelloWorld

  • javac Hello.java

    • 生成class文件
  • java Hello

    • 運行編譯好的class文件
  • 編譯型和解釋型語言

    • Java是半編譯半解釋型語言
  • IDEA

    • 主流開發工具

注釋

  • 行內

    • //
  • 多行

    • /* */
  • 文檔

    • /** */

      • javadoc 命令 生成幫助文檔

標識符

  • 關鍵字

  • 語法規則

    • 大小寫敏感

    • 類名首字母大寫

    • 方法名小寫

    • 源文件名與類名必須相同,後綴名為.java

    • 一個源文件只能有一個public類,可以有多個其他類(內部類、匿名類)

    • 所有程式由主方法入口開始執行

      • public static void main(String[] args)
    • 標識符

      • 以字母、美元符、下劃線開頭,不能用數字開頭
      • 關鍵字不能做標識符

數據類型

  • 基本數據類型

    • 整型

      • byte

        • Byte
        • 8位,1位元組
        • -128(-2^7) ~ 127(2^7-1)
      • short

        • Short
        • 16位,2位元組
        • -32768(-2^15) ~ 32767(2^15-1)
      • int

        • Integer
        • 32位,4位元組
        • -2^31 ~ 2^31-1
        • 整型變數默認為int型
      • long

        • Long
        • 64位,8位元組
        • -2^63 ~ 2^63
        • 默認值:0L
    • 浮點型

      • float

        • Float
        • 32位,4位元組
        • 默認值:0.0f
      • double

        • Double
        • 64位,8位元組
      • 浮點數

        • 金融計算

          • BigDecimal
    • 字元型

      • char(Unicode字元)

        • Character
        • 16位,2位元組
        • 單引號,『A』
      • 字元編碼

        • ASCII

        • UTF-8

        • Unicode

        • ‘\u0000’(轉義)

          • \b

            • 退格
          • \n

            • 換行
          • \r

            • 回車
          • \t

            • 製表
          • \

    • 布爾型

      • boolean

        • Boolean
        • 1位元組
        • true/false
        • 默認值:false
  • 引用數據類型

    • 數組

      • int[] a = {1,2,3,4};
    • 類(對象)

      • class Hero;

      • 棧指向堆

        • 棧存放對象引用的地址
        • 堆存放對象的資訊,棧存放該對象的地址,所以棧指向堆
    • 介面

      • interface Hero;
    • 默認值:null

  • == 和 equals

    • ==

      • 基本類型:比較的是值是否相同
      • 引用類型:比較的是引用是否相同
    • equals

      • equals 本質上就是 ==,但重寫了String和Integer,把引用比較改成了值比較
  • 數據類型轉換

    • 自動類型轉換

      • 轉換原則:從低精度向高精度轉換byte->(short、char)->int->long->float->double
      • 表數範圍小的自動轉換為表數範圍大的
      • 運算有多種數據類型結果自動轉換為最大的數據類型
      • 字元串與任何數據類型相連都會轉換為字元串類型
      • 兩個char型運算時,自動轉換為int型;
        當char與別的類型運算時,也會先自動轉換為int型的,再做其它類型的自動轉換
      • byte和short不能和char相互轉換,char值範圍為0~65535,byte和short都包含負數
    • 強制類型轉換

      • 表數大的轉表數小的需要強制轉換

      • 運算符為(),括弧里寫小的數據類型

        • byte b = (byte)12
  • 裝箱和拆箱

    • 裝箱:int->Integer
    • 拆箱:Integer->int
  • Java包裝類的快取

    • 具體的實現方式為在類中預先創建頻繁使用的包裝類對象,當需要使用某個包裝類的對象
      時,如果該對象封裝的值在快取的範圍內,就返回快取的對象,否則創建新的對象並返回

    • 哪些包裝類沒有快取

      • float、double

常量

  • 定義

    • final修飾常量

    • 一般大寫命名

      • final String DEMO = “HELLO”;
  • final

    • 只允許初始化一次

    • 一般與static一起使用

      • 靜態不可變

變數

  • 定義

    • int a = 2;
  • 作用域

    • 類變數

      • 靜態變數
      • 必須聲明為static類型
      • 局部變數不能被聲明為類變數
    • 實例(成員)變數

      • 非靜態變數
      • 類之中,方法外,可全局使用
    • 局部變數

      • 方法內,僅限於方法內使用

命名規範

  • 1、見名知意
  • 2、駝峰命名(變數和方法)
  • 3、類,首字母大寫,駝峰命名
  • 4、常量,大寫+下劃線
  • 5、不要使用拼音命令

運算符

  • 算術運算符

    • +、-、*、/、%、++、–
  • 賦值運算符

    • =
  • 關係運算符

    • ‘>’、<、>=、<=
  • 邏輯運算符

    • &&、||、!
  • 位運算符

    • &、|、^、~、>>、<<、>>>
  • 擴展運算符

    • +=、-=、*=、/=
  • 三目運算符

    • 條件?true的取值:false的取值
  • 優先順序

    • 盡量使用 小括弧,可讀性更好
  • instanceof

    • 檢查當前對象是否是某個特定類型

包機制

  • 域名倒寫
  • package
  • import
  • 為了防治命名衝突
  • 用於放功能相似或相關類

JavaDoc

  • 生成JDK幫助文檔

  • javadoc

    • @author

      • 作者
    • @Version

      • 版本
    • @since

      • 最早支援到哪個版本能夠使用
    • @param

      • 參數
    • @return

      • 返回
    • @throws

      • 異常
    • 編譯文件、生成幫助文檔

流程式控制制

  • Scanner

    • 用戶交互 System.in
  • 順序結構

    • 程式默認結構,自上而下的執行
  • 選擇結構

    • if 單選擇結構

    • if-else 雙選擇結構

    • if-else if-else 多選擇結構

    • switch

      • JDK7支援了String類型

      • case穿透現象,不加break 就會繼續執行下一個case

      • break

      • default

        • 默認,case沒有就執行這個
  • 循環結構

    • while

      • 滿足條件後執行
      • 盡量避免死循環
      • 一般不可計次數循環時使用
    • do…while

      • 至少執行一次,先執行
    • for

      • for(int i = 0; i < 100; i++)
      • 一般可計次數循環時使用
    • for-each

      • for(int num : nums)
      • 增強型for循環
    • 編程:列印九九乘法表

  • break & continue & return

    • break

      • 跳出循環
    • continue

      • 終止本次循環,進入下一次循環
    • return

      • 結束方法的運行

數組

  • 定義

    • new int[5]

      • 分配好空間
    • {1,2,3,4}

    • 數組存放的值必須是同一個類型

    • 存儲在堆上的對象,可保存多個同類型變數

    • 數組初始化,記憶體所佔空間固定,長度不可改變

      • 靜態初始化

        • int demoArray[3] = {1,2,3};
      • 動態初始化

        • int demoArray[10];
  • 使用

    • 通過下標拿到值

    • ArrayIndexOutOfBounds

      • 數組下標越界異常
    • for-each遍歷

    • 遍歷

      • 數組索引從0開始

      • for (int i = 0; i < myList.length; i++) {
        System.out.println(myList[i] + ” “);
        }

      • for each循環

        • for (double element: myList) {
          System.out.println(element);
          }
  • 二維數組

    • int[][]
  • Arrays

    • 工具類

    • 方法

      • 排序

        • sort()

        • sort排序原理

          • 使用了兩種排序方法,快速排序和優化的歸併排序
          • 快速排序主要是對那些基本類型數據排序,
            而歸併排序用於對Object類型進行排序。
      • 比較

        • equals()
      • 轉為字元串

        • toString()
  • 排序演算法

    • 冒泡排序
    • 選擇排序
    • 插入排序
    • 快速排序
    • 歸併排序
    • 希爾排序
    • 堆排序
    • 基數排序(桶排序)
    • 筆試:要求手寫

面向對象

什麼是面向對象

  • 一個人就是一個對象,屬性:名字,方法:動作

類與對象

    • 是Java最小的程式單元
    • 是一個模板,描述對象的狀態和行為
    • 是對象的集合
    • 由class定義
  • 對象

    • Java中除了8個基本數據類型值外,一切都是對象

    • 聲明

      • 由類聲明
    • 實例化

      • new創建對象實例化
    • 初始化

      • 創建對象時調用構造方法進行初始化
    • 屬性

      • 對象的狀態
    • 方法

      • 對象的行為操作

new 對象

  • 棧 存放引用
  • 堆 存放具體對象資訊

構造方法

  • 構造的重載

    • 默認無參構造
    • 如果手動定義了有參構造就必須要手動再加一個無參構造
    • 單例模式需要構造器私有,為的就是不讓別人去new它,只能創建一個對象
  • new需要構造方法來創建對象

  • 與類同名,無返回值無void,可以有參數,只能與new結合使用,返回的是類的實例

  • 如果不顯式定義構造方法,編譯器會為該類隱式提供默認的構造方法

  • 每個類至少一個構造方法(可以有多個),方法名與類名必須相同

方法

  • 語句的集合

  • 定義

    • 修飾符 返回值 方法名(參數名) {

      return 返回值;
      }

  • 方法調用

    • 類名.方法
    • 對象.方法
  • 方法重載

    • 名字相同,參數列表不同
  • 命令行傳參

  • 可變長參數

    • 必須放在最後一個參數
  • 遞歸

    • 自己調用自己,給自己一個出口

    • 時間複雜度高

    • 面試常問

      • 刷leetcode

        • 基礎題

封裝

  • 屬性私有,提供對應get,set 方法
  • 減少耦合
  • 隱藏實現細節
  • 容易理解

繼承

  • 關鍵字

    • extends

    • super

      • 訪問父類成員

        • super.eat();
    • this

      • 訪問自己

        • this.eat();
  • 子類繼承父類,繼承包括非private修飾的成員變數,方法

  • 減少重複程式碼,提高程式碼復用性,提高維護性

  • 不支援多繼承,但支援多重繼承、不同類繼承同一個類

  • 變相多繼承 implements

    • 可以實現多個介面

多態

  • 父類的引用指向子類的對象

    • Person person = new Student();

      • 引用 person 指向 Student 對象
  • instanceof

    • 如匹配,可以進行類型之間轉換
    • 返回:true / false
  • 同一個行為具有多個不同的表現形式

  • 例子:同一個介面,使用不同實例執行不同的操作

  • 存在的必要條件

    • 繼承
    • 重寫
    • 父類引用指向子類對象
  • 實現

    • 重寫
    • 介面
    • 抽象類
  • 編譯時多態通過方法重載

    • 重載只能通過不同的方法參數區分

      • 參數個數不同
      • 參數類型不同
    • 通過指向父類的指針,來調用在不同子類中實現的方法

  • 運行時多態通過方法重寫

  • 多態用到了動態綁定

    • 編譯時類型與運行時類型不一致就會發生運行時動態綁定(典型的就是重載)

Override、Overload

  • 重載

    • 一個類中,兩個方法同名,但形參不同(數量,類型不同),返回值可同可不同
  • 重寫

    • 方法名,形參和返回值必須相同
    • 子類可以根據自己的需要實現父類的方法

向上轉型與向下轉型

  • 向上轉型:是子類對象由父類引用,格式:parent p = new son

  • 向下轉型:是父類向下強制轉換到子類對象,前提是該父類對象必須是經過向上轉型的對象

    • 對進行過上轉型的對象,進行強制下轉型
      Son s = (Son)p;

修飾符

  • 訪問修飾符

    • private

      • 同一個類內
    • defalt

      • 同一個包內
    • protected

      • 同一個包內和所有子類
    • public

      • 所有類
  • 非訪問修飾符

    • static

      • 用來修飾類方法和類變數
      • 靜態方法只能用靜態變數(static修飾的)
    • final

      • final通常和static一起使用

      • 修飾的類

        • 不能被繼承
      • 修飾的方法

        • 不能被重寫
      • 修飾的變數

        • 不能被修改
    • abstract

      • 唯一目的:將來對類進行擴充
      • 用來創建抽象類和抽象方法
      • 類有抽象方法一定要聲明為抽象類(抽象類可以沒有抽象方法)
    • synchronized 和 volatile

      • 主要用於多執行緒編程
      • synchronized修飾的方法只能同一時間只能被一個執行緒訪問
      • volatile

介面

  • interface

  • 約束,只能定義方法名

  • 子類實現介面必須重寫其中方法

  • 只有一個方法的介面叫做函數式介面,可以使用lambda表達式簡化

  • 抽象類

    • 介面比抽象類更抽象,介面不能有實現
    • 抽象類可以有具體的實現
  • 一個類可以實現多個介面

抽象類

  • abstract

    • 用來創建抽象類和抽象方法
  • 唯一目的:將來對類進行擴充

  • 不能被實例化,必須被繼承才能使用,通常在設計階段決定是否使用

  • 類有抽象方法一定要聲明為抽象類(抽象類可以沒有抽象方法)

  • 子類繼承抽象類,父類有抽象方法子類必須重寫抽象方法

抽象類和介面區別

  • 一個類只可以繼承一個抽象類,但可以實現多個介面
  • 抽象類可以有構造方法,介面中不能有構造方法
  • 抽象類可以有普通的成員變數,介面中不能有普通的成員變數
  • 抽象類中可以包含靜態方法,介面中不能包含靜態方法

內部類

  • 定義

    • 將一個類定義在另一個類或方法中
  • 分類

    • 成員內部類

      • 定義在一個類中
    • 局部內部類

      • 定義在一個方法或作用域中
    • 匿名內部類

      • 使用最多
      • 主要編寫事件監聽程式碼
      • lambda
    • 靜態內部類

      • 定義在一個類中,static修飾
  • 深入

    • 編譯器編譯成多個class文件

克隆

  • 淺克隆

    • 淺克隆不會克隆原對象中的引用類型,僅僅拷貝了引用類型的指向
  • 深克隆

    • 深克隆的實現就是在引用類型所在的類實現Cloneable介面,
      並使用public訪問修飾符重寫clone方法。

序列化

  • 對象中被 static 或 transient 修飾的變數,在序列化時不被保存

Enum類

  • 為什麼構造函數必須是私有的

    • 為了保證每一個枚舉類元素的唯一實例,是不會允許外部進行new的

常用API

Scanner

  • 鍵盤輸入

Random

  • 生成隨機數

Arrays

  • 數組工具類

    • 排序
    • 查找

String

  • 不可變性

  • final修飾

  • 方法

    • 構造方法

      • String(char[])

      • String(byte[],Charset)

        • 位元組流,編碼
      • String(StringBuffer)

        • 將StringBuffer轉換為String
      • String(StringBuilder)

        • 將StringBuilder轉換為String
    • length()

      • 長度
    • isEmpty()

      • 判空
    • charAt(int index)

      • 獲取指定字元串
    • getBytes(String charsetName)

      • String變成位元組數組
    • indexOf(int ch)

      • 獲取指定下標
    • subString(int beginIndex)

      • 截取字元串
    • concat(String str)

      • 包含某個字元串
    • replace(char oldChar, char newChar)

      • 替換字元串
    • replaceAll(String, String)

      • 替換全部
    • split(String, int)

      • 字元串分割成數組
      • 常用
    • trim()

      • 去掉字元串兩邊空格

StringBuilder、StringBuffer類

  • StringBuffer是執行緒安全的(速度慢,需要同步)

  • StringBuilder不是執行緒安全的(沒有被synchronized(同步)修飾)

  • StringBuffer

    • 可變長

      • 原因:append()

        • 本質:拷貝成新的再返回,還是利用的String
    • 執行緒安全

      • synchronized修飾

        • 效率較低
      • 多執行緒使用

  • StringBuilder

    • 可變長

      • 原因:append()

        • 本質:拷貝成新的再返回,還是利用的String
    • 單執行緒下

      • 字元串快取區大,數據量大使用

      • 數據小使用String

        • 操作量較少
    • 非執行緒安全

      • 但效率高

        • 原因:不用同步

ArrayList

  • 數組列表

    • 長度可變

    • 類型統一

    • 一般和泛型使用

      • ArrayList list = ArrayList<>();

Math

  • 數學相關工具類

Date類

  • 時間日期類

  • 當前日期時間

    • date.toString
  • 格式化日期

    • SimpleDateFormat ft = new SimpleDateFormat (“yyyy-MM-dd hh:mm:ss”);

正則表達式

  • 用字元串描述的匹配規則

    • 判斷年份是否是’20##’ ,通過 String x = “20\d\d”; 判斷

      • \d,表示0~9的數
  • 一般用於數據校驗

Object

  • hashcode()

  • toString()

  • clone()

  • getClass()

  • notify()

    • 通知,多執行緒使用
  • wait()

  • equals()

File

  • 創建文件
  • 查看文件
  • 修改文件
  • 刪除文件

包裝類

  • 自動裝箱與拆箱
  • 八大基本類型不是類,不是面向對象,需要封裝成類

異常處理

總介面

  • Throwable

    • Exception

      • 捕獲不到需要提升到Throwable,不能捕獲Error

      • 自定義異常

        • 繼承或實現Exception 介面
      • 運行時異常

        • 1/0

        • ClassNotFound

        • NullPoint

          • 空指針
        • UnKnowType

          • 未知類型
        • 下標越界異常

        • 文件類型異常…….

        • 編譯會通過,需要手動捕獲處理,注意

        • 出現這類異常的時候程式會由虛擬機接管

      • 檢查型異常

        • 一般不管,因為編譯不會通過
    • Error

      • AWT 錯誤

      • JVM 錯誤

        • StackOverFlow

          • 棧溢出
          • 遞歸會導致錯誤
        • OutOfMemory

          • OOM
          • Java記憶體溢出
          • 一個數字太大,不斷創建對象,記憶體佔用滿了會導致錯誤
        • 面試常問

處理

  • try{}

    • 嘗試運行
  • catch () {}

    • 捕獲
    • 先捕獲小異常再捕獲大異常
  • finally()

    • 無論是否出現異常,finally中的程式碼都會被執行
  • throw

    • 方法內部,手動拋出異常
  • throws

    • 方法拋出異常
Tags: