前言
今天給大家分享一些Java面試中頻繁被問到的一些面試題吧,在寫之前先給大家說一聲:冬至快樂,大家一定記得吃餃子喔~
文章目錄
Java基礎——基礎知識
Java基礎——集合框架/泛型/容器
Java基礎——多執行緒
Java基礎——框架基礎:注解/反射/流行框架
Java基礎——面向物件:繼承/多型/封裝
Java基礎——設計模式
Java基礎——JVM/類加載
Java基礎——I/O
網路編程和計網
資料庫
作業系統
資料結構
Java基礎—基礎知識
一、 九種基本資料型別的大小,以及他們的封裝類,
byte(Byte) 1 ,short(Short) 2 ,int(Integer) 4 ,long(Long) 8 ,float(Float) 4 ,double(Double)8,boolean(Boolean),char(Character)2
二、Switch能否用string做引數?
switch陳述句中的變數型別可以使byte,short,int,char,從jdk1.7后可以使用String型別,是通過switch中的String.hashcode將String轉換成int進行判斷的,
三、equals與==的區別,
==運算子是用來比較兩個變數的值是否相等,即就是比較變數在記憶體中的存盤地址是否相同,equals()方法時String類從Object類中繼承的,被用來檢測兩個物件的內容是否相同,
四、String s=new String(‘xyz’);創建了幾個object物件?
會創建一個String型別的變數s,在類加載到此處之前沒有出現“xyz”字面量的話,加載此處會創建一個對應“xyz”的String常量物件,在符合規范的JVM上,執行到此處new關鍵字會創建一個String物件,
五、 Object有哪些公用方法?
1、clone()創建斌回傳此物件的副本
2、equals()判斷
3、getclass()回傳object的運行類
4、hashcode()回傳物件的哈希碼值
5、notify()喚醒正在等待物件監聽器的單個行程
6、notifyAll()喚醒正在等待物件監聽器的所有行程
7、wait()導致當前執行緒等待,直到另一個執行緒呼叫該物件的 notify()方法或 notifyAll()方法,
8、toString()回傳此物件的字串表示形式
9、finalize()當垃圾收集確定不需要該物件時,垃圾回收器呼叫該方法
六、Java的四種參考,強弱軟虛,用到的場景,
強參考:垃圾回收器不會回收
軟參考:如果記憶體空間足夠,垃圾回收器就不會進行回收,如果記憶體空間不足,垃圾回收器就會進行回收
弱參考:一旦發現了只有弱參考的物件,垃圾回收器就會進行回收,
虛參考:如果發現該物件還具有虛參考,就會在回收該物件之前,吧這個虛參考加入到與之關聯的參考佇列中,
七、靜態變數和實體變數的區別,
靜態變數前要加上關鍵字static,實體變數則不會,
實體變數是屬于某個物件的屬性,必須創建了實體物件,其中的實體變數才會分配空間,才能使用這個實體變數,靜態變數不屬于任何的實體物件,而是屬于類,也稱為類變數,只要程式加載了類的位元組碼,不用創建任何實體物件,就會被分配空間,總之就是,靜態變數不需要創建任何的物件就可以直接使用,而實體變數需要先創建實體物件才能被使用,
八、 Overload和Override的區別:
多載Overload表示的是同一個類中可以有多個相同名稱的方法,但這些方法的引數串列不同,即就是引數引數或引數型別不同,多載時回傳值當然可以不一樣,但是如果引數串列完全一致時,不能通過回傳型別不一致而實作多載,這是不可以的,
重寫Override表示子類中的方法可以與父類中的方法名稱和引數完全相同,通過子類創建的物件來呼叫這個方法時,將呼叫子類中定義的方法,即就是子類中的該方法將父類的該方法覆寫了,子類覆寫父類方法時只能拋比父類更少或者更小的例外,重寫的方法其回傳必須和被覆寫的方法回傳一致,
九、抽象類和介面的區別,
抽象類可以有默認的方法進行實作,可以有構造器,可以有main方法進行運行,可以直接在該類中添加實作的方法介面沒有默認的方法進行實作,沒有構造器,不可以使用main方法進行運行,在介面中添加方法時需要在具體實作的類中添加方法,
十、String、StringBuffer與StringBuilder的區別,
String表示內容不可修改的字串,StringBuffer表示內容可以修改的字串,String覆寫了equals()方法和hashcode()方法,而StringBuffer沒有覆寫兩個方法,,所以StringBuffer物件存盤到java集合類中時會出現問題,
StringBulider也表示內容可以修改的字串,但是其執行緒是不安全的,運行效率高,
十一、 Java面向物件的特征與含義,
封裝、繼承、抽象、多型
1、封裝:封裝的目的在于實作程式的“高內聚,低耦合”,防止程式相互依賴而帶來的變動影響,封裝是保證是把對同一事物進行操作的方法和相關的方法放在同一個類中,把方法和他操作的資料放在同一個類中,
2、抽象:抽象就是找出事物的相似和共性,然后將這些事物歸為同一類,這個類只考慮這些事物的相似和共性,忽略和當前主題不相關的因素,
3、繼承:子類繼承父類的內容作為自己的內容,可以加入新的內容或者是修改父類的內容而更加適合特殊的需要,提高了額程式的可重用性和可擴張性,
4、多型:多型是指程式中定義的參考變數所指向的具體型別和通過該參考變數發出的方法呼叫在編程時并不確定,而是在程式運行期間才確定,即一個參考變數倒底會指向哪個類的實體物件,該參考變數發出的方法呼叫到底是哪個類中實作的方法,必須在由程式運行期間才能決定,

上圖是我整理的關于Jvm資料的檔案,需要的可以點擊領取資料!!!
十二、java多型的實作
介面實作,繼承父類進行方法重寫,
同一個類中進行方法多載,
十三、error和exception區別
error表示有可能恢復但比較困難的的一種嚴重問題,程式是不能進行處理的exception表示一種設計或者實作問題,
十四、運行時例外和一般例外的區別
例外表示程式運行程序中可能出現的非正常狀態,運行時例外表示虛擬機的通常操作中可能遇到的例外,是一種常見的運行錯誤,java編譯器要求方法必須宣告拋出可能出現的非運行時例外,但是并不要求必須宣告拋出未被捕獲的例外
十五、Java中的例外處理機制和簡單原理和應用
JAVA程式違反了JAVA的語意規則時,JAVA虛擬機就會將發生的錯誤表示為一個例外,違反語意規則包括2種情況,一種是JAVA類別庫內置的語意檢查,例如陣列下標越界,會引發IndexOutOfBoundsException;訪問null的物件時會引發 NullPointerException,另一種情況就是JAVA允許程式員擴展這種語意檢查,程式員可以創建自己的例外,并自由選擇在何時用 throw關鍵字引發例外,所有的例外都是java.lang.Thowable的子類,
十六、Java語言如何進行例外處理,throws,throw,try catch finally代表什么意義,try塊中可以拋出例外嗎?
Java通過面向物件的方法進行例外處理,把各種不同的例外進行分類,并提供了良好的介面,在Java中,每個例外都是一個物件,它是Throwable類或其它子類的實體,當一個
方法出現例外后便拋出一個例外物件,該物件中包含有例外資訊,呼叫這個物件的方法可以捕獲到這個例外并進行處理,Java的例外處理是通過5個關鍵詞來實作的:try、catch、throw、throws和finally,一般情況下是用try來執行一段程式,如果出現例外,系統會拋出(throws)一個例外,這時候你可以通過它的型別來捕捉(catch)它,或最后(finally)由預設處理器來處理,
用try來指定一塊預防所有”例外”的程式,緊跟在try程式后面,應包含一個catch子句來指定你想要捕捉的”例外”的型別,
throw陳述句用來明確地拋出一個”例外”,
throws用來標明一個成員函式可能拋出的各種”例外”,
Finally為確保一段代碼不管發生什么”例外”都被執行一段代碼,
可以在一個成員函式呼叫的外面寫一個try陳述句,在這個成員函式內部寫另一個try陳述句保護其他代碼,每當遇到一個try陳述句,”例外”的框架就放到堆疊上面,直到所有的try陳述句都完成,
如果下一級的try陳述句沒有對某種”例外”進行處理,堆疊就會展開,直到遇到有處理這種”例外”的try陳述句,
十七、 try catch finally,try里有return,finally還執行么?
1、finally陳述句總會執行
2、如果try、catch中有return陳述句,finally中沒有return,那么在finally中修改除包裝型別和靜態變數、全域變數以外的資料都不會對try、catch中回傳的變數有任何的影響(包裝型別、靜態變數會改變、全域變數)
3、盡量不要在finally中使用return陳述句,如果使用的話,會忽略try、catch中的回傳陳述句,也會忽略try、catch中的例外,屏蔽了錯誤的發生,
4、finally中避免再次拋出例外,一旦finally中發生例外,代碼執行將會拋出finally中的例外資訊,try、catch中的例外將被忽略
十八、 Java中final、finally和finalize的區別
final 用于宣告屬性,方法和類,分別表示屬性不可變,方法不可覆寫,類不可繼承,
內部類要訪問區域變數,區域變數必須定義成final型別,例如,一段代碼……
finally是例外處理陳述句結構的一部分,表示總是執行,
finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆寫此方法提供垃圾收集時的其他資源回收,例如關閉檔案等,JVM不保證此方法總被呼叫,
十九、 常見的運行時例外
系統例外是RuntimeException的子類,常見的系統例外有:
ArrayIndexOutOfBoundsException - 陣列越界訪問
ClassCastException - 型別轉換例外
NullPointerException - 試圖訪問一空物件的變數、方法或空陣列的元素
IllegalArgumentException - 方法的引數無效
NoClassDefFoundException - JAVA運行時系統找不到所參考的類
集合:
二十、Collection框架的結構
集合框架(Collection Framework)泛指java.util包的若干個類和介面.如Collection,List,ArrayList,LinkedList,Vector(自動增長陣列),HashSet,HashMap等,
集合框架中的類主要封裝的是典型的資料結構,如動態陣列,鏈表,堆疊,集合,哈希表等.
集合框架類似編程中經常用到的工具類,使得編碼這專注于業務層的實作,不需要從底層實作相關細節—“資料結構的封裝”和”典型演算法的實作”,
二十一、Collection包結構
Collection是集合類的上級介面,是單列集合,繼承他的介面主要有Set 和List.
Set介面的子介面有:HashSet,TreeSet
List介面的子介面有:Arraylist,LinkedList,Vector
二十二、Collection與Collections的區別,
Collection是集合類的上級介面,繼承他的介面有Set和List
Collections是針對集合類的一個幫助類,它提供一系列的靜態方法實作集合的搜索,排序,執行緒安全等操作,
二十三、 Colection框架中實作比較要實作什么介面?
comparable:只包含compareTo()方法
comparator:compare()和equals()
二十四、Map、Set、List、Queue、Stack的特點與用法,
1、Map是以鍵值對的形式進行存盤的,其中key是唯一不可重復的,value的可以重復,當插入的值是key相同,后加入的會將已有的覆寫,他有幾個具體的實作類,包括Treemap和HashMap,TreeMap是有序的,HashMap是無序的,
2、List 有序,可重復
|–ArrayList
底層資料結構是陣列,查詢快,增刪慢,執行緒不安全,效率高
|–Vector
底層資料結構是陣列,查詢快,增刪慢,執行緒不安全,效率高
|–LinkedList
底層資料結構是鏈表,查詢慢,增刪塊,執行緒安全,效率低
3、Set 無序,唯一
|–HashSet
底層資料結構是哈希表
如何保證元素的唯一性:
依賴兩個方法,hashCode()和equals()
|–LinkedHashSet
底層資料結構是鏈表和哈希表,由鏈表保證元素有序,由哈希表保證元素唯一
|–TreeSet底層資料結構是紅黑樹,
如何保證元素的排序:
自然排序:讓元素所屬的類實作Comparable介面
比較器排序:讓集合接收一個Comparator的實作類物件
如何保證元素的唯一性:
根據比較的回傳值是否是0來決定的
4、Query佇列遵循先進先出的原則,不允許插入null值,其中提供了相應的進隊和出隊的方法,建議使用offer()方法來添加元素,使用poll()方法洗掉元素
5、Stack遵從后進先出的原則,繼承自Vector,他通過5個操作對Vector類進行擴展,它提供了push和pop操作,以及去堆疊頂點的peek()方法,測驗堆疊是否為空的empty方法
6、使用方法:
如果涉及到堆疊,佇列等操作,建議使用List
對于快速插入和洗掉元素建議使用LinkedList
需要快速隨機訪問元素建議使用ArrayList

需要圖中資料的可以點擊這里獲取哦!!!
二十五、 Set里面的元素不能重復,用什么方法區分重復與否?
Set里的元素是唯一不能重復的,元素是否重復使用equals()方法進行判斷,
equals()方法和==方法決定參考值是否指向同一物件equals()在類中被覆寫,為的是兩個分離的物件的內容和型別相匹配的話,回傳真值,
二十六、HashMap和Hashtable的區別,
1、Hashtable是基于Dictionary類的,HashMap是Map介面的一個實作類
2、Hashtable是執行緒安全的,即是同步的;HashMap執行緒不是安全的,不是同步的,
3、HashMap可以將空值作為key或value
二十七、 HashMap、LinkedHashMap、TreeMap的區別,
1、HashMap是根據鍵的hashcode值存盤資料,根據鍵可以直接獲取它的值,具有很快的訪問速度,取得的資料完全是隨機的
2、LinkedHashMap保存了記錄的插入順序,在使用Iterator進行遍歷的時候,先得到的肯定是先插入的資料,可以在構造時帶引數,按照應用次數來進行排序
3、TreeMap實作SortMap介面,能夠把它保存的記錄根據鍵排序,默認的是升序排序,也可以指定排序的比較器,進行遍歷的時候得到的是排序過的記錄,
二十八、HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底層實作,
1、HashMap是java資料結構中兩大結構陣列和鏈表的組合,HashMap底層陣列,陣列中的每一項又是一個鏈表,程式會先根據key的hashcode()方法回傳值決定該Entry在陣列中的
存盤位置,如果該位置上沒有元素,就會將元素放置在此位置上,如果兩個Entry的key相同,會呼叫equals,回傳值是true則覆寫原來的value值,回傳false則會形成Entry鏈,位于頭部,
2、ArrrayList的底層實作是陣列,在執行add操作時,會先檢查陣列 大小是否可以容納新的元素,如果不夠就會進行擴容,然后會將原來的資料拷貝到新的陣列中,
3、LinkedList底層是一個鏈表,其實作增刪改查和資料結構中的操作完全相同,而且插入是有序的,
4、LinkedHashMap的底層結構式是雙鏈表,其他的邏輯處理與HashMap一致,同樣沒有鎖保護,多執行緒使用時存在風險,
5、ConcurrentHashMap是segment陣列結構和HashEntry陣列結構組成的,segment在ConcurrentHashMap中充當鎖的角色,HashEntry用于存盤鍵值對資料,segment的結構是陣列和鏈表,一個segment中有一個HashEntry,每個HashEntry是一個鏈表結構的元素,對HashEntry中的資料進行修改時,需要先獲得它所對應的segment鎖,每個ConcurrentHashMap默認有16個segment,
二十九、迭代器Iterator
Iterator提供了統一遍歷操作集合元素的統一介面,Collection介面實作Iterator介面,每個集合都通過實作Iterator介面中的iterator()方法回傳實體,然后對元素進行迭代操作,但是在迭代元素的時候不能使用集合的方法洗掉元素,否則會拋出例外,可以使用Iterator介面中的remove()方法進行洗掉,
三十、 快速失敗(fail-fast)和安全失敗(fail-safe)的區別,
Iterator的安全失敗是基于對底層集合做拷貝,因此它不受源集合修改的影響,util包下的所有集合類都是快速失敗的,util.concurren包下面的所有類都是安全失敗的,
Java基礎—集合框架/泛型/容器
概念
一、容器(Container)
Spring 提供容器功能,容器可以管理物件的生命周期、物件與物件之間的依賴關系,您可以使用一個組態檔(通常是 XML),在上面定義好物件的名稱、如何產生(Prototype 方式或 Singleton 方式)、哪個物件產生之后必須設定成為某個物件的屬性等,在啟動容器之后,所有的物件都可以直接取用,不用撰寫任何一行程式代碼來產生物件,或是建立物件與物件之間的依賴關系,
換個更直白點的說明方式:容器是一個 Java 所撰寫的程式,原先必須自行撰寫程式以管理物件關系,現在容器都會自動幫您作好,
常用容器:WebSphere,WebLogic,Resin,Tomcat,
容器類
容器類 其實就是一種用來存盤資料的資料結構,在 JAVA 中容器可分為即 “集合”(Set)、“串列”(List)、“映射”(Map),至于,為什么需要容器,總的來說,主要是在以陣列作為資料的存盤結構中,其長度難以擴充,同時陣列中元素型別必須相同,而容器可以彌補陣列的這兩個缺陷,
Java 容器類包含 List、ArrayList、Vector 及 map、HashTable、HashMap,
ArrayList 和 HashMap 是異步的,Vector 和 HashTable 是同步的,所以 Vector 和 HashTable 是執行緒安全的,而 ArrayList 和 HashMap 并不是執行緒安全的,因為同步需要花費機器時間,所以 Vector 和 HashTable 的執行效率要低于 ArrayList 和 HashMap,
二、集合框架的說明
所有集合類都位于 java.util 包下,Java 的集合類主要由兩個介面派生而出:Collection 和 Map,Collection 和 Map 是 Java 集合框架的根介面,這兩個介面又包含了一些子介面或實作類,
1.Set、List 和 Map 可以看做集合的三大類:
2.List 集合是有序集合,集合中的元素可以重復,訪問集合中的元素可以根據元素的索引來訪問,
Set 集合是無序集合,集合中的元素不可以重復,訪問集合中的元素只能根據元素本身來訪問(也是集合里元素不允許重復的原因),
3.Map 集合中保存 Key-value 對形式的元素,訪問時只能根據每項元素的 key 來訪問其 value,
三、集合框架詳細說明
1、Collection 是一個介面,是高度抽象出來的集合,它包含了集合的基本操作和屬性,Collection 包含了 List 和 Set 兩大分支,
(1)List 是一個 有序的佇列,每一個元素都有它的索引,第一個元素的索引值是 0,List 的實作類有 LinkedList, ArrayList, Vector, Stack,
(2)Set 是一個不允許有重復元素的集合,Set 的實作類有 HastSet 和 TreeSet, HashSet 依賴于 HashMap,它實際上是通過 HashMap 實作的;TreeSet 依賴于 TreeMap,它實際上是通過 TreeMap 實作的,
2、Map 是一個映射介面,即 key-value 鍵值對,Map 中的每一個元素包含 “一個 key” 和 “key 對應的 value”,AbstractMap 是個抽象類,它實作了 Map 介面中的大部分 API,而 HashMap,TreeMap,WeakHashMap 都是繼承于 AbstractMap,Hashtable 雖然繼承于 Dictionary,但它實作了 Map 介面,
3、接下來,再看 Iterator,它是遍歷集合的工具,即我們通常通過 Iterator 迭代器來遍歷集合,我們說 Collection 依賴于Iterator,是因為 Collection 的實作類都要實作 iterator () 函式,回傳一個 Iterator 物件,ListIterator 是專門為遍歷 List 而存在的,
4、再看 Enumeration,它是 JDK 1.0 引入的抽象類,作用和 Iterator 一樣,也是遍歷集合;但是 Enumeration 的功能要比 Iterator 少,在上面的框圖中, Enumeration 只能在 Hashtable, Vector, Stack 中使用,
5、最后,看 Arrays 和 Collections,它們是操作陣列、集合的兩個工具類,
四、集合與陣列
五、層次關系
六、幾種重要的介面和類簡介
七、遍歷
八、ArrayList 和 LinkedList
九、Map 集合
十、主要實作類區別小結
…
Java基礎—多執行緒
一、多執行緒基本概念
二、執行緒相關的常用方法
三、繼承Thread類
四、實作Runnable 介面
五、Java 分為兩種執行緒:用戶執行緒和守護執行緒
六、用戶執行緒就是前臺執行緒,守護執行緒就是后臺執行緒
七、什么是可重入鎖?
八、Lock 與 synchronized 的不同
九、synchronized的使用
十、atomic 包底層實作原理
十一、Lock底層原理
十二、多執行緒不安全的底層原因以及兩種加鎖方式的區別
十三、Java多執行緒中 的各種鎖
十四、Java多執行緒中 的各種鎖(補充)
十五、阻塞佇列BlockingQueue
十六、Java執行緒池、Java執行緒池進階、Java中的ThreadLocal
Java基礎—框架基礎:注解/反射/流行框架
一、優化 Hibernate 所鼓勵的7大措施
二、序列化和反序列化
三、Java中池的概念
四、Java反射
五、Spring的IOC和AOP概念和實作原理
六、 仿照 Spring 實作簡單的 IOC
七、仿照 Spring 實作簡單的 AOP
八、Spring bean 的生命流程
九、仿寫Spring 進階之 AOP和IOC協作
Java基礎—面向物件:繼承/多型/封裝
一、重寫與多載
二、單繼承和多繼承
三、多型
四、super和this關鍵字
Java基礎—設計模式
一、單例模式之懶漢式和餓漢式
二、設計模式之觀察者模式
三、設計模式之工廠模式
四、設計模式之代理模式
Java基礎—JVM/類加載
一、初始化執行代碼順序(包含static塊和構造塊)以及類方法和實體方法
二、JVM記憶體結構
三、JVM組成部分
四、類加載機制
五、類加載器
六、Java類加載器之間的關系
七、虛擬機中的物件
八、虛擬機 分配記憶體
九、Java中的參考型別
十、JVM如何判斷是否回收物件
十一、垃圾回收演算法
十二、JVM運行時資料區域
十三、JVM垃圾收集器
十四、JVM垃圾回收
十五、Java中的記憶體泄露和記憶體溢位
Java基礎——I/O
一、I/O 基本概念
二、I/O 模型 ——阻塞、非阻塞、多路復用、異步
三、JAVA中 BIO 與 NIO、AIO
網路編程和計網
一、Java中的原碼、反碼和補碼
二、forward 和 redirect
三、URL的組成
四、通信的基礎——IP、DNS、MAC地址
五、關于ip地址的理解
六、GFW(中國防火長城)作業原理
七、OSI七層模型和 五層體系結構
八、TCP 三次握手和四次揮手協議
九、TCP協議 (可靠保證、TCP、UDP、擁塞、ARQ)
十、HTTP 和 HTTPS
十一、Http/1.0、Http/1.1、Http2
十二、Https 加密程序詳解
十三、HTTP協議的補充(POST、GET請求方法、冪等性)
十四、網路攻擊(XSS、CSRF)詳解
十五、DDoS 攻擊詳解
十六、SQL注入攻擊詳解
資料庫
一、結果集 (ResultSet)全面決議
二、基本概念
三、索引
四、事務
五、存盤引擎
六、資料庫優化
七、資料庫鎖
八、主從復制和讀寫分離
作業系統
一、執行緒行程部分
二、記憶體和中斷
三、互斥和同步
四、Linux相關命令
五、Linux IO 模式及 select、poll、epoll 詳解
資料結構
一、鏈表、陣列、字符、樹篇
二、堆、堆疊、佇列篇
三、B樹、B+樹、B*樹
四、Java實作排序演算法,比較時間復雜度
五、紅黑樹
六、資料結構之堆疊
七、搜索與回溯演算法-Java實作
八、高效判斷一個數,是不是素數
最后

筆者整理了最新各路知識點合集包含有:資料結構、演算法、資料庫、spring全家桶系列、JVM、MySQL、MyBatis、Dubbo、Liunx、TomCat等多種知識點,
如果各位有需要的話 點擊這里可以領取資料!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/238533.html
標籤:java
