java-3年面試總章:解決面試中的問題

java-3年面試總章:解決面試中的問題

面試官想問的問題

  1. 你說一下對線程的理解。
  2. 你說一下多線程開發。
  3. 你給我講解一下JWT的優勢。
  4. 你講解一下shiro開發。

分析面試官問題。

  1. 你要明白面試官要考察什麼?這個非常重要。比如說面試官問:你講解一下創建線程的方式。

你回答的時候就要先說出有哪些創建線程的方式。既然他問了這麼一個問題,說明裏面肯定有一些注意點。你一定要把哪些注意點說出來。就ok了。

面試題:

  1. 創建線程的三種方式

創建類A繼承Thread類,重寫Thread中的run()方法。

使用方法:

實例化類A。調用類A的start()方法。

注意點:調用start()方法,和直接調用實例run()方法的不同。調用start()方法相當於多線程調用。當直接調用run()方法時,會執行完run()方法後,纔會向下執行。

  1. 創建線程的第二種方式

創建類A實現Runable接口,重寫Runable接口中的run()方法。

使用方法:

Runable裏面沒有start()方法。還得需要實例化一個Thread,並且包裝類A。執行的時候也是通過Thread對象調用start()方法。

注意點:Runable是一個接口,接口裏面沒有實現方法。需要重新實例化Thread才能調用。

  1. 創建線程的第三種方式:

創建類A實現Callable接口。並重寫call()方法。Callable接口帶有一個泛型。

使用方法:

實例化實現類A,但是無法直接獲取返回值,需要使用FutureTask<V>在外部封裝一下再獲取返回值。此外因爲Runable是個接口,需要start()方法。因此需要實例化Thread類,然後包裝FutureTask類。開啓線程。

注意點:Runable是一個接口,需要Thread實例化包裝。Runable無法接收返回值,需要FutureTask<V>進行包裝。

java線程池的創建

  1. 線程池的創建一般有兩種方式

使用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個。

  1. 線程池創建的第二種方式:Exectors

Executor大約有10個構造方法。

1、newCachedThreadPool:創建一個可以根據需要創建新線程的線程池,如果有空閒,優先使用空閒線程。

2、newFixedThreadPool:創建一個固定大小的線程池,在任何時候,最多隻有N個線程在處理任務。

3、newSheduledThreadPool:能延遲執行,定時執行的線程池。

4、newWorkStealingPool:工作竊取,使用多個隊列來減少競爭。

注意點: 允許的創建線程數量爲Integer.MAX_VALUE,可能會創建大量線程,從而導致OOM

面試中的sql問題:

  1. mysql語句中使用#{}取值和${}取值有什麼不同。

使用${}會有一個問題,當取得字符串類型的值時,沒有加單引號。黑客可以

code = “1233 or code=456” password=“2123”:

select * from user where code=‘123’ or code=‘456’ and password=‘2123’ 進行攻擊。

而使用#號,黑客就無法使用這樣的攻擊。

  1. 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的區別

  1. where和having都可以做條件查詢,但是having做條件查詢時,select裏面必須包含having條件查詢的字段,否則查不出來。這也是只可以使用where,不可以使用having的情況。
  2. where中的條件是數據表中的字段,而having中的條件是select後面必須出現的字段。如果select後面出現avg()函數where 對avg()做條件篩選,會報錯,having就不會。
  3. having是先分組,再過濾。having可以使用組函數,但是效率沒有where高。

java常用的五大包

  1. java常用的包有:

1、java.lang.*

2、java.util.*

3、java.io.*

4、java.net.*

5、java.sql.*

  1. java常見的異常

1、java.lang.NullPointerException空指針異常。

2、java.lang.ClassNotFoundException指定類型不存在異常

3、java.lang.ArrayIndexOutOfBoundsException數組越界異常。

4、java.lang.StackOverflowError:堆棧過深異常。

5、java.lang.ArithmeticException:數組運算異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章