恆生電子java實習筆/面試總結(更新其他小公司)

嘗試着像大佬一樣來寫寫總結。恆生筆試不難,編程就是冒泡排序和字符串處理。但是數據庫因爲沒怎麼看,估計要涼。下面就碰到的問題說一說。

1.Thread類的常用方法:

2.創建數據庫、表、索引

CREATE DATABASE 數據庫名稱

CREATE TABLE Person ( LastName varchar(30), FirstName varchar, Address varchar, Age int(3) )

CREATE INDEX PersonIndex ON Person (LastName)

3.查找Linux下指定內容(yk的txt文件)

find ./ -name “*.txt” -exec grep -l “yk” {} \ ;(ls -d只能列出目錄下文件)

 

再回顧下6.23日的面試:

第一次參加面試,緊張的不行,前後就問了三個技術問題,其它在聊天(可能已經被拒),總結如下:

1.hashmap、hashtable區別:

a、HashMap是線程不安全的,在多線程環境下會容易產生死循環,但是單線程環境下運行效率高;Hashtable線程安全的,很多方法都有synchronized修飾,但同時因爲加鎖導致單線程環境下效率較低。

b、HashMap允許有一個key爲null,允許多個value爲null;而Hashtable不允許key或者value爲null。

一般我這種新手可以這樣回答,但還是要從源碼來談更好。

 

2.springmvc加載啓動過程:

a.用戶發送請求至前端控制器DispatcherServlet。
b.DispatcherServlet收到請求調用HandlerMapping處理器映射器。
c.處理器映射器找到具體的處理器(可以根據xml配置、註解進行查找),生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
d.DispatcherServlet調用HandlerAdapter處理器適配器。
e.HandlerAdapter經過適配調用具體的處理器(Controller,也叫後端控制器)。
f.Controller執行完成返回ModelAndView。
g.HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
h.DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
i.ViewReslover解析後返回具體View.
j.DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
k.DispatcherServlet響應用戶。

 

3.sleep()和wait()的區別:

a.sleep() 是 Thread 類的靜態本地方法;wait() 是Object類的成員本地方法
b.sleep() 方法可以在任何地方使用;wait() 方法則只能在同步方法或同步代碼塊中使用,否則拋出異常Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
c.sleep() 會休眠當前線程指定時間,釋放 CPU 資源,不釋放對象鎖,休眠時間到自動甦醒繼續執行;wait() 方法放棄持有的對象鎖,進入等待隊列,當該對象被調用 notify() / notifyAll() 方法後纔有機會競爭獲取對象鎖,進入運行狀態
d.JDK1.8 sleep() wait() 均需要捕獲 InterruptedException 異常

 

願所有善良的人被這個世界溫柔以待~

 

6.24接着更新,面了兩個小公司,都問到了java線程池的問題,需要引起注意。另外的問題總結如下:

1.java線程池

優點:併發線程數很多,而且一半都是執行一個短任務就結束了,這樣頻繁創建銷燬線程會大大降低系統的效率。因此可以使用線程池,即執行完一個任務,並不被銷燬,而是放在一個池子中以備後續使用。

java.uitl.concurrent.ThreadPoolExecutor類是線程池中最核心的一個類,繼承了AbstractExecutorService抽象類,實現了ExecutorService接口。

Executor是一個頂層接口,在它裏面只聲明瞭一個方法execute(Runnable),返回值爲void,參數爲Runnable類型,從字面意思可以理解,就是用來執行傳進去的任務的;然後ExecutorService接口繼承了Executor接口,並聲明瞭一些方法:submit、invokeAll、invokeAny以及shutDown等;抽象類AbstractExecutorService實現了ExecutorService接口,基本實現了ExecutorService中聲明的所有方法;然後ThreadPoolExecutor繼承了類AbstractExecutorService。

ThreadPoolExecutor重要方法:execute()、submit()、shutdown()等等

一個網上的例子:

假如有一個工廠,工廠裏面有10個工人(核心線程數),每個工人同時只能做一件任務。

  因此只要當10個工人中有工人是空閒的,來了任務就分配給空閒的工人做;

  當10個工人都有任務在做時,如果還來了任務,就把任務進行排隊等待(workqueue工作隊列);

  如果說新任務數目增長的速度遠遠大於工人做任務的速度,那麼此時工廠主管可能會想補救措施,比如重新招4個臨時工人進來;

  然後就將任務也分配給這4個臨時工人做;

  如果說着14個工人(最大核心線程數)做任務的速度還是不夠,此時工廠主管可能就要考慮不再接收新的任務或者拋棄前面的一些任務了。

  當這14個工人當中有人空閒時,而新任務增長的速度又比較緩慢,工廠主管可能就考慮辭掉4個臨時工了,只保持原來的10個工人,畢竟請額外的工人是要花錢的。

任務提交給線程池之後的處理策略,這裏總結一下主要有4點:

  • 如果當前線程池中的線程數目小於corePoolSize,則每來一個任務,就會創建一個線程去執行這個任務;
  • 如果當前線程池中的線程數目>=corePoolSize,則每來一個任務,會嘗試將其添加到任務緩存隊列當中,若添加成功,則該任務會等待空閒線程將其取出去執行;若添加失敗(一般來說是任務緩存隊列已滿),則會嘗試創建新的線程去執行這個任務;
  • 如果當前線程池中的線程數目達到maximumPoolSize,則會採取任務拒絕策略進行處理;
  • 如果線程池中的線程數量大於 corePoolSize時,如果某線程空閒時間超過keepAliveTime,線程將被終止,直至線程池中的線程數目不大於corePoolSize;如果允許爲核心池中的線程設置存活時間,那麼核心池中的線程空閒時間超過keepAliveTime,線程也會被終止

拒絕策略圖示(默認爲AbortPolicy)

2.java多態

多態是同一個行爲具有多個不同表現形式或形態的能力。

多態就是同一個接口,使用不同的實例而執行不同操作

虛函數的存在是爲了多態。Java 中其實沒有虛函數的概念,它的普通函數就相當於 C++ 的虛函數,動態綁定是Java的默認行爲。如果 Java 中不希望某個函數具有虛函數特性,可以加上 final 關鍵字變成非虛函數。(虛函數主要能實現父子類方法的一個調用轉換)

方式一:重寫:

詳細可查看:Java 重寫(Override)與重載(Overload)

方式二:接口

  • 1. 生活中的接口最具代表性的就是插座,例如一個三接頭的插頭都能接在三孔插座中,因爲這個是每個國家都有各自規定的接口規則,有可能到國外就不行,那是因爲國外自己定義的接口類型。

  • 2. java中的接口類似於生活中的接口,就是一些方法特徵的集合,但沒有方法的實現。具體可以看 java接口 這一章節的內容。

方式三:抽象類和抽象方法

3.mysql爲什麼使用b+樹索引

答:減少磁盤io:一層節點就意味着一次磁盤io,而b樹節點有數據,io慢;紅黑樹io過多,b+樹則很適合,而且b+樹所有節點都用鏈表連接起來,更加容易進行區域查詢。而且每個數據查詢效率相當(穩定)

 

6.28上午 衡泰軟件初試:

1.單例模式 雙重校驗鎖

懶漢:要用了再實例化;餓漢:馬上實例化;

雙重校驗鎖:第一個鎖使大部分情況無需運行,提升效率;第二個鎖防止多個對象的出現。

 

2.類加載機制

加載-驗證-準備-解析-初始化-使用-卸載

加載階段完成後,虛擬機外部的二進制字節流就按格式存在方法區,之後便是連接階段的第一步-驗證。爲了保證代碼安全,驗證階段會進行四個階段:文件格式、元數據、字節碼與符號引用。其中字節碼驗證最爲複雜,此時將對類的方法體進行校驗分析,保證被校驗類的方法在運行時不會做出危害JVM安全的事件。
接下來的準備階段是正式爲類變量分配內存並設置初始值,這些內存都在方法區分配(僅分配類變量而非實例變量);之後是解析階段,該階段是虛擬機將常量池內的符號引用替換爲直接引用的過程;
初始化階段:到了這階段,才真正開始執行類中定義的Java程序代碼

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