高頻面經匯總:https://blog.csdn.net/qq_40262372/article/details/116075528
一、Java基礎
1.1面向物件和面向程序的區別
面向程序:
面向程序的性能比面向物件高,因為類呼叫時需要實體化,開銷比較大,比較消耗資源,所以當性能是最重要的考慮因素的時候,比如單片機,嵌入式一般采用面向程序開發,
面向物件:
面向物件易維護、易復用、易擴展,因為面向物件有封裝、繼承、多型特性,所以可以設計出低耦合的系統,使系統更加靈活、更加易于維護,但是,面向物件性能比面向程序低,
1.2JAVA語言有那些特點
1.簡單易學
2.面向物件
3.平臺無關性(一次編譯,到處運行)
4.可靠性
5.安全性
6.支持多執行緒
7.編譯與解釋并存
1.3(1次)JVM、JDK與JRE的通俗解答
1.3.1JVM
JVM是運行JAVA位元組碼的虛擬機,JVM有針對不同系統的特點實作,目的是使用相同的位元組碼,他們會給出相等的結果,
1.3.1.1 什么是位元組碼?采用位元組碼的好處是什么?
在Java中,JVM可以理解的代碼叫做位元組碼(拓展名為.class),他不面向任何處理器,只面向虛擬機,Java語言通過位元組碼的形式,在一定程度上解決了傳統語言執行效率低的問題,同時又保留了解釋型語言可移植的特點,所以Java程式運行時比較高效,而且,由于位元組碼并不針對一種特定的機器,因此,Java程式不用重復編譯便可在多種不同的作業系統的計算機上運行,
Java程式從源代碼到運行一般有下面3步:

需要注意的是.class到可執行的二進制機器碼的程序中,JVM有兩種方式,一種是解釋器,一種是JIT編譯器,如果是熱點程式會走JIT編譯器,否則走解釋器,
總結:
Java虛擬機是運行Java位元組碼的虛擬機,JVM有針對不同系統的特定實作,目的是用相同的位元組碼,能出相同的結果,不同系統的JVM實作了Java語言的“一次編譯多次運行”的關鍵所在,
1.3.2 JDK和JRE
JDK是Java Development Kit,它是功能齊全的Java SDK(軟體開發工具包),它擁有JRE所擁有的一切,還有編譯器(javac)和工具(如javadoc和jdb),他能夠創建和編譯程式,
JRE是Java運行時環境,他是運行已編譯Java程式所需的所有內容的集合,包括Java虛擬機(JVM),Java類別庫,java命令和其他的一些基礎構建,但是,他不用用于創建新程式,
如果你只是為了運行下Java程式的話,那么你只需要安裝JRE就可以了,如果你需要進行一些Java編程方向的作業,那么你就需要安裝JDK,但是,這也不是絕對的,有時,即使你不打算在計算機進行任何Java開發,但仍需要安裝JDK,例如,如果要使用JSP部署Web應用程式,因為應用程式服務器會將JSP轉換為Java servlet,并且需要使用JDK來編譯servlet,
1.4Java和C++的區別
同:都是面向物件的語言,支持封裝、繼承、多型
異:1.Java不提供指標操作記憶體,程式記憶體更加安全
2.Java的類是單繼承的,C++可以多繼承;雖然類不能多繼承,但是介面可以多實作
3.Java有自動記憶體管理機制,不需要程式員手動釋放無用記憶體+
1.5字符型常量和字串常量的區別
1.形式上:字符常量是單引號引起的一個字符;字串常量是雙引號的若干字符
2.含義上:字符常量相當于一個整型值(ASCII值),可以參加運算式運算;字串常量代表一個地址值(該字串在記憶體中存放位置)
3.占記憶體大小:字符常量只占兩個位元組(Java中);字串常量占若干個位元組

1位元組:B
2位元組:CS
4位元組:IF
8位元組:DL
1.6 構造器Constructor是否可被Override?
構造器不能被Override(重寫),但是可以被Overload(多載),所以你可以看到一個類中有多個建構式的情況,
1.7重寫和多載的區別
多載是同一個方法能夠根據輸入資料的不同,做出不同的處理
重寫是當子類繼承父類的相同方法,輸入資料一樣,但要做出有別于父類的相應時,你就要覆寫父類的方法,
多載:
發生在同一個類中,方法名必須相同,引數型別不同,個數不同,順序不同,方法回傳值和訪問修飾符可以不同,
重寫:
重寫發生在運行期,是子類對父類的允許訪問的方法的實作程序進行重新撰寫,
1.回傳值型別、方法名、引數串列必須相同,
2.如果父類的方法修飾符為private/static/final,子類不能重寫該方法,
3.構造方法無法被重寫

綜上說:重寫就是對父類的方法進行重新改造,外部樣子不能改變,但是內部邏輯可以改,

1.8.面向物件:封裝、繼承、多型,
1.8.1、封裝:
將類的某些資訊隱藏在類內部,不允許外部程式直接訪問,而是通過該類提供的方法來實作對隱藏資訊的操作和訪問,
好處:1.只能通過規定的方法訪問資料,
2.隱藏該類的實體細節,方便修改和實作,
A.訪問修飾符

B.Java中的內部類:
內部類就是定義在另外一個類里面的類,與之對應,包含內部類的類被稱為外部類,
那么問題來了:那為什么要將一個類定義在另一個類里面呢?清清爽爽的獨立的一個類多好啊!
內部類的作用:
1.內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類,
2.內部類的方法可以直接訪問外部類的所有資料,包括私有的資料,
3.內部類所實作的功能使用外部類同樣可以實作,只是有時使用內部類更方便,
內部類分類:
- 成員內部類
- 靜態內部類
- 方法內部類
- 匿名內部類
1.8.2.繼承:
繼承是類與類的一種關系,是一種”is a”的關系,比如“狗”繼承“動物”,這里動物類是狗類的父類或者基類,狗類是動物類的子類或者派生類,
好處:
子類擁有父類的所有屬性和方法(除了Private修飾的屬性不能擁有)從而實作了代碼的復用;
A.方法的重寫
子類如果對繼承的父類的方法不滿意(不合適),可以自己撰寫繼承的方法,這種方式就成為方法的重寫,當呼叫方法時會優先呼叫子類的方法,
重寫要注意,以下三個條件都是保持一樣:
- 回傳值型別
- 方法名
- 引數型別及個數
比如動物會叫,那么狗叫,a.都回傳叫;b.都是叫的方法;c.都是需要相同型別的發生器官
方法多載:在同一個類中處理不同資料的多個相同方法名的多型手段,

B.繼承的初始化順序
父類物件屬性初始化—》父類物件構造方法—》子類物件屬性初始化—》子類物件構造方法
C、Final關鍵字
使用final關鍵字做標識有“最終的”含義:
- final修飾類,該類不許被繼承,
- final修飾方法,該方法不能被重寫
- final修飾屬性,只能在初始化賦值或者構造方法賦值(只能選1)
- final修飾遍歷,只能賦值一次,在宣告遍歷的時候賦值,賦值完就變為了變數
1.8.3、多型:
多型是物件的多種形態,
Java中里的多型主要表現在兩個方面:
參考多型:
父類的參考指向本類的物件;
父類的參考可以指向子類的物件;
方法多型:
當我們父類的參考指向不同的子物件時,他們呼叫的方法也是多型的,
創建本類物件時,呼叫的方法為本類方法;
創建子類物件時,呼叫的方法為子類重寫的方法或者繼承的方法;
但是多型使用的時候應該注意:如果子類撰寫了一個父類不存在的方法,那么就不能通過父類的參考來呼叫這個方法,
注意:繼承是多型的基礎
A、參考型別轉換
1.向上型別轉換(隱式/自動型別轉換),是小型別轉換到大型別,
![]()
2向下型別轉換(強制型別轉換),是大型別轉換到小型別(有風險,可能出現資料溢位),

但是,如果父類沒有參考該子類,那么是不能向下型別轉換,雖然編譯器不報錯,但是運行會出錯:
![]()
還有一種情況也無法強制,父類參考是指向一個子類,之后又去強轉為其他類中是不行的,

是因為程式animal開辟的是Dog型別的記憶體空間,這與Cat型別記憶體空間不匹配,所以無法正常轉換,
instanceof運算子
instanceof是JAVA的一個二元運算子,和==,>,<是同一類,他的作用是測驗他左邊的物件是否是它右邊的類的實體,回傳boolean型別的資料,

B、抽象類
定義:抽象類前使用abstract關鍵字修飾,則該類為抽象類,
使用抽象類要注意以下幾點:
- 抽象類是約束子類必須有什么方法,而并不關注子類如何實作這些方法,
- 抽象類應用場景:
- 在某些情況下,某個父類只是知道其子類應該包含什么方法,但無法知道具體實作內容(實作多型)
- 從多個具有相同特征的類中抽象出一個抽象類,以這個抽象類作為子類的模板,從而避免子類設計的隨意性,
- 抽象類定義抽象方法,只是宣告,不需要實作,

- 抽象類中也可以包含其他普通的方法,也可以沒有抽象方法,

- 抽象類不能直接創建,可以定義參考變數來指向子類物件,來實作抽象方法,

C、介面
1.概念
介面可以理解為一種特殊的類,由全域變數和公共的抽象方法所組成,
如果說類是一種具體實作體,那么介面定義某一批類所需要遵守的規范,介面不關心這些類的內部資料,也不關心這些類里面方法的實作細節,它只規定這些類里必須提供的某些方法,(與抽象類相似)
2.基本語法

3.為什么要有介面
Java中一個類只能繼承一個父類,是不夠靈活,通過實作多個介面可以補充,
注意:如果要繼承父類,繼承父類必須在實作介面之前,即extends關鍵字必須在Implements關鍵字之前,
D、介面和匿名內部類配合使用
介面在使用程序中經常和匿名內部類配合使用,匿名內部類就是沒有名字的內部類,多用于關注實作而不關注實作類的名稱,


1.9 String、StringBuffer和StringBuilder的區別是什么?
String:
String類中使用final關鍵字修飾字符陣列來保存字串,所以String物件是不可變的,
StringBuffer與StringBuilder:
他們都是繼承自AbstactStringBuilder類,其中char[]沒有被final關鍵字修飾,所以這兩種物件都是可變的,
執行緒安全:
String中的物件是不可變的,可以理解為常量,執行緒安全,StringBuffer對方法加了同步鎖,執行緒安全;StringBuilder沒有對方法進行加同步鎖,所以是非執行緒安全的,
性能:
String修改的時候都會需要新生成一個String物件,然后將指標指向新的String物件,
StringBuffer和StringBuilder都會對自己操作,不會更改指標指向,StringBuilder的性能比StringBuffer好,但是冒著多執行緒不安全的風險,
對于三者的總結:
1.操作少量的資料:使用String
2.單執行緒操作字串緩沖區下操作大量資料:使用StringBuilder
3.多執行緒操作字串緩沖區下操作大量資料:使用StringBuffer
1.10自動裝箱和拆箱
裝箱:將基本型別用他們對應的參考類包裝起來;
拆箱:將參考型別轉換為基本資料型別;
1.11在一個靜態方法內呼叫一個非靜態方法成員為什么是非法的?

因為靜態方法可以不通過物件呼叫,所以靜態方法里,不能呼叫其他非靜態變數,也不可以訪問非靜態變數成員,
1.12 在Java中定義一個不做事且沒有引數的構造方法的作用
Java程式在執行子類的構造方法的時候,會去呼叫父類特定的構造方法,如果沒有,會去呼叫父類的空參構造方法,所以為了編譯不報錯,父類必須要加上無參構造方法,
1.13 抽象類和介面的區別
(1)語法層面上的區別
1.一個類只能繼承一個抽象類,而一個類卻可以實作多個介面,
2.抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是public static final型別的;所以不能實作類中不能重新定義,也不能改變其值;而抽象類成員變數是frendly,其值可以在子類中修改,
3.抽象方法中可以有非抽象方法,介面中則只能有default,static辦法(JDK1.8),
4.介面中可以省略abstract,抽象類是不能省略的,
5.介面中不能含有靜態代碼塊,而抽象類可以有靜態代碼塊;
(2)設計層面上的區別
1)抽象類是對類的一種抽象,而介面是對行為的抽象,比如飛機和鳥,他們都會飛,我們會把飛機設計為一個類,鳥會設計一個類,但是不會把飛行設計為一個類,只會把飛行設計為一個介面,然后類去實作自己的飛行方式,其他不能飛的東西就不能實作這個介面,
1.14 成員變數與區域變數的區別
1.從語法上看:成員變數是屬于類的,區域變數是屬于方法的,成員變數可以被pubilc、private、static修飾,區域變數不能被訪問修飾符修飾及static修飾;但是,成員變數和區域變數可以被final修飾,
2.從變數在記憶體中的存盤方式來看:因為成員變數是屬于類的,所以是存在堆中的,區域變數如果是基本型別,是存在堆疊記憶體的,如果是參考型別,存的內容是指向堆的地址或者常量池中的地址,
3.從變數生存周期來看:成員變數隨著物件消亡而消亡;區域變數隨著方法消亡而向往,
4.是否能有初值
1.15物件物體與物件參考的區別
物件物體是存在堆記憶體中,物件參考是存在堆疊記憶體,一個物件可以被任意個物件參考所參考,
1.16構造方法有那些特性?
1.名字與類名相同
2.沒有回傳值,但不能用void宣告建構式,
3.生成類的物件時自動執行,無需呼叫,
1.17靜態方法與實體方法有何不同
1.在外部呼叫靜態方法時,可以使用“類名.方法名”的方式,也可以使用“物件名.方法名”的方式,而實體方法只能有后面這種方式,也就是說,呼叫靜態方法可以無需創建物件,
2.靜態方法在訪問本類的成員的時候,值允許訪問靜態成員,而不允許訪問實體成員變數和實體方法;實體方法則無此限制,
1.18在呼叫子類構造方法之前會呼叫父類無參構造方法的目的是?
幫助子類做初始化作業
1.19==與equals(重要)
==:
它的作用是判斷兩個物件的地址是否相等,判斷是不是同一個物件(基本資料型別的==是比較值,參考資料型別==比較的是記憶體地址)
equals:
它的作用是判斷兩個物件是否相等,一般都有兩種情況:
情況1:類沒有覆寫equals()方法,則通過equals()比較該類的兩個物件時,等價于通過“==”來比較物件,
情況2:類覆寫了equals()方法,一般,我們都會覆寫equals()方法來比較兩個物件的內容是否相等,若他們相等會回傳true,


說明:
1.String中得到equals方法是被重寫的,因為Object的equals方法是比較的物件的記憶體地址,而String的equals方法比較的是物件的值,
2.當創建String型別的物件時,虛擬機會在常量池中查找有沒有已經存在的值和要創建的值相同的物件,如果有就把它賦給當前參考,如果沒有就在常量池中重新創建一個String.
a,b自身的地址是不一樣的,但是指向內容是一樣的,
1.20 hashCode與equals(重要)
面試官可能會問你:“你重寫過hashcode和equals嗎,為什么重寫equals時必須重寫hashCode方法”
1)hashCode:
hashCode()的作用是獲取哈希碼,也稱為散列碼;它實際上是回傳一個Int整數,這個哈希碼的作用是確定該物件在哈希表中的索引位置,HashCode()是定義在Object類中的,所以涉及到物件我們就會用到這個方法,而且這個方法時本地方法,是用C或C++實作的,該方法通常用來把物件的物理地址轉換為整數之后回傳,
![]()
用散串列的原因是:查找物件的時候可以根據索引快速找到,時間復雜度是O(1),
2)為什么重寫equals時必須重寫hashCode方法?
如果兩個物件相等,則hashcode一定也是相同的,兩個物件相等,對兩個物件分別呼叫equals方法都回傳true,但是,兩個物件有相同的hashcode值,他們也不一定是相等的,因此equals方法被覆寫過,則hashCode方法也必須被覆寫,這樣才能保證相等,

就是說雖然是一個類,但是實體不一樣,所以在堆上面產生的也不一樣,所以hashcode也不一樣,如果要一樣的話必須重寫hashcode方法,
3)為什么兩個物件有相同的hashcode值,他們也不一定相等?
因為hashCode()所使用的雜湊演算法也許剛好會讓多個物件傳回相同的雜湊值,越糟糕的雜湊演算法越容易碰撞,但這也與資料值域分布的特性有關(所謂碰撞也就是指不同的物件得到相同的hashCode).
比如HashSet,它如何避免添加重復值呢?通過hashcode與equal一起作用,hashcode只是用來縮小查找成本,
1.21簡述執行緒、程式、行程的基本概念,以及他們之間關系是什么?
程式是含有指令和資料的檔案,被儲存在磁盤或其他的資料存盤設備中,也就是程式是靜態的代碼,
行程是程式的一次執行程序,是系統運行程式的基本單位,因此行程是動態的,系統運行一個程式是一個行程從創建、運行到消亡的程序,一個行程就是一個執行中的程式,他在計算機中一個指令接著一個指令地執行著,同時,每個行程還占著某些系統資源如CPU時間,記憶體空間,檔案,輸入輸出設備的使用權等等,換句話說,當程式在執行的時候,將會被作業系統掛入記憶體中,
執行緒與行程相似,但執行緒是一個比行程更小的執行單位,一個行程在其執行的程序中可以產生多個執行緒,與行程不同的是同類的多個執行緒共享同一塊記憶體空間和一組系統資源,所以系統在產生一個執行緒,或是在各個執行緒之間切換作業時,負擔要比行程小得多,所以執行緒也被稱為輕量級行程,
1.22執行緒有那些狀態

執行緒比行程多了一個超時等待,
這邊對應行程的五個狀態:

1.23 關于final關鍵字的一些總結
Final關鍵字主要用在三個地方:變數、方法、類,
1.對于一個final變數,如果是基本資料型別的變數,則其數值一旦在初始化之后便不能更改;如果是參考型別的變數,則在對其初始化之后便不能再讓其指向另一個物件,
2.當用final修飾一個類時,表明這個類不能被繼承,Final類中的所有成員方法都會被隱式地指定為final方法,
1.24 Java中的例外處理
在Java中,所有的例外都有一個共同的祖先是Throwable類,其中有兩個子類Exception(例外)和Error(錯誤),Exception能被程式本身處理(try..catch),Error是無法處理的(只能盡量避免),
Exception:
程式本身可以處理的例外,可以通過catch來進行捕獲,Exception又可以分為受檢查例外(必須處理)和不受檢查例外(可以不處理),
Error:
Error屬于程式無法處理的錯誤,我們沒有辦法通過catch來進行捕獲,例如,Java虛擬機運行錯誤、虛擬機記憶體不夠(OOM)、類定義錯誤,這些例外發生時,Java虛擬機一般會選擇執行緒終止,
不受檢查例外:只有RuntimeException及其子類
受檢查例外:除開RuntimeException及其子類意外的例外類都需要
Throwable類常用方法
public string getMessage():回傳例外發生時的簡要描述
Public string toString():回傳例外發生時的詳細資訊
Public string getLocalizedMeassage():回傳例外物件的本地化資訊,
Public void printStackTrace():在控制臺上列印Throwable物件封裝的例外資訊
例外處理總結:
Try塊:用于捕獲例外,
Catch塊:用于處理try捕獲到的例外
Finally塊:無論是否捕獲或處理例外,finally塊里的陳述句都會被執行,
以下三種特殊情況,finally塊不會被執行:
1.在try或finally用了system.exit(int)退出程式,
2.所有執行緒死亡
3.關閉CPU,
1.25Java序列化中如果有些欄位不想進行序列化,怎么辦
1.25.1序列化
將Java物件轉換成二進制流寫入磁盤,這個程序叫做序列化
1.25.2序列化的意義
Java中物件的序列化指的是將物件轉換成位元組序列的形式來表示,這些位元組序列包含了物件的資料和資訊,一個序列化的物件寫到資料庫或者磁盤中,也可用于網路傳輸,其中我們的物體類實作Serializable介面,目的就是為了讓其可序列化,
當然,序列化的目標就是為了反序列化,這樣才可以把傳輸過來的二進制轉化為本地java物件,
1.25.2不想序列化的意義
如果不想被序列化那么在變數名前加transient關鍵字,其中的作用有兩點:
1.為了資料的安全,避免序列化和反序列化,在實際開發中,如果一個用戶有一些敏感化的詞(比如密碼和銀行卡號等),為了安全起見,不希望在網路操作中被傳輸,這些資訊就需要加上transient關鍵字,這個欄位只會在呼叫者的記憶體中,而不會寫到磁盤里持久化,
2.節省存盤空間,類中的欄位可以從其他欄位匯出,比如計算一個矩形的面積,我們只需要長寬就可以了,那么面積就不用被序列化,
1.26獲取用鍵盤輸入常用的方法
Scanner

BufferedReader

1.27Java中的IO流
1.27.1 Java中IO流分為幾種?
按照流向方向區分:輸入和輸出流
按照操作單元區分:位元組流和字符流
按照擔任角色劃分:節點流和處理流
輸入和輸出流
寫檔案輸入流,讀檔案輸出流

位元組流和字符流
位元組流是資料單位為8位的位元組,字符流操作的是資料單位為16位的字符
為什么要字符流:Java中字符采用的是Unicode標準,在Unicode標準下,一個英文為一個位元組,一個中文是兩個位元組,如果采用位元組流一個一個讀會出現亂碼,有字符流才會在緩沖區根據編碼規則進行編碼成對應的字符,

節點流和處理流
節點流:直接操作資料讀寫的流類,如FileInputStream
處理流:對一個已存在的流的鏈接和封裝,通過對資料進行處理為程式提供功能強大、靈活的讀寫功能,例如BufferedInputStream(緩沖位元組流)
處理流和節點流應用了Java的裝飾者設計模式,

在諸多的處理流中,緩沖流非常重要,為了減少程式與磁盤的互動(IO操作真的很浪費時間)

就跟我們搬磚一個道理,我們一塊一塊搬到車前是比我們拿個小推車,先把磚裝上小推車,然后小推車在推到車面前效率低很多,
但是如果其中長度超過了輸出緩沖區的大小,重繪輸出緩沖區,然后直接寫入資料,所以就跟車子有容量,你裝了太多車子會壞掉的一樣道理,
1.27.2 BIO,NIO,AIO有什么區別?
BIO(Blocking I/O):同步阻塞I/O模式,資料的讀取寫入必須阻塞在一個執行緒內等待其完成,在活動連接數不是特別高(小于單機1000)的情況,這種模型是比較不錯的,可以讓每一個連接專注于自己的I/O并且編程模型簡單,也不用過多考慮系統的過載、限流等問題,
NIO(Non-Blocking/New I/O):同步非阻塞I/O模型,NIO提供了與傳統的BIO模型中的Socket和ServerSocket 相對應的SocketChannel和ServerSocketChannel兩種不同的套接字(用程式通過網路協議進行通信的介面)通道實作,這兩種通道都支持阻塞和非阻塞兩種模式,阻塞模式使用就像傳統中的支持一樣,比較簡單,但是性能和可靠性都不好;非阻塞模式正好與之相反,對于低負載、低并發的應用程式,可以使用同步阻塞I/O來提升開發速率和更好的維護性;對于高負載、高并發的應用,應使用NIO的非阻塞模式來開發,
AIO(Asynchronous I/O):AIO也就是NIO 2,在Java 7中引入了NIO的改進版NIO2,它是異步非阻塞的IO模型,異步IO是基于事件和回呼機制實作的,也就是應用操作之后會直接回傳,不會阻塞在哪里,當后臺處理完成,作業系統會通知相應的執行緒進行后續的操作,
1.28深拷貝VS淺拷貝
淺拷貝:對基本資料型別進行值傳遞,對參考資料型別進行地址拷貝,
深拷貝:對基本資料型別進行值傳遞,對參考資料型別,創建一個新的物件,并復制其內容,

1.29 (1次)不用集成開發環境(IDE),怎么輸出字串“test”
1.新建檔案.java

2.javac 將.java檔案編譯成位元組碼.class檔案

3.java Test 執行位元組碼檔案,命令臺輸出test
![]()
1.30(1次)說一下反射機制
反射是一個比較生澀難懂的概念,為了形象,我先舉一個例子,我們有時候專案中會用mysql,有時會用到sqlserver等資料庫,我們實際情況是需要哪個驅動類才會去加載,不會把這些資料庫加載驅動都加載到JVM里面,如果都加載,豈不是JVM可用的記憶體就少了,這對服務器來說就很難受了,記憶體中存在一些經常不用的驅動類,因此我們需要在動態去加載我們需要的驅動,如果不是動態加載,如果靜態加載的話,那么就是這樣的情況,要切換資料庫驅動的時候,我們就把服務停下來,new一個需要的驅動,這對用戶來說體驗極差,肯定不行啊,因此我們就會采用動態加載,
反射機制就是采用這種動態加載,我們通過三種方法獲得Class:

然后獲得了Class后,我們就可以呼叫Class物件的newInstance()方法來創建Class物件對應類的實體了;或者通過獲得構造器(類一定要有空參構造),給構造器傳入引數,也可創建實體,


1.31(1次)陣列與鏈表的區別
陣列:在記憶體中,陣列是一塊連續的區域,隨機查找快,插入資料和洗掉資料效率低,插入資料時,這個位置后面的資料在記憶體中都要往后移動,洗掉資料時,這個資料后面的資料都要往前移動,
鏈表:在記憶體中可以存在任何地方,不要求連續,增加資料和洗掉資料很容易,直接將尾指標指向新加的節點,洗掉資料的話,把尾指標指向下一個節點即可,但是查詢的時候,需要從頭結點一個一個查詢下去!
1.32 (1次)static關鍵字
從以下幾個方面介紹:
Static方法:
在靜態方法中,我們可以直接類名.方法名()即可呼叫,要注意的是,靜態方法中是不可訪問非靜態變數和方法的,
Static變數:
靜態變數是被所有的物件共享,在記憶體中只有一個副本(存在方法區),只能在類初次加載的時候才會被初始化,
Static代碼塊:
只需要執行一次的初始化操作都放在static代碼塊中進行,為了優化程式性能,比如判斷年齡區間,有一個開始年齡和結束年齡,我不會每次都用Date類去生成,固定好了區間,直接初始化一次即可,
靜態內部類:
1.如果內部類不會參考到外部類東西的話,強烈建議使用靜態內部類,因為這樣更節省資源,減少內部類其中的一個指向外部類的參考,
2.這個靜態內部類,不需要在外部參考,只為當前類提供服務, 封裝的完整性,
3.還有靜態內部類只能訪問外部類的靜態屬性和方法,而且靜態內部類還可以有靜態資料,靜態方法或者又一個靜態內部類,這些是非靜態內部類所沒有的,
靜態導包:
其目是為了減少字符輸入量,提高代碼的可閱讀性,以便更好地理解程式

1.33 Stream關鍵字
Stream是Java8中處理集合的關鍵抽象概念,它可以指定你希望對集合進行的操作,可以執行非常復雜的查找、過濾、映射資料等操作,
特點:
1.不是資料結構,不會保存資料
2.不會修改原來的資料源,他會將操作后的資料保存到另外一個物件中(peek方法可以修改)
3.惰性求職,流再中間處理程序,只是對操作進行哦記錄,并不會立即執行,需要等到執行終止操作的時候才會進行實際的計算,
常用方法:

最后轉成資料結構collect()

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/280348.html
標籤:java
上一篇:java之String、StringBuffer 、 StringBuilder有什么區別?String不可變?
