要去面試,先刷完這16道高頻面試題,阿里,字節(jié)跳動(dòng),美團(tuán)任你選

1.JDK8 新特性

Lambda 表達(dá)式-也是函數(shù)編程的一種方式(將函數(shù)做為參數(shù))
方法的應(yīng)用,應(yīng)用已有的java類對象的方法或者構(gòu)造器。與Lambda表達(dá)式相結(jié)合,方法應(yīng)用使得語言構(gòu)造更加簡潔,從而減少代碼的冗余
默認(rèn)方法,默認(rèn)方法就是一個(gè)在接口里邊有了一個(gè)實(shí)現(xiàn)的方法
新工具-新的編譯工具,如:Nashorn引擎jjs,類依賴分析器jdeps
Stream API - 把真正的函數(shù)式編程風(fēng)格引入到Java中。
Date Time API - 加強(qiáng)對日期與時(shí)間的處理
Optional 類 - Optional 類已經(jīng)成為Java 8 類庫的一部分,用來解決空指針異常
Base64 Java8 內(nèi)置了Base64 編碼的編碼器和解析器

2.hashMap 底層實(shí)現(xiàn)?當(dāng)你put一個(gè)元素時(shí),在底層結(jié)構(gòu)是如何執(zhí)行的?

首先需要知道在不同的JDK版本上面hashMap 的實(shí)現(xiàn)是有區(qū)別的:

JDK8之前: 數(shù)組 + 鏈表

JDK8之后:數(shù)組 + 鏈表 + 紅黑樹

當(dāng)你put元素時(shí):

執(zhí)行步驟:

a.計(jì)算該元素的hashCode 值

b.通過計(jì)算它的hashCode 值去確定數(shù)組下標(biāo),數(shù)組的初始化16大小,增長因子為0.75

c.當(dāng)存在哈希沖突是,相同的hashCode 值得到的數(shù)組下標(biāo)就是會(huì)一樣的,則單純的數(shù)組則不滿足,需要鏈表的支持

d.鏈表滿足長度大于8時(shí)轉(zhuǎn)成紅黑樹,那為啥8呢,遵循泊松分布,紅黑樹平均查找長度是log(n),長度為8的時(shí)候,平均查找長度為3,如果繼續(xù)使用鏈表,平均查找長度為8/2=4,這才有轉(zhuǎn)換為樹的必要。

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

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

面向切面為的是將日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等代碼從業(yè)務(wù)邏輯代碼中劃分出來

主要的功能:日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等

IOC:控制反轉(zhuǎn),就是創(chuàng)建對象的操作交給Spring容器來做。DI 依賴注入,spring通過xml配置文件實(shí)例化對象,依賴對象通過

setter方法獲取。

4.Spring 注解有哪些?

@Controller 用于標(biāo)注控制層組件

@Service 用于業(yè)務(wù)層,也是實(shí)現(xiàn)接口

@Component 泛指組件,在不好歸類情況下進(jìn)行標(biāo)注

@RequestMapping 請求映射,可以指定請求方式

@Resource 裝bean注入使用:通過byName自動(dòng)注入

@Autowired 自動(dòng)裝配bean:通過ByType自動(dòng)注入

@ResponseBody 響應(yīng)返回?cái)?shù)據(jù)類型json

@Transactional 事務(wù)

5.RestController 與@Controller的區(qū)別?

@restcontroller 注解 等價(jià)于 @responseBody + @Controller

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

區(qū)別之處:

@restcontroller 返回json數(shù)據(jù)不需要在方法前面加@ResponseBody注解了;不能返回jsp,HTML頁面,視圖解析器無法解析jsp,HTML頁面,而@controller 可以返回指定的頁面;

返回json,xml 或者自定義格式內(nèi)容到頁面顯示的話,@restController 單個(gè)操作就行,因?yàn)樗梢宰詣?dòng)將實(shí)體轉(zhuǎn)成Json格式;而@controller需要加上@responseBody注解

6.數(shù)據(jù)庫優(yōu)化有哪些方式?

1.選擇合適的字段屬性
2.使用連接join 代替子查詢
3.使用union 代替手動(dòng)創(chuàng)建的臨時(shí)表
4.事務(wù)
5.鎖定表
6.使用外鍵
7.使用索引
     索引應(yīng)建立在那些將用于JOIN,WHERE判斷和ORDERBY排序的字段上。
      盡量不要對數(shù)據(jù)庫中某個(gè)含有大量重復(fù)的值的字段建立索引。比如枚舉類型
8.優(yōu)化查詢語句

7.什么是索引?

索引是對數(shù)據(jù)庫表中一列或者多列的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可以快速訪問數(shù)據(jù)庫表中特定信息。

索引類型5種:

普通索引:僅加速查詢

唯一索引:加速查詢 + 列值唯一(可以有null)

主鍵索引:加速查詢 + 列值唯一(不可以有null)+ 表中只有一個(gè)

復(fù)合索引:多列值組成一個(gè)索引

全文索引:對文本的內(nèi)容進(jìn)行分詞,進(jìn)行搜索

8. 什么是復(fù)合索引?

用戶可以在多個(gè)列建立索引,叫做復(fù)合索引。

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

最左匹配原則,以最左為起點(diǎn)任何連續(xù)的索引都能匹配上。遇到范圍查詢時(shí)就會(huì)停止匹配。

10.Mybatis 中的 號(hào)與 符號(hào)區(qū)別是什么?什么地方會(huì)用到${} ?

井號(hào)SQL的參數(shù)占位符,mybatis會(huì)將SQL的#{} 替換成? 號(hào)占位符設(shè)置參數(shù)存在預(yù)編譯、防止SQL注入

${}是變量占位符,屬于靜態(tài)文本替換,不存在預(yù)編譯;

需要原樣輸出的時(shí)候可以${}方式;推薦使用#{}方式,安全性高。

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

1.構(gòu)造方法注入
 
  <bean id ="name" class="">
    <construcion-arg /> 可以使用這個(gè)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.基于注解的注入
 
  自動(dòng)注入
  @Autowired:spring注解,默認(rèn)是以byType的方式去匹配與屬性名相同的bean的id,
   如果沒有找到,就通過byName的方式去查找,

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

1、用戶發(fā)送請求至前端控制器DispatcherServlet
2、DispatcherServlet收到請求調(diào)用HandlerMapping處理器映射器。
3、處理器映射器找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。
4、DispatcherServlet調(diào)用HandlerAdapter處理器適配器
5、HandlerAdapter經(jīng)過適配調(diào)用具體的處理器(Controller,也叫后端控制器)。
6、Controller執(zhí)行完成返回ModelAndView
7、HandlerAdapter將controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet
8、DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
9、ViewReslover解析后返回具體View
10、DispatcherServlet根據(jù)View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)。
11、DispatcherServlet響應(yīng)用戶

13.Mybatis 動(dòng)態(tài)SQL標(biāo)簽有哪些?

1.select 、insert、update、delete  四個(gè)基本的標(biāo)簽
2.resultMap  查詢結(jié)果集進(jìn)行自動(dòng)封裝,建議少使用resultType標(biāo)簽
3.parameterMap  入?yún)⒓线M(jìn)行封裝
    <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 插入數(shù)據(jù)的時(shí)候獲取該數(shù)據(jù)的id值
5.trim 去除
6.where 條件
7.set  
    注意的是:使用set可以自動(dòng)去除逗號(hào)
    <update> update user 
    <set>
           <if test="param.name !=null and param.name !=''">
              name = #{param.name},
            </if>
    </set>  
    where id = #{param.id}  
 
8.if 結(jié)合 test 進(jìn)行參數(shù)的判斷
9.foreach 循環(huán)遍歷
  foreach元素屬性有item,index,collection,open,separator,close
    item:別名
    index:下標(biāo)位置
    open:以什么開始
    separator:以什么符號(hào)作為分隔符
    close:以什么結(jié)束
 
    <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 對應(yīng)的參數(shù)類型為:List、數(shù)組、map集合
 
10.choose 結(jié)合 when 與otherwise進(jìn)行選擇
11.when  當(dāng)啥時(shí)候
12.otherwise  另一種選擇
13.bind  綁定
14.resultType 跟resultMap  效果是相同

14.為什么說Mybatis是半自動(dòng)ORM框架?

自己的理解:ORM指的是對象關(guān)系映射,mybatis僅有對字段的關(guān)系映射,對象數(shù)據(jù)以及對象實(shí)際關(guān)系需要我們自己手動(dòng)去寫SQL去實(shí)現(xiàn)和管理,而hibernate是全自動(dòng)的ORM框架,擁有完整的Javabean對象與數(shù)據(jù)庫表結(jié)構(gòu)自動(dòng)生成SQL,之前自己動(dòng)手過Javabean去實(shí)現(xiàn)數(shù)據(jù)庫創(chuàng)建表結(jié)構(gòu)是測試。另外,Mybatis擁有自動(dòng)化SQL語句,在實(shí)際開發(fā)中都是不定因數(shù)而需要我們?nèi)ブ貙憦?fù)雜的SQL語句,hibernate則沒有那么靈活好用了。

15.多線程創(chuàng)建的方式有哪些?

多線程創(chuàng)建的方式有四種:

第一種是繼承Thead類,重寫它的run方法,之后就可以調(diào)用

第二種是實(shí)現(xiàn)Runnable接口,重寫run方式

第三種是實(shí)現(xiàn)callable接口,重寫call方法

第四種是采用線程池,executorService對象,也是需要配合Runnable進(jìn)行實(shí)現(xiàn)

16.如何更好的描述項(xiàng)目?項(xiàng)目是怎么樣的一個(gè)流程?

自己覺得這塊比較薄弱,雖然是自己做的項(xiàng)目,卻不知道如何去表達(dá)清楚,如何去說出項(xiàng)目是怎樣的一個(gè)流程,遇到這里我覺的有必要去借鑒一下大佬的意見。(

1.項(xiàng)目背景 在怎樣的條件下進(jìn)行

2.項(xiàng)目介紹 技術(shù)介紹,功能介紹

3.項(xiàng)目參與人員 分工合作,負(fù)責(zé)人

4.項(xiàng)目進(jìn)展實(shí)施情況 目前進(jìn)展,項(xiàng)目還剩下的工作量以及規(guī)劃

5.項(xiàng)目難題及解決 遇到技術(shù)難題如何解決的考慮好回答,讓你影響深刻的比較有深意問題,采用哪些解決辦法

6.項(xiàng)目成果 可以從前端功能點(diǎn),隱藏bug;從后端功能接口是否完善,是否存在容錯(cuò)問題

7.總結(jié)反思 從0到1的這個(gè)過程你收獲了多少?后期開發(fā)有啥建議啥的?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容