圓通快遞面試問題

1、Java中線程池包含了那些參數?各參數的作用是什麼?(ThreadPoolExecutor)
比如去火車站買票, 有10個售票窗口, 但只有5個窗口對外開放. 那麼對外開放的5個窗口稱爲核心線程數, 而最大線程數是10個窗口.
如果5個窗口都被佔用, 那麼後來的人就必須在後面排隊, 但後來售票廳的人會越來越多, 已經人滿爲患, 就類似於線程隊列已滿.
這時候火車站站長下令, 把剩下的5個窗口也打開, 也就是目前已經有10個窗口同時運行. 後來又來了一批人,10個窗口也處理不過來了,
而且售票廳人已經滿了, 這時候站長就下令封鎖入口,不允許其他人再進來, 這就是線程異常處理策略.而線程存活時間指的是,
允許售票員休息的最長時間, 以此限制售票員偷懶的行爲。
ThreadPoolExecutor mExecutor = new ThreadPoolExecutor(corePoolSize,// 核心線程數
maximumPoolSize, // 最大線程數
keepAliveTime, // 閒置線程存活時間
TimeUnit.MILLISECONDS,// 時間單位
new LinkedBlockingDeque(),// 線程隊列
Executors.defaultThreadFactory(),// 線程工廠
new AbortPolicy()// 隊列已滿,而且當前線程數已經超過最大線程數時的異常處理策略
);

2、BIO、NIO和AIO的區別和使用場景述一下?
IO:面向流
BIO:同步阻塞
NIO:面向緩衝,同步非阻塞,流同時具備讀和寫的功能。高併發(萬人聊天)
AIO:異步非阻塞,異步IO的縮寫

有一個燒水的案例:
假設有一個場景,有一排水壺在燒水
BIO:叫一個線程停留在一個水壺那,直到這個水壺燒開,纔去處理,文件的上傳和下載。
NIO:叫一個線程不停的循環觀察每一個水壺,根據每個水壺當前的狀態去處理,高併發的聊天工具,頻繁的交換數據,但是數據量很小。
AIO:每個水壺上裝一個開關,當水開了以後會提醒對應的線程去處理。
由此可見AIO是最智能的,NIO相對省力,BIO最愚蠢,勞動力低下。

3、HashMap、HashTable的區別?
(1).HashMap:線程不安全效率高的,鍵值可以爲null。
(2).Hashtable:線程安全效率低的,查看源碼發現內部是通過sychronized實現的,而且鍵值不能爲null。
(3).多線程環境下,通常用HashMap和Collections工具類一起使用實現線程安全,下面有介紹。
(4)HashMap的key、value值均可爲null,Hahtable的key、value值均不可爲null
但兩者的的key值均不能重複,若添加相同key的鍵值對,後面的value會自動覆蓋前面的value,
但不會報錯。

4、ArrayList、Vector、LinkedList的區別?
Vector和ArrayList本質都是用數組實現的,而LinkList是用雙鏈表實現的。
Vector是線程安全的,ArrayList是線程不安全的。
擴容:擴容的代價很高,所以能確定容量範圍時儘量指定
注意:只有ArrayList和Vector可以指定。

5、說說對Volatile關鍵字的理解?
1、內存可見性,即線程A對volatile變量的修改,其他線程獲取的volatile變量都是最新的。
2、可以禁止指令重排序。
那麼什麼是指令重排序?–爲了儘可能減少內存操作速度遠慢於CPU運行速度所帶來的CPU空置的影響,虛擬機會按照自己的一些規則將程序編寫順序打亂。

6、Spring中FactoryBean和BeanFactory有什麼區別?
https://blog.csdn.net/cap423654/article/details/81591980
首先,這倆都是個接口;
實現 BeanFactory 接口的類表明此類事一個工廠,作用就是配置、新建、管理各種Bean。
而 實現 FactoryBean 的類表明此類也是一個Bean,類型爲工廠Bean(Spring中共有兩種bean,一種爲普通bean,另一種則爲工廠bean)。
顧名思義,它也是用來管理Bean的,而它本身由spring管理。

7、說說對IOC和AOP的理解?
Spring的核心主要包括IOC和AOP;
內部最核心的是IOC,即控制反轉,就是將一個對象的創建反轉給Spring框架來完成,主要實現方式是在Spring的xml配置文件的bean標籤中來
配置創建對象和調用對象的方法。其中用到的是Java裏面的反射技術,在運行時動態的去創建和調用對象。
其次還有一個核心內容是AOP,即面向切面編程,就是在調用某一類對象的具體方法的前後去調用你指定的模塊,從而達到對一個模塊擴充的功能,
這些都是通過在配置文件中配置來完成的。
其中包含兩個重要的概念:靜態代理和動態代理。
靜態代理就是針對於某個類或者接口編寫一個代理類;動態代理是針對於一個方面,利用JDK反射包中的Proxy類爲各種接口動態生成代理類。
Spring目的:就是讓對象與對象(模塊與模塊)之間的關係不是通過代碼來關聯的,而是通過配置文件來說明管理的,Spring是一個容器,
只有在容器裏的對象纔會有Spring所提供的這些服務和功能。

8、JDK各個版本的新特性jdk1.8-jdk9(每個版本至少寫2條新特性)
1、新增default關鍵字
2、新增Lambda表達式,這意味着java也開始承認了函數式編程。
3、對Date Api進行更新  
jdk1.9新特性:
1、模塊化系統
2、集合工廠方法
3、接口中的私有方法
4、響應式流

9、動態代理有幾種實現方式?分別是什麼?有什麼區別?
1、jdk動態代理 創建接口,實現類,主類中使用Proxy調用newProxyInstance方法。
2、cglib動態代理 調用CglibProxy對象。
兩者區別:jdk動態代理基於接口,cglib基於類即可。
https://www.cnblogs.com/wenming205/p/7600388.html

10、final、finalize、finally有什麼區別?
在java中,final可以用來修飾類,方法和變量;
finally只能用在try/catch語句中,並且附帶一個語句塊,表示這段語句最終一定會被執行,經常被用在需要釋放資源的情況下。
finalize()是在Object對象中定義的,這個方法在gc啓動,該對象被回收的時候被調用。其實gc可以回收大部分的對象,
所以一般是不需要程序員去實現finalize的。

11、有表t_student,包含score字段,如何查出分數最高的前1000名學生?
請寫出相關SQL,注意SQL性能。
ALTER TABLE t_student ADD INDEX score (column)
SELECT * FROM t_student ORDER BY score DESC LIMIT 0,1000;

12、有一個整型數組[a,b,c,d,e],根據數組元素大小並以a<=b>=d<=c>=e格式輸出,舉列:數組
[1,5,3,4,7,5],輸出如:1<=4>=3<=7>=5<=5,請寫出相關算法代碼。
// 第二種方法
public static void method2(int[] array) {
// 直接按0,2,1,4,3,6,5,8,7…的順序排序
for (int i = 0; i < array.length; i = nextIndex(i)) {
for (int j = nextIndex(i); j < array.length; j = nextIndex(j)) {
if (array[i] > array[j]) {
int c = array[i];
array[i] = array[j];
array[j] = c;
}
}
}
}

public static int nextIndex(int i) {
return i == 0 ? i + 2 : (i % 2 == 0 ? i - 1 : i + 3);
}

13、Post和get的區別?
1、get是從服務器上獲取數據,post是向服務器傳送數據。
2、get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,一般被默認爲不受限制。
3、get安全性非常低,post安全性較高。但是執行效率卻比Post請求高。
4、在進行文件上傳時只能使用post而不能是get。

14、Kafka的簡單概述
Kafka是一個分佈式發佈-訂閱消息傳遞系統。
producer:消息生產者,發佈消息到kafka集羣的終端或服務。
consumer:從kafka集羣中消費消息的終端或服務。
topic:每條發佈到 kafka 集羣的消息都屬於topic類別,即 kafka 是面向 topic 的。
生產者將輸入寫入到主題topic,而消費者則從主題topic中讀取寫入的數據。因爲卡夫卡是一個分佈式系統,所以topic主題會實現跨多個節點
分區和複製。

15、Redis的使用?
1、活動倒計時方案
2、秒殺方案

16、group by的作用
“Group By”從字面意義上理解就是根據“By”指定的規則對數據進行分組,所謂的分組就是將一個“數據集”劃分成若干個“小區域”,
然後針對若干個“小區域”進行數據處理
看到每一般情況下都需要group by

17、索引建立在什麼字段上?
1、表的主鍵、外鍵必須有索引;
2、經常與其他表進行連接的表,在連接字段上應該建立索引;
3、經常出現在Where子句中的字段,特別是大表的字段,應該建立索引;

18、模糊查詢like查詢時索引生效?
前通配走全表,後通配走索引。

19、maven的使用,packet打包和install打包的區別?
1.install:打包好的jar包會安裝到本地的maven倉庫中,供其他項目使用。
2.package 指定參數打包,打包後的文件存放到項目的target目錄下。

20、mysql組合索引
平時用的SQL查詢語句一般都有比較多的限制條件,所以爲了進一步榨取MySQL的效率,就要考慮建立組合索引,比如給用戶名和密碼同時建立索引。

redis分佈式鎖
業務場景是要求同一個用戶針對同一類借款,只可以存在一筆待還借款。
第三方平臺每次都會在同一時間發送多次相同的借款請求。
使用redis鎖控制用戶借款串行執行。

jdk8的函數表達式的原理
JDK8在實現Lambda時使用了JDK7虛擬機開始有的invokedynamic方法調用指令,該知使得虛擬機執行到Lambda 表達式時才動態的去創建相應的實現類,並加載執行。

線程安全和線程不安全是怎麼定義的?
線程安全就是多線程訪問時,採用了加鎖機制,當一個線程訪問該類的某個數據時進行保護,其他線程不能進行訪問直到該線程讀取完,
其他線程纔可使用。線程不安全會出現數據不一致或者數據污染。

redis的存儲數據用過哪些?
String、List、Set、Hash、SortedSet。

mq異常處理怎麼用的?用在什麼場景?
1、Broker 禁止自動創建 Topic,且用戶沒有通過手工方式創建Topic

添加商品信息後要同步索引庫,同步緩存,生成靜態頁面。ConnectionFactory、topicDestination
爲了解決業務邏輯耦合度高,業務拆分不明確問題。

1、springMVC的執行原理
1、客戶端發出一個http請求給web服務器,web服務器對http請求進行解析,如果匹配到DispatcherServlet的請求映射路徑(在web.xml中指定),
web容器將請求轉交給DispatcherServlet.
2、DipatcherServlet接收到這個請求之後將根據請求的信息(包括URL、Http方法、請求報文頭和請求參數Cookie等)以及
HandlerMapping的配置找到處理請求的處理器(Handler)。
3、將處理權交給Handler(Handler將具體的處理進行封裝),再由具體的HandlerAdapter對Handler進行具體的調用。
4、Handler對數據處理完成以後將返回一個ModelAndView()對象給DispatcherServlet。
5、Handler返回的ModelAndView()只是一個邏輯視圖並不是一個正式的視圖,DispatcherSevlet通過ViewResolver將邏輯視圖轉化爲真正的視圖View。
6、Dispatcher通過model解析出ModelAndView()中的參數進行解析,最終展現出完整的view並返回給客戶端。

請求–前端控制器–處理器–處理器適配器–試圖對象–前端控制器–視圖解析器
2、Mybatis和JDBC有什麼不同?
JDBC是Java提供的一個操作數據庫的API;
MyBatis是對JDBC的封裝,可以優化獲取和釋放;可以進行SQL統一管理,對數據庫進行存取操作;
可以生成動態SQL語句,Mybatis可以在配置文件中通過使用標籤進行SQL語句的拼接,生成動態SQL語句。

3、線程有哪幾種停止方式?有什麼區別?
1、在循環中設置flag標誌控制退出。
2、使用interrupt方法終止線程。

4、怎樣進行權限控制? 用的什麼權限框架,說一下執行過程? 單點登錄是怎麼實現的,說一下大概思想?
Shiro是一個權限管理的框架,實現用戶認證、用戶授權和會話管理。
SSO:在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。
流程:首先在portal門戶頁面點擊登錄跳轉到sso模塊中的登錄頁面,輸入用戶名和密碼後先校驗,校驗成功後生成token,把token作爲key,用戶信息
作爲value放入到redis中,並設置過期時間,然後保存成功後返回登錄成功,並把token放入到cookie中。

1、session是存儲在服務器端,cookie是存儲在客戶端的。
2、session的安全性要比cookie高,然後我們獲取session裏的信息是通過存放在會話cookie裏的sessionid獲取的。
3、由於session是存放在服務器的內存中,所以session裏的東西不斷增加會造成服務器的負擔,所以需要把很重要的信息才存儲在session中,
而把一些次要東西存儲在客戶端的cookie裏。
cookie分爲兩大類:會話cookie和持久化cookie,會話cookie的生命週期和瀏覽器是一致的,瀏覽器關了會話cookie也就消失了;
持久化cookie是存放在客戶端硬盤中,持久化cookie的生命週期就是我們在設置cookie時候設置的那個保存時間,
當瀏覽器關閉時session會不會丟失?
當瀏覽器關閉的時候只是會話cookie中的sessionid消失了,但session的信息還存在服務器端。
session在什麼情況下丟失?
在服務器關閉的時候,或者是session過期(默認時間是30分鐘),再或者調用了invalidate()方法。
session在什麼時候被創建呢?
通過調用getsession()來創建。
訪問HTML頁面是不會創建session,但是訪問index.JSP時會創建session(JSP實際上是一個Servlet,Servlet中有getSession方法)。

1、從地址欄上區別:forword轉發地址欄不發生變化,redirect轉發地址欄發生變化。
2、從性能上區別:forword性能要高於redirect。
因爲上性能的問題,在項目中請求跳轉建議使用forword,如果是跨域訪問,建議使用redirect。

一切脫離業務的架構設計與新技術的引入都是耍流氓。

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