一、set集合從原理上如何保證不重複java
1)在往set中添加元素時,若是指定元素不存在,則添加成功。也就是說,若是set中不存在(e==null ? e1==null : e.queals(e1))的元素e1,則e1能添加到set中。mysql
2)具體來說:當向HashSet中添加元素的時候,首先計算元素的hashcode值,而後用這個(元素的hashcode)%(HashMap集合的大小)+1計算出這個元素的存儲位置,若是這個位置爲空,就將元素添加進去;若是不爲空,則用equals方法比較元素是否相等,相等就不添加,不然找一個空位添加。redis
二、HashMap和HashTable的主要區別是什麼?,二者底層實現的數據結構是什麼?算法
三、HashMap什麼時候擴容,擴容的算法是什麼?spring
HashMap什麼時候擴容:sql
當向容器添加元素的時候,會判斷當前容器的元素個數,若是大於等於閾值---即當前數組的長度乘以加載因子的值的時候,就要自動擴容數據庫
擴容的算法是什麼:編程
擴容(resize)就是從新計算容量,向HashMap對象裏不停的添加元素,而HashMap對象內部的數組沒法裝載更多的元素時,對象就須要擴大數組的長度,以便能裝入更多的元素。固然Java裏的數組是沒法自動擴容的,方法是使用一個新的數組代替已有的容量小的數組數組
四、Java的虛擬機JVM的兩個內存:棧內存和對內存的區別是什麼?緩存
五、Java中對異常時如何進行分類的?
異常總體分類:
1)Java異常結構中定義有Throwable類。 Exception和Error爲其子類。
2)其中Exception表示因爲網絡故障、文件損壞、設備錯誤、用戶輸入非法狀況致使的異常;
3)而Error標識Java運行時環境出現的錯誤,例如:JVM內存耗盡。
六、數據庫設計中常講的三範式是指什麼?
七、Java中的線程池共有幾種?
Java四種線程池
第一種:newCachedThreadPool
建立一個可根據須要建立新線程的線程池,可是在之前構造的線程可用時將重用它們。
第二種:newFixedThreadPool
建立一個指定工做線程數量的線程池
第三種:newScheduledThreadPool
建立一個線程池,它可安排在給定延遲後運行命令或者按期地執行。
第四種:newSingleThreadExecutor
建立一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。
八、volatile和synchronized區別
volatile和synchronized簡介:
在Java中,爲了保證多線程讀寫數據時保證數據的一致性,能夠採用兩種方式:
1)使用synchronized關鍵字
2)使用volatile關鍵字:用一句話歸納volatile,它可以使變量在值發生改變時能儘快地讓其餘線程知道。
二者的區別:
1)volatile本質是在告訴jvm當前變量在寄存器中的值是不肯定的,須要從主存中讀取,synchronized則是鎖定當前變量,只有當前線程能夠訪問該變量,其餘線程被阻塞住.
2)volatile僅能使用在變量級別,synchronized則可使用在變量,方法.
3)volatile僅能實現變量的修改可見性,而synchronized則能夠保證變量的修改可見性和原子性.
4)volatile不會形成線程的阻塞,而synchronized可能會形成線程的阻塞.
九、Spring的特性
1.方便解耦,簡化開發
經過Spring提供的IoC容器,咱們能夠將對象之間的依賴關係交由Spring進行控制,避免硬編碼所形成的過分程序耦合。
2.AOP編程的支持
經過Spring提供的AOP功能,方便進行面向切面的編程。
3.聲明事物的支持
在Spring中,咱們能夠從單調煩悶的事務管理代碼中解脫出來,經過聲明式方式靈活地進行事務的管理,提升開發效率和質量。
4.方便程序的測試
能夠用非容器依賴的編程方式進行幾乎全部的測試工做。例如:Spring對Junit4支持,能夠經過註解方便的測試Spring程序。
5.方便集成各類優秀框架
Spring不排斥各類優秀的開源框架,相反,Spring能夠下降各類框架的使用難度,Spring提供了對各類優秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.下降Java EE API的使用難度
Spring對不少難用的Java EE API(如JDBC,JavaMail,遠程調用等)提供了一個薄薄的封裝層,經過Spring的簡易封裝,這些Java EE API的使用難度大爲下降。
十、spring aop的應用場景:
AOP用來封裝橫切關注點,具體能夠在下面的場景中使用
Authentication 權限
Caching 緩存
Context passing 內容傳遞
Error handling 錯誤處理
Lazy loading 懶加載
Debugging 調試
logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
Performance optimization 性能優化
Persistence 持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務
十一、Mybaits中#和$區別
1)${}是Properties文件中的變量佔位符,它能夠用於標籤屬性值和sql內部,屬於靜態文本替換,好比${driver}會被靜態替換爲com.mysql.jdbc.Driver。
2)#{}是sql的參數佔位符,Mybatis會將sql中的#{}替換爲?號,在sql執行前會使用PreparedStatement的參數設置方法,按序給sql的?號佔位符設置參數值,好比ps.setInt(0, parameterValue),#{item.name}的取值方式爲使用反射從參數對象中獲取item對象的name屬性值,至關於param.getItem().getName()。
十二、排序都有哪幾種方法?請列舉。用JAVA 實現一個快速排序。
排序的方法有:
插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸併排序,分配排序(箱排序、基數排序);
快速排序的僞代碼:
//使用快速排序方法對a[ 0 :n- 1 ]排序
從a[ 0 :n- 1 ]中選擇一個元素做爲middle,該元素爲支點;
把餘下的元素分割爲兩段left 和right,使得left 中的元素都小於等於支點,
而right 中的元素都大於等於支點;
遞歸地使用快速排序方法對left 進行排序;
遞歸地使用快速排序方法對right 進行排序;
所得結果爲left + middle + right。
爲了更好的讓你們應對筆試,除了以上精選筆試題外,還準備了歷年來幾百道筆試題,包括:(java,spring、數據結構和算法、mybatis、redis、serlvet、jsp等),供你們學習。