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);
}
- for (double element: myList) {
-
-
-
二維數組
- int[][]
-
Arrays
-
工具類
-
方法
-
排序
-
sort()
-
sort排序原理
- 使用了兩種排序方法,快速排序和優化的歸併排序
- 快速排序主要是對那些基本類型數據排序,
而歸併排序用於對Object類型進行排序。
-
-
比較
- equals()
-
轉為字元串
- toString()
-
-
-
排序演算法
- 冒泡排序
- 選擇排序
- 插入排序
- 快速排序
- 歸併排序
- 希爾排序
- 堆排序
- 基數排序(桶排序)
- 筆試:要求手寫
面向對象
什麼是面向對象
- 一個人就是一個對象,屬性:名字,方法:動作
類與對象
-
類
- 是Java最小的程式單元
- 是一個模板,描述對象的狀態和行為
- 是對象的集合
- 由class定義
-
對象
-
Java中除了8個基本數據類型值外,一切都是對象
-
聲明
- 由類聲明
-
實例化
- new創建對象實例化
-
初始化
- 創建對象時調用構造方法進行初始化
-
屬性
- 對象的狀態
-
方法
- 對象的行為操作
-
new 對象
- 棧 存放引用
- 堆 存放具體對象資訊
構造方法
-
構造的重載
- 默認無參構造
- 如果手動定義了有參構造就必須要手動再加一個無參構造
- 單例模式需要構造器私有,為的就是不讓別人去new它,只能創建一個對象
-
new需要構造方法來創建對象
-
與類同名,無返回值無void,可以有參數,只能與new結合使用,返回的是類的實例
-
如果不顯式定義構造方法,編譯器會為該類隱式提供默認的構造方法
-
每個類至少一個構造方法(可以有多個),方法名與類名必須相同
方法
-
語句的集合
-
定義
-
修飾符 返回值 方法名(參數名) {
return 返回值;
}
-
-
方法調用
- 類名.方法
- 對象.方法
-
方法重載
- 名字相同,參數列表不同
-
命令行傳參
- 給main方法傳參
- 教程://www.bilibili.com/video/BV12J41137hu?p=80
- 45:22
- 必須掌握,後面JVM調優傳參就是這樣傳,在後面傳JVM參數
-
可變長參數
- …
- 必須放在最後一個參數
-
遞歸
-
自己調用自己,給自己一個出口
-
時間複雜度高
-
面試常問
-
刷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方法。
- 深克隆的實現就是在引用類型所在的類實現Cloneable介面,
序列化
- 對象中被 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<>();
- 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
- 方法拋出異常