java面試重點(二)
個人純手工打造,大佬多多關照,謝謝了!
java面試重點(二)
目錄
https://blog.csdn.net/eaphyy/article/details/71190441 Mybatis地址............................... 50
面試關隘
- 會寫不會說
- 同樣一個問題,換個問法就不會。
- 越簡單越不會
- Html是什麼 超文字標記語言 HyperText Markup Language
- Css是什麼 層疊樣式表 Cascading Style Sheets
- …
Java SE部分:
- 面向物件與面向過程的區別?
面向過程的語言(c)是把問題分解為一個一個的步驟,然後使用函式來封裝每一個步驟的功能,最後用一個一個函式的呼叫的過程來解決問題。
面向物件會先從問題領域中抽象出實體,然後使用封裝、繼承、多型這些特性來提高程式碼的重用性,擴充套件性等等特性…., 物件和物件之間是通過呼叫方法來運作的。
- 面向物件思想的特點?
封裝:
·對外隱藏複雜,暴露簡單的使用方法;
·提高程式碼重用性;
·隔離變化(下層程式碼變了,上層不影響);
·保護資料
繼承: 提高程式碼重用性;是多型的前提
多型:
·多型的前提--繼承
·多型的體現--向上轉型(任何向上轉型都體現了多型)
·多型的好處--提高程式碼擴充套件性
·多型的限制--向上轉型發生時,子類獨有的方法無法使用(唯一限制)
============================================================
方法過載: 在同一個類中,有多個方法同名,引數列表不同,構成方法過載。
引數列表的不同,指的是:數量 型別 順序的不同!
方法重寫: 在子類和父類中,出現了具有相同返回型別、相同方法名、相同引數列表的方法時,構成方法重寫! 比父類丟擲的異常範圍小,方法修飾詞範圍大於等於父類。
- final、finalize、finally的區別?
final修飾變數,必須初始化,初始化後不能被修改;
修飾方法,方法不能被重寫;
修飾類,類不能被繼承。
finalize(不是垃圾回收機制)當一個物件的引用次數為0時,該物件成為垃圾,gc(Java垃圾回收期)會在一個不確定時間將該物件回收,在即將回收之前,gc呼叫finalize方法,該方法用於釋放該物件佔的其他記憶體。
finally 用於try或者try catch 之後,finally中的程式碼都會執行(例外:守護執行緒中的try塊的finally未必執行)
守護執行緒:舉例:唐僧師徒--一旦唐僧死了,徒弟們就散夥了
main方法是主執行緒,一旦主執行緒main方法執行完畢,只剩守護執行緒了,守護執行緒就會停止。
- short s=1; s = s + 1; 對不對,如果錯,錯在哪裡?
錯 1預設是int型,int型和short型相加是int,不能放入short
Short s=1; s+=1; 這個沒錯,會強轉
- 描述你對抽象類的認識。
·Abstract修飾;
·不能被例項化;
·可以有抽象方法和普通方法;
·抽象方法就是被abstract修飾的方法,並且沒有方法體,只能存在於抽象類中;
·抽象類的抽象方法在非抽象子類中必須得以實現
·final不能修飾抽象類
·final、static不能修飾抽象方法
·抽象類的作用就是為了被子類繼承,提高程式碼重用性
- 描述你對介面的認識。
語法角度:
·介面的所有屬性預設被public static final修飾;
·所有方法預設被public abstract修飾(也都是必須的);
·介面沒有構造器;
·沒有構造程式碼塊;
·不能被例項化
作用角度
·完全解耦:任何一個實現A介面的類都能實現介面的方法,任何一個類都能實現A介面;
·統一訪問:介面的任何一個實現類都統一訪問介面的所有方法;
·提高程式碼擴充套件性:可以給介面增加任意多個實現類
- 抽象類與介面的區別?
語法角度:
- 抽象類受到單繼承的限制,介面不受單繼承的限制。
- 抽象類中既可以有抽象方法,又可以有普通方法; 介面中的方法只能是抽象方法。
- 抽象類可以有構造器,也能有構造程式碼塊,介面沒有構造器,沒有構造程式碼塊。
- 介面的屬性必須public static final,抽象類不用
- 介面的方法必須abstract ,抽象類不用
設計角度:
抽象類就是為了被子類繼承,從而提高程式碼的重用性,比如模板方法設計模式。
介面主要用於設計,主要的作用有:
·完全解耦
·統一訪問
·提高程式擴充套件性。
- 4種訪問修飾符的作用?
|
private |
預設 |
protected |
public |
同一類內 |
ok |
ok |
ok |
ok |
同一包內 |
|
ok |
ok |
ok |
不同包的子類 |
|
|
ok |
ok |
處處可用 |
|
|
|
ok |
- String和StringBuffer的區別?
string長度不可變 ,每次修改都會產生新的空間;
StringBuffer 長度可變,每次修改都是在原空間修改
- StringBuffer和StringBuilder的區別?
執行緒安全 不安全 都是長度可變字串
- error和exception的區別。
Err:程式錯誤,程式設計師不用處理;
exception:異常,可以處理恢復正常;
有共同父類throwable
- 執行時異常和檢查型異常的區別。
Run: 執行時異常不用處理 :在執行時才會報錯,編譯不報錯
Check:編譯時異常必須處理,throws丟擲異常和try-catch捕獲異常
- 寫出你見過的執行時異常(*)
NullPointerException - 空指標引用異常
ClassNotFoundException 類不存在異常
NoSuchMethodException 方法未找到異常
ClassCastException - 型別強制轉換異常。
IllegalArgumentException - 傳遞非法引數異常。
SQLException - SQL異常
IndexOutOfBoundsException - 下標越界異常
IOException - 輸入輸出流IO異常
NumberFormatException - 數字格式異常
- java如何進行異常處理?關鍵字throws,throw,try,catch,finally分別代表什麼意義?
Throws向上丟擲異常、try-catch就地捕獲異常
Throws用在方法上,後面可跟多個異常用逗號隔開;
Throw用在方法內,後面跟異常物件,只能跟一個;
Try後面可以跟多個catch,跟多個catch時,父類異常必須在子類異常之後,
finally中的程式碼肯定會執行,例外:守護執行緒中的try-catch-finally不一定
- 建立一個執行緒的方法。3種
·繼承Thread類並重寫run方法;
·實現runnable介面並重寫run方法;
·執行緒池:
固定數量3個執行緒工作,第其他的不會執行。
cache這種你有多少執行緒執行多少
執行緒執行完會把執行緒歸還到池子,過一段時間池子會把執行緒釋放。
如何處理高併發。(*)
使用群集nginx,負載均衡,多伺服器。
比如售票多開視窗,多臺電腦分散伺服器的壓力。
執行緒五狀態:新建、就緒、執行、阻塞、死亡
新建:新建一個執行緒,執行緒not alive
就緒:start()方法建立執行緒執行的系統資源,並排程執行緒執行run()方法。但是執行緒處於有資格執行,但沒有獲得執行許可權的等待狀態。執行緒 alive
執行:呼叫run()方法,執行緒alive
阻塞:如sleep()、wait() 等,執行緒alive
死亡:如stop()、執行緒run()方法執行完畢,執行緒not alive
JVM原理:
JVM是一個標準,一套規範, 規定了.class檔案在其內部執行的相關標準和規範。 及其相關的內部構成。 所有的JVM都是基於棧結構的執行方式。
java類的生命週期:
載入 、連線(驗證、準備、解析)、初始化,使用(物件初始化、垃圾回收、物件終結),解除安裝。
載入-- 獲取類的二進位制位元組流,將類中所代表的靜態儲存結構轉換為執行時資料結構, 最後,生成一個代表載入的類的java.lang.Class物件,
驗證-- 其目的就是保證載入進來的.class檔案不會危害到虛擬機器本身, 且內容符合當前虛擬機器規範要求, 其目的就是保證載入進來的.class檔案不會危害到虛擬機器本身, 且內容符合當前虛擬機器規範要求
準備-- 正式為類變數分配記憶體,並設定類變數的初始值。這些變數都會在方法區中進行分配。
解析--將常量池內的符號引用替換為直接引用的過程。主要針對類或介面、欄位、類方法、介面方法等。
初始化--載入的最後階段, 程式真正執行的開始。
使用--
(1)物件例項化:就是執行類中建構函式的內容,如果該類存在父類JVM會通過顯示或者隱示的方式先執行父類的建構函式,在堆記憶體中為父類的例項變數開闢空間,並賦予預設的初始值,然後在根據建構函式的程式碼內容將真正的值賦予例項變數本身,然後,引用變數獲取物件的首地址,通過操作物件來呼叫例項變數和方法。
(2)垃圾收集:當物件不再被引用的時候,就會被虛擬機器標上特別的垃圾記號,在堆中等待GC回收。
(3)物件的終結:物件被GC回收後,物件就不再存在,物件的生命也就走到了盡頭
類解除安裝 -- 最後一步,程式中不再有該類的引用,該類也就會被JVM執行垃圾回收,生命結束。
一個物件的建立大概需要經過以下幾步:
1`檢查對應的類是否已經被載入、解析和初始化;
2`類載入後,為新生物件分配記憶體;
3`將分配到的記憶體空間初始為0;
4`設定物件的關鍵資訊,比如物件的雜湊碼等;
5`然後執行 init 方法初始化物件。
執行緒池:
管理執行緒,避免建立大量的執行緒增加開銷(降低開銷);提高響應速度;
1
提交任務到執行緒池;
會先判斷當前執行緒數量是否小於corePoolSize,如果小於則建立執行緒來執行提交的任務;否則將任務放入workQueue佇列,如果workQueue沒滿則任務加入workQueue等待;
否則判斷當前執行緒數量是否小於maximumPoolSize ,如果小於則建立執行緒執行任務;
否則就會呼叫handler,以表示執行緒池拒絕接收任務。
- sleep()和wait()的區別是什麼
sleep()是thread的靜態方法;wait()是Object的方法,每個物件都有;
sleep()可用在任何地方;wait()只能用在同步塊中
sleep()只能釋放CPU,wait()能釋放CPU和佔的那個鎖
- 啟動一個執行緒是用run()還是start()? .
Run()不叫啟動,此方法是一個單執行緒
Start()啟動執行緒
- 你對java集合框架的理解?(介紹Collection框架的結構)
Collection |--List 有順序,能重複 |--ArrayList |--LinkedList |--Vector |--Stack 堆疊結構,先進後出,後進先出
|--Set 沒順序,不能重複 |--HashSet |--TreeSet |--LinkedHashSet 繼承自hashset |
Map |--HashMap 是HashSet的底層實現 |--TreeMap 是TreeSet的底層實現
|--LinkedHashMap 是LinkedHashSet的底層實現 |
去掉一個Vector集合中重複的元素
- 通過Vector.contains()方法判斷是否包含該元素,如果沒有包含就新增到新的集合Vector當中,用於資料較小的情況。
- 使用HashSet協助去重,把Vector存入HashSet.
- ArrayList和Vector的區別是什麼?
兩者底層都是陣列實現,陣列在記憶體連續存放,因為連續,查詢效率高,增刪效率低;
區別:ArrayList是執行緒不安全的; Vectort是執行緒安全的;
ArrayList每次放滿時增長為原來的一半;Vectort放滿時增長為原來的一倍
- ArrayList和LinkedList的區別是什麼?
ArrayList底層陣列實現,陣列在記憶體連續存放,因為連續,查詢效率高,增刪效率低;
LinkedList底層連結串列實現,連結串列在記憶體中是不連續,因為不連續,查詢效率低,增刪效率高
- Collection和Collections的區別是什麼?
Collection集合框架的父介面,其下有list和set
Collections集合框架的一個工具類,裡面都是靜態方法,sort()排序升序()list、reverse()翻轉集合元素、shuffle()隨機打亂集合元素。
- HashMap和Hashtable的區別是什麼?
HashMap:執行緒不安全;效率高;可用null作為鍵值和值;自JDK1.2引入的map實現;
Hashtable:執行緒安全;效率低;不能用null作為鍵值和值;繼承了陳舊的dictionary類(過時了),自jdk誕生就有
- List, Set, Map是否繼承自Collection介面
Map不是,map和collection並列關係,三者都是介面。
- List、Map、Set三個介面,存取元素時,各有什麼特點
List:能重複,有順序; list.add(); list.get();
Map(key value) 鍵值不能重複(鍵重複就會後蓋前),值可重複;
Set :不能重複,沒順序
25.HashSet和 TreeSet 的區別?
首先都是不能重複,無順序。
HashSet:
底層是HashMap雜湊表結構;
通過重寫HashCode()和 equals()方法保證元素的唯一性;
無序;
TreeSet:
底層是TreeMap 樹結構儲存;
通過實現Compareable介面並重寫其compareTo()方法來保證元素的唯一性;
有序;
25.HashMap和 TreeMap的區別?
執行緒都不安全
HashMap:底層結構散列表;適用於插入、刪除、查詢元素;速度快
TreeMap:底層結構紅黑樹;適用於自然排序、或自定義順序比遍歷鍵key;
25.Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?
Set裡,先調contains()方法,看裡面是否包含該元素,在比較
==是比地址,equals()是調元素的比較方法,要保證這個類重寫equals()方法
- 位元組流與字元流的區別
位元組流:一次最少讀取一個位元組;位元組流能操作任何檔案;
字元流:一次最少讀取一個字元;只能操作文字檔案;把讀到的字元編碼解碼;
不同碼錶字元佔的位元組不同,不能說以字元流一次至少讀取2個位元組。
- GC是什麼? 為什麼要有GC?
垃圾回收機制
沒有GC的話程式設計師得自己開闢空間,用完以後還得自己手動釋放空間,難免會造成記憶體洩漏,GC會幫助程式設計師在一個不確定時間回收掉閒置空間,減輕程式設計師負擔。
- 寫一個SingleTon出來 懶漢式 雙重檢查機制。
public class SingleTon{ private SingleTon(){ } //私有構造器 private static SingleTon st = null; // 私有靜態屬性 public static SingleTon getInstance(){ // 共有靜態方法獲得例項 if(st == null){ st=new SingleTon(); return st; } } } |
28.0 什麼是鎖synchronized
在java中,每一個物件都有一個內部鎖,如果以方法或程式碼塊用 synchronized 進行宣告,那麼物件的鎖將保護整個方法或程式碼塊,要呼叫這個方法或者執行這個程式碼塊,必須獲得這個物件的鎖。而且,任何時候都只能有一個執行緒物件執行被保護的程式碼.
- 寫一個可會產生的死鎖程式出來。 synchronized巢狀。
在以下程式碼中,線上程th1啟動後,他就獲得了a的鎖,同時當其休眠完畢,會申請獲得b的鎖,而此時,他的a鎖沒有放棄。
線上程th2啟動後,他就獲得了b的鎖,同時當其休眠完畢,會申請獲得a的鎖,而此時,他的b鎖沒有放棄。
兩方都握有自己的鎖不放棄,而同時申請另一方的鎖,所以,此時就造成了死鎖。
同步:同步的就是執行緒和物件,將執行緒和物件進行繫結,獲取物件的鎖。
package com.edu; //死鎖的實現 synchronized巢狀 // A類 class A { public void get() { System.out.println("A說:我開始啟動了,B,把你的資源給我,線上等。。。"); } public void say() { System.out.println("A獲得資源"); } } // ---------------------------- // B類 class B { public void get() { System.out.println("B說:我開始啟動了,A,把你的資源給我,線上等。。。"); } public void say() { System.out.println("B獲得資源"); } }
// 建立執行緒類--實現Runnable介面,重寫run方法 class MyThread implements Runnable { public static A a = new A(); public static B b = new B(); public boolean flag = false;
public void run() { if (flag) { synchronized (a) { a.get(); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); }
// a鎖沒有釋放,就獲得b鎖 synchronized (b) { // 此同步程式碼塊在另一同步程式碼塊裡 a.say(); } } } else { synchronized (b) { b.get(); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); }
// b鎖沒有釋放,就獲得a鎖 synchronized (a) { // 此同步程式碼塊在另一同步程式碼塊裡 b.say(); } } } } }
class Test { public static void main(String args[]) { MyThread t1 = new MyThread(); MyThread t2 = new MyThread();
t1.flag = true; t2.flag = false;
Thread th1 = new Thread(t1); Thread th2 = new Thread(t2); th1.start(); th2.start(); } }
|
- 什麼是套接字,套接字的工作原理是什麼?
- 建立伺服器
- 建立一個客戶端去連線伺服器
- 雙方連線上之後,開啟資料流(輸出流 輸入流)
- 雙方通過資料流交換資料
- 關閉流
- 關閉套接字
- HTTP底層原理?
超文字傳輸協議,可以傳遞各種型別的檔案,是使用最廣泛的協議模式.
- 連線:Web瀏覽器與Web伺服器建立連線,開啟一個稱為socket(套接字)的虛擬檔案,此檔案的建立標誌著連線建立成功。
- 請求:Web瀏覽器通過socket向Web伺服器提交請求。GET或POST
- 響應:Web瀏覽器提交請求後,通過HTTP協議傳送給Web伺服器。Web伺服器接到後,進行事務處理,處理結果又通過HTTP傳回給Web瀏覽器
- 關閉連線 :當應答結束後,Web瀏覽器與Web伺服器必須斷開,以保證其他Web瀏覽器能夠與Web伺服器建立連線。
31、http、https 等 常用預設埠號
HTTP伺服器,預設的埠號為80/tcp(木馬Executor開放此埠);
HTTPS(securely transferring web pages)伺服器,預設的埠號為443/tcp 443/udp;
⑴. HTTP協議代理伺服器常用埠號:80/8080/3128/8081/9080
⑵. SOCKS代理協議伺服器常用埠號:1080
⑶. FTP(檔案傳輸)協議代理伺服器常用埠號:21
⑷. Telnet(遠端登入)協議代理伺服器常用埠:23
SQL部分
0、新增外來鍵:
- 事務:恢復和併發控制的基本單位
4大特性:
·原子性 :事務是資料庫邏輯工作單元,事務包括的所有操作,要麼都做,要麼都不做。
·一致性 :事務執行的結果是使資料庫從一個一致性狀態變成另一個一致性狀態。一致性與原子性是密切相關的。
·永續性 :一個事務一旦提交,它對資料庫中資料的改變應該是永久性的
·隔離性 :一個事務的執行不能被其他事務干擾。
事務的四種隔離級別:
Read uncommitted(未授權讀取、讀未提交)
Read committed(授權讀取、讀已提交)
Repeatable read(可重複讀)
Serializable(序列化)
- 高階查詢
- 分組查詢
- 內連結
- 外連線
- 子查詢
- 觸發器的作用?
監聽增刪改動作,不能監聽查詢,監聽時分為監聽前和監聽後。
- 什麼是檢視?
簡化複雜的sql語句(封裝sql語句)
許可權問題(只查某幾個列的許可權)
- 什麼是遊標?
遊標專門一行一行地操作結果集的!
(按條件修改:必須用遊標)
修改員工的工資,工資低於1000的加500,工資高於3000的減100,其餘的不變。這類問題必須用遊標。
- 什麼是儲存過程?
封裝PL程式碼
- NULL表示什麼?如何以NULL作為條件?
不知道, where sex is NOT NULL / IS NULL
- 什麼是主鍵?什麼是外來鍵?
主鍵:唯一標緻表中每行資料(不能重複,非空 一張表可以有一個主鍵)。
外來鍵:外來鍵列依賴於外表的主鍵(一張表可以有無數個外來鍵)。
- 什麼是相關子查詢? 0 子查詢的條件使用到了外表的列的值
- 什麼是索引,索引有什麼作用?
索引就是一種排序結構。
索引的作用:就是為了提高查詢速度。
- 聯合主鍵的作用是什麼?
把一個主鍵同時加在多個列上,還是一個主鍵。
作用:確定一條記錄的唯一性。
12.手寫ajax原生程式碼
流程:
1.建立XMLHttpRequest物件
2.指定響應函式
3.開啟連線(指定請求)
4.傳送請求
5.建立響應函式
var req= XMlHttpRequest( ); //宣告一個變數,用來例項化XMLHttpRequest物件
req.open(“get”,”….”); // 開啟連線(指定請求)
req.onreadystatechange=function() { // 指定-建立響應函式StateChange
if(req.status == 200 && req.readyState==4) {
//… 修改dom樹
}