一.面向對象的三大特性
1.封裝:將對象內部的屬性私有化,外部對象不能夠直接訪問,但是可以提供一些可以使外部對象操作內部屬性的方法。
2.繼承:類與類之間會有一些相似之處,但也會有一些異處,使得他們與眾不同,繼承就是在父類的基礎上,創建一個與父類有相同之處,但是也可以聲明自己獨有的方法與屬性的對象,這樣做可以增加代碼的復用,使得維護或擴展更加的方便,靈活。
3.多態:一個對象有多種狀態,這涉及到了向上或向下轉型。
多態的特點:
- 對象類型和引用類型之間存在繼承關系
- 引用類型變量的方法屬于哪個類,要想知道這個問題,要看運行期間
- 多態不能執行子類擁有但父類沒有的方法
- 如果子類重寫了父類的方法,那么直接執行的是子類重新后的方法,若沒重寫,則執行的是父類方法
二.如何創建線程
1.繼承Thread類并重寫run()方法
- 定義Thread類的子類,并重寫run()方法,run()方法中的代碼就是線程所要執行的任務,所以run()方法被稱為執行體(線程體)
- 創建Thread類的子類的實例對象,就是創建了線程的對象
- 調用線程對象的start()方法來啟動該線程
- Java不支持多繼承
package thread;public class ThreadTest extends Thread{String name;ThreadTest(String name){this.name=name;}@Overridepublic void run() {System.out.println("this is a thread");}
}
class StartTest{public static void main(String[] args) {ThreadTest test=new ThreadTest("thread");test.start();}
}
2.實現Runnable接口配合Thread
- 定義Runnable接口的實現類,并重寫run()方法,run()方法中的代碼就是線程所要執行的任務,所以run()方法被稱為執行體(線程體)
- 創建Runnable接口的實現類的對象,使此對象作為Thread的target來創建Thread對象,這個對象才是真正的線程對象
- 調用線程對象的start()方法來啟動線程
- Runnable接口支持多繼承
package thread;public class RunnableTest implements Runnable{String name;RunnableTest(String name){this.name=name;}@Overridepublic void run() {System.out.println("this is a thread");}
}
class RunnableStartTest{public static void main(String[] args) {RunnableTest test=new RunnableTest("thread");Thread thread=new Thread(test);thread.start();}
}
3.通過Callable和FutureTask創建線程
- 創建Callable接口的實現類,并重寫call()方法,call方法是線程的執行體
- 創建Callable接口的實現類的實例,然后創建包裝了Callable接口的實現類實例的FutureTask類的實例對象,FutureTask對象封裝了實現類中的call()方法的返回值(FutureTask是一個包裝器,它通過包裝Callable接口的實現類來實現,它同時實現了Future和Runnable兩個接口)
- 使用FutureTask對象作為Thread的target來創建實例,此實例對象為線程的對象
- 調用線程對象的start()方法來啟動線程
- 調用FutureTask對象的get()方法來獲取子線程結束的返回值
package thread;import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;public class CallableAndFutureTaskTest implements Callable {String name;CallableAndFutureTaskTest(String name){this.name=name;}@Overridepublic Object call() throws Exception {System.out.println("this is a thread");return null;}
}
class CallableAndFutureTaskStartTest{public static void main(String[] args) throws Exception{CallableAndFutureTaskTest test=new CallableAndFutureTaskTest("thread");FutureTask futureTask=new FutureTask(test);Thread thread=new Thread(futureTask);thread.start();String result=(String) futureTask.get();System.out.println(result);}
}
三.事務的四大特性(ACID)
1.原子性:事務是最小的執行單位,確保了動作要么完全完成,要么就是完全不起作用
2.一致性:處理的數據是一致的,例如轉賬者和收款者的總金額是不變的
3.隔離性:發生并發訪問數據庫時,一個事物不會被另一個事物所影響
4.持久性:一個事務提交之后,他對數據庫中數據的影響是持久的,即使出現了數據庫障礙也不會影響。
四.Get()方法與Post()方法的區別
Get()方法和Post()方法是Http協議中兩種常用的請求方法,但是在不同的場景和目的下的使用是不同的。
1.在語義上:Get()方法用于獲取和查詢資源,而Post()方法更加偏向于修改或創建。這就意味著Get請求擁有等冪性。而Post()方法可能會有副作用,即每次執行都可能產生不同的結果,影響資源的狀態。
2.在結構上:Get()方法的請求的參數傳遞會顯示到url上,形成查詢字符串(querystring),而Post()方法的參數在執行體(body)中,Get請求的查詢字符串長度會受到url的限制,而Post請求則不會有明確的限制。
3.在緩存上:由于Get請求是等冪的,所以對于Get請求來說,在瀏覽器中會有緩存來保存數據,這樣可以提高Get()方法的獲取或查詢的效率;而Post請求可能會有副作用,所以并沒有緩存機制。
4.在安全性上:本質上Get請求和Post請求都不是絕對安全的,因為Http協議都是明文傳輸,無論是url,header或者是body都有可能被竊取,所以應該使用Http協議加密傳輸數據。但是在一些應用場景下,Get方法要比Post方法更加不安全,因為Get方法的參數傳遞會在url上顯示出來,在一些代理日志上或者瀏覽器的歷史上可以被找到,所以在傳輸一些私密數據的時候應該使用Post方法進行傳遞。
五,數據庫(MySQL)的左,右連接以及內連接
1.Left join...on:左連接,以左表為基礎,查詢左表的所有數據以及滿足on關鍵字后面的條件的右表數據,左連接又稱左外連接,是外連接的一種。
2.Right join...on:右連接,以右表為基礎,查詢右表的所有數據以及滿足on關鍵字后面的條件的左表數據,右連接又稱為右外連接,是外連接的一種。
3.Inner join...on:內連接,以左右兩表為參考對象,查詢左右兩表同時滿足on關鍵字后面的條件的數據。
MySQL中沒有全外連接,所以就不解釋了。
首先創建了兩個表table_left和table_right.
---------------------------------------------------------------------------------------------------------------------------------
左連接:
SELECT * FROM table_left LEFT JOIN table_right ON table_left.id=table_right.id
結果:
右連接:
SELECT * FROM table_left RIGHT JOIN table_right ON table_left.id=table_right.id
結果:
內連接:
SELECT * FROM table_left INNER JOIN table_right ON table_left.id=table_right.id
結果:
---------------------------------------------------------------------------------------------------------------------------------總結一下,這就相當于一個集合A和B
A left B join:A
A right B join:B
A inner B join:A∩B
左連接:
右連接:
內連接:
全連接:
六.數據庫分表查詢中使用到的in關鍵字可以使用什么代替
一般在做SQL優化的時候講究使用EXISTS帶替代IN的做法,理由是EXISTS執行效率要比IN高。
個人理解:
IN表示范圍,指某一字段在某一范圍之內,這個范圍一般使用子查詢來獲取,由此可知IN子查詢返回的結果應該就是這個范圍集。
EXISTS表示存在,指至少存在一處,這個條件由EXISTS子查詢來完成,但是在這里EXISTS子查詢返回的結果卻不再是一個結果集,而是一個布爾值(true或false),其實這個挺好理解的,EXISTS就表示如果子查詢能查到值則返回true,則執行EXISTS之前的語句。
具體MySQl的詳細介紹請看:MySQL數據庫的詳細介紹
---------------------------------------------------------------------------------------------------------------------------------以上問題都是面試官真實問的面試題,回答的一坨,在事后查詢資料加個人理解寫的blog,有錯誤之處還請多包容。