java-3年面試總章:解決面試中的問題
面試官想問的問題
- 你說一下對線程的理解。
- 你說一下多線程開發。
- 你給我講解一下JWT的優勢。
- 你講解一下shiro開發。
分析面試官問題。
- 你要明白面試官要考察什麼?這個非常重要。比如說面試官問:你講解一下創建線程的方式。
你回答的時候就要先說出有哪些創建線程的方式。既然他問了這麼一個問題,說明裏面肯定有一些注意點。你一定要把哪些注意點說出來。就ok了。
面試題:
- 創建線程的三種方式
創建類A繼承Thread類,重寫Thread中的run()方法。
使用方法:
實例化類A。調用類A的start()方法。
注意點:調用start()方法,和直接調用實例run()方法的不同。調用start()方法相當於多線程調用。當直接調用run()方法時,會執行完run()方法後,纔會向下執行。
- 創建線程的第二種方式
創建類A實現Runable接口,重寫Runable接口中的run()方法。
使用方法:
Runable裏面沒有start()方法。還得需要實例化一個Thread,並且包裝類A。執行的時候也是通過Thread對象調用start()方法。
注意點:Runable是一個接口,接口裏面沒有實現方法。需要重新實例化Thread才能調用。
- 創建線程的第三種方式:
創建類A實現Callable接口。並重寫call()方法。Callable接口帶有一個泛型。
使用方法:
實例化實現類A,但是無法直接獲取返回值,需要使用FutureTask<V>在外部封裝一下再獲取返回值。此外因爲Runable是個接口,需要start()方法。因此需要實例化Thread類,然後包裝FutureTask類。開啓線程。
注意點:Runable是一個接口,需要Thread實例化包裝。Runable無法接收返回值,需要FutureTask<V>進行包裝。
java線程池的創建
- 線程池的創建一般有兩種方式
使用ThreadPoolExecutor類進行創建線程池。
ThreadPoolExecutor的構造函數最多有七個參數。總共有四個構造函數
1、corePoolSize:線程池的核心線程數。
2、maximumPoolSize:線程池的最大線程數。
3、keepAliveTime:線程池空閒時線程的存活時間。
4、unit:線程存活時長單位,結合上個參數使用。
5、workQueue:存放任務的隊列,使用的是阻塞隊列。在這個方6、threadFactory:線程池創建線程的工廠。
7、handler:在隊列和線程池達到最大線程數,都滿時,仍熱有任務的情況下的處理方式。
第一個構造方法,包含1,2,3,4,5,前5個參數。
第二個構造方法:包含1,2,3,4,5,6前6個參數。
第三個構造方法:包含1,2,3,4,5,7,參數。
第四個構造方法:包含所有參數。7個。
- 線程池創建的第二種方式:Exectors
Executor大約有10個構造方法。
1、newCachedThreadPool:創建一個可以根據需要創建新線程的線程池,如果有空閒,優先使用空閒線程。
2、newFixedThreadPool:創建一個固定大小的線程池,在任何時候,最多隻有N個線程在處理任務。
3、newSheduledThreadPool:能延遲執行,定時執行的線程池。
4、newWorkStealingPool:工作竊取,使用多個隊列來減少競爭。
注意點: 允許的創建線程數量爲Integer.MAX_VALUE,可能會創建大量線程,從而導致OOM
面試中的sql問題:
- mysql語句中使用#{}取值和${}取值有什麼不同。
使用${}會有一個問題,當取得字符串類型的值時,沒有加單引號。黑客可以
code = “1233 or code=456” password=“2123”:
select * from user where code=‘123’ or code=‘456’ and password=‘2123’ 進行攻擊。
而使用#號,黑客就無法使用這樣的攻擊。
- mysql的優化方案:
1、mysql經過查詢後,會生成一個緩存。當下次查的時候,就很快返回來了。但是當sql語句裏面有一些函數時,無法使用緩存。例如:NOW(),CURDATE()等函數。不會生成緩存。儘量不要使用函數,可以傳過來一個值。
2、使用explain關鍵字分析你的查詢語句或是表結構的性能瓶頸。
3、當只要一行數據時,使用limit 1提高查詢效率,有了limit 1當數據庫查詢出來1條數據後,就不會再查詢了。
4、爲搜索字段添加索引。(這個字段經常用來做搜索)
1、唯一性太差的字段,不適合建索引。2、更新太頻繁不適合建索引。3、不會出現在where條件中的字段不適合建索引,4、頻繁使用的字段適合建索引。
5、爲join字段添加索引。
6、不要使用select *
7、能使用ENUM類型的就不使用varchar字段
8、把ip地址存成UNSIGNED int(10)10位就行,可以使用inet_aton()函數將ip轉數字,inet_ntoa()數字轉ip
where 和having的區別
- where和having都可以做條件查詢,但是having做條件查詢時,select裏面必須包含having條件查詢的字段,否則查不出來。這也是只可以使用where,不可以使用having的情況。
- where中的條件是數據表中的字段,而having中的條件是select後面必須出現的字段。如果select後面出現avg()函數where 對avg()做條件篩選,會報錯,having就不會。
- having是先分組,再過濾。having可以使用組函數,但是效率沒有where高。
java常用的五大包
- java常用的包有:
1、java.lang.*
2、java.util.*
3、java.io.*
4、java.net.*
5、java.sql.*
- java常見的異常
1、java.lang.NullPointerException空指針異常。
2、java.lang.ClassNotFoundException指定類型不存在異常
3、java.lang.ArrayIndexOutOfBoundsException數組越界異常。
4、java.lang.StackOverflowError:堆棧過深異常。
5、java.lang.ArithmeticException:數組運算異常。