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ā)有啥建議啥的?