要去面試,先刷完這16道高頻面試題,阿里,字節跳動,美團任你選

1.JDK8 新特性

Lambda 表達式-也是函數編程的一種方式(將函數作爲參數)
方法的應用,應用已有的java類對象的方法或者構造器。與Lambda表達式相結合,方法應用使得語言構造更加簡潔,從而減小代碼的冗餘
默認方法,默認方法就是一個在接口裏邊有了一個實現的方法
新工具-新的編譯工具,如:Nashorn引擎jjs,類依賴分析器jdeps
Stream API  - 把真正的函數式編程風格引入到Java中。
Date Time API - 增強對日期與時間的處理
Optional 類 - Optional 類已經成爲Java 8 類庫的一部分,用來解決空指針異常
Base64 Java8 內置了Base64 編碼的編碼器和解析器前端

2.hashMap 底層實現?當你put一個元素時,在底層結構是如何執行的?

   首先須要知道在不一樣的JDK版本上面hashMap 的實現是有區別的:java

   JDK8以前: 數組 + 鏈表spring

   JDK8以後:數組 + 鏈表 + 紅黑樹數據庫

當你put元素時:編程

 ####  執行步驟:json

  a.計算該元素的hashCode 值後端

b.經過計算它的hashCode 值去肯定數組下標,數組的初始化16大小,增加因子爲0.75數組

  c.當存在哈希衝突是,相同的hashCode 值獲得的數組下標就是會同樣的,則單純的數組則不知足,須要鏈表的支持安全

  d.鏈表知足長度大於8時轉成紅黑樹,那爲啥8呢,遵循泊松分佈,紅黑樹平均查找長度是log(n),長度爲8的時候,平均查找長度爲3,若是繼續使用鏈表,平均查找長度爲8/2=4,這纔有轉換爲樹的必要。mybatis

3.Spring 中AOP 與IOC的特性,使用場景是在哪些方面?

AOP:面向切面編程,aspect oriented programming

 面向切面爲的是將日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來

主要的功能:日誌記錄,性能統計,安全控制,事務處理,異常處理等等

IOC:控制反轉,就是建立對象的操做交給Spring容器來作。DI 依賴注入,spring經過xml配置文件實例化對象,依賴對象經過

setter方法獲取。

4.Spring 註解有哪些?

@Controller  用於標註控制層組件

@Service  用於業務層,也是實現接口

@Component 泛指組件,在很差歸類狀況下進行標註

@RequestMapping  請求映射,能夠指定請求方式

@Resource 裝bean注入使用:經過byName自動注入

@Autowired 自動裝配bean:經過ByType自動注入

@ResponseBody 響應返回數據類型json

@Transactional 事務

5.RestController 與@Controller的區別?

@restcontroller 註解 等價於 @responseBody + @Controller

@Restcontroller 和@controller 度用於Spring 類是否接受http請求

區別之處:

@restcontroller  返回json數據不須要在方法前面加@ResponseBody註解了;不能返回jsp,HTML頁面,視圖解析器沒法解析jsp,HTML頁面,而@controller 能夠返回指定的頁面;

返回json,xml 或者自定義格式內容到頁面顯示的話,@restController 單個操做就行,由於它能夠自動將實體轉成Json格式;而@controller須要加上@responseBody註解

6.數據庫優化有哪些方式?

1.選擇合適的字段屬性
2.使用鏈接join 代替子查詢
3.使用union 代替手動建立的臨時表
4.事務
5.鎖定表
6.使用外鍵
7.使用索引
     索引應創建在那些將用於JOIN,WHERE判斷和ORDERBY排序的字段上。
      儘可能不要對數據庫中某個含有大量重複的值的字段創建索引。好比枚舉類型
8.優化查詢語句

7.什麼是索引?

索引是對數據庫表中一列或者多列的值進行排序的一種結構,使用索引能夠快速訪問數據庫表中特定信息。

索引類型5種:  

普通索引:僅加速查詢

惟一索引:加速查詢 + 列值惟一(能夠有null)

主鍵索引:加速查詢 + 列值惟一(不能夠有null)+ 表中只有一個

複合索引:多列值組成一個索引

全文索引:對文本的內容進行分詞,進行搜索

8. 什麼是複合索引?

用戶能夠在多個列創建索引,叫作複合索引。

9.什麼是最左匹配原則?

最左匹配原則,以最左爲起點任何連續的索引都能匹配上。遇到範圍查詢時就會中止匹配。

 

10.Mybatis 中的 號與 符號區別是什麼?什麼地方會用到${} ?

井號SQL的參數佔位符,mybatis會將SQL的#{} 替換成? 號佔位符設置參數存在預編譯、防止SQL注入

${}是變量佔位符,屬於靜態文本替換,不存在預編譯;

須要原樣輸出的時候能夠${}方式;推薦使用#{}方式,安全性高。

11.Spring DI注入的三種方式?

1.構造方法注入
 
  <bean id ="name" class="">
    <construcion-arg /> 可使用這個P 域和 C域的方式;
  </bean>
 
  <bean id="userService" class="com.lyu.spring.service.impl.UserService">
    <constructor-arg name="userDao" ref="userDaoJdbc"></constructor-arg>
    <constructor-arg name="user" ref="user"></constructor-arg>
  </bean>
 
2.setter注入
   提供set方法
 
 <!-- 註冊userService -->
<bean id="userService" class="com.lyu.spring.service.impl.UserService">
    <!-- 寫法一 -->
    <!-- <property name="UserDao" ref="userDaoMyBatis"></property> -->
    <!-- 寫法二 -->
    <property name="userDao" ref="userDaoMyBatis"></property>
</bean>
  
 
3.基於註解的注入
 
  自動注入
  @Autowired:spring註解,默認是以byType的方式去匹配與屬性名相同的bean的id,
   若是沒有找到,就經過byName的方式去查找,

12.SpringMVC的工做流程(步驟)?

一、用戶發送請求至前端控制器DispatcherServlet
二、DispatcherServlet收到請求調用HandlerMapping處理器映射器。
三、處理器映射器找到具體的處理器,生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet。
四、DispatcherServlet調用HandlerAdapter處理器適配器
五、HandlerAdapter通過適配調用具體的處理器(Controller,也叫後端控制器)。
六、Controller執行完成返回ModelAndView
七、HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
八、DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
九、ViewReslover解析後返回具體View
十、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
十一、DispatcherServlet響應用戶

13.Mybatis 動態SQL標籤有哪些?

1.select 、insert、update、delete  四個基本的標籤
2.resultMap  查詢結果集進行自動封裝,建議少使用resultType標籤
3.parameterMap  入參集合進行封裝
    <parameterMap id="ParameterMap" type="Student">
        <parameter property="studentId" resultMap="ResultMap"></parameter>
        <parameter property="studentName" resultMap="ResultMap"></parameter>
    </parameterMap>
 
    <resultMap id="ResultMap" type="Student">
        <id column="id" property="studentId"></id>
        <result column="name" property="studentName"></result>
    </resultMap>
4.selectKey 插入數據的時候獲取該數據的id值
5.trim 去除
6.where 條件
7.set  
    注意的是:使用set能夠自動去除逗號
    <update> update user 
    <set>
           <if test="param.name !=null and param.name !=''">
              name = #{param.name},
            </if>
    </set>  
    where id = #{param.id}  
 
8.if 結合 test 進行參數的判斷
9.foreach 循環遍歷
  foreach元素屬性有item,index,collection,open,separator,close
    item:別名
    index:下標位置
    open:以什麼開始
    separator:以什麼符號做爲分隔符
    close:以什麼結束
 
    <select id="selectByIds" resultMap="baseMap">
        select * from user where id in
        <foreach collection="list" index="index" item ="item"  open="("  separator =","             close=")" >#{item}
        </foreach> 
    </select> 
 
     collection 的類型能夠list,array,map 對應的參數類型爲:List、數組、map集合
 
10.choose 結合 when 與otherwise進行選擇
11.when  當啥時候
12.otherwise  另外一種選擇
13.bind  綁定
14.resultType 跟resultMap  效果是相同

14.爲何說Mybatis是半自動ORM框架?

本身的理解:ORM指的是對象關係映射,mybatis僅有對字段的關係映射,對象數據以及對象實際關係須要咱們本身手動去寫SQL去實現和管理,而hibernate是全自動的ORM框架,擁有完整的Javabean對象與數據庫表結構自動生成SQL,以前本身動手過Javabean去實現數據庫建立表結構是測試。另外,Mybatis擁有自動化SQL語句,在實際開發中都是不定因數而須要咱們去重寫複雜的SQL語句,hibernate則沒有那麼靈活好用了。

15.多線程建立的方式有哪些?

 多線程建立的方式有四種:

 第一種是繼承Thead類,重寫它的run方法,以後就能夠調用

 第二種是實現Runnable接口,重寫run方式

第三種是實現callable接口,重寫call方法

第四種是採用線程池,executorService對象,也是須要配合Runnable進行實現

16.如何更好的描述項目?項目是怎麼樣的一個流程?

本身以爲這塊比較薄弱,雖然是本身作的項目,殊不知道如何去表達清楚,如何去說出項目是怎樣的一個流程,遇到這裏我覺的有必要去借鑑一下大佬的意見。(

1.項目背景 在怎樣的條件下進行

2.項目介紹  技術介紹,功能介紹

3.項目參與人員  分工合做,負責人

4.項目進展實施狀況 目前進展,項目還剩下的工做量以及規劃

5.項目難題及解決   遇到技術難題如何解決的考慮好回答,讓你影響深入的比較有深意問題,採用哪些解決辦法

6.項目成果   能夠從前端功能點,隱藏bug;從後端功能接口是否完善,是否存在容錯問題

7.總結反思   從0到1的這個過程你收穫了多少?後期開發有啥建議啥的?

相關文章
相關標籤/搜索