欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java經(jīng)典面試題最全匯總208道(五)

 更新時(shí)間:2023年01月17日 16:23:39   作者:哪 吒  
這篇文章主要介紹了Java經(jīng)典面試題最全匯總208道(五),本文章內(nèi)容詳細(xì),該模塊分為了六個(gè)部分,本次為第五部分,需要的朋友可以參考下

前言 

短時(shí)間提升自己最快的手段就是背面試題,最近總結(jié)了Java常用的面試題,分享給大家,希望大家都能圓夢大廠,加油,我命由我不由天。

152、什么是 YAML?

YAML是JSON的一個(gè)超集,可以非常方便地將外部配置以層次結(jié)構(gòu)形式存儲起來。

YAML可以作為properties配置文件的替代。

YAML使用的注意事項(xiàng):

  1. 在properties文件中是以"."進(jìn)行分割的,在yml中是用"."進(jìn)行分割的;
  2. yml的數(shù)據(jù)格式和json的格式很像,都是K-V格式,并且通過":"進(jìn)行賦值;
  3. 每個(gè)冒號后面一定要加一個(gè)空格;

153、如何使用 Spring Boot 實(shí)現(xiàn)分頁和排序?

使用Spring Data Jpa可以實(shí)現(xiàn)將可分頁的傳遞給存儲庫方法。

154、如何使用 Spring Boot 實(shí)現(xiàn)異常處理?

1、使用 @ExceptionHandler 注解處理局部異常(只能處理當(dāng)前controller中的ArithmeticException和NullPointerException異常,缺點(diǎn)就是只能處理單個(gè)controller的異常)

@Controller
public class ExceptionHandlerController {
	
	@RequestMapping("/excep")
	public String exceptionMethod(Model model) throws Exception {
		String a=null;
		System.out.println(a.charAt(1));
		int num = 1/0;
		model.addAttribute("message", "沒有拋出異常");
		return "index";
	}
 
	@ExceptionHandler(value = {ArithmeticException.class,NullPointerException.class})
	public String arithmeticExceptionHandle(Model model, Exception e) {
		model.addAttribute("message", "@ExceptionHandler" + e.getMessage());
		return "index";
	}
}

2、使用 @ControllerAdvice + @ExceptionHandler 注解處理全局異常(value后面可以填寫數(shù)組)

@ControllerAdvice
public class ControllerAdviceException {
	
	@ExceptionHandler(value = {NullPointerException.class})
	public String NullPointerExceptionHandler(Model model, Exception e) {
		model.addAttribute("message", "@ControllerAdvice + @ExceptionHandler :" + e.getMessage());
		return "index";
	}
}

3、配置 SimpleMappingExceptionResolver 類處理異常(配置類)

@Configuration
public class SimpleMappingException {
	@Bean
	public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
 
		SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
		Properties mappings = new Properties();
		//第一個(gè)參數(shù)為異常全限定名,第二個(gè)為跳轉(zhuǎn)視圖名稱
		mappings.put("java.lang.NullPointerException", "index");
		mappings.put("java.lang.ArithmeticException", "index");
		//設(shè)置異常與視圖映射信息的
		resolver.setExceptionMappings(mappings);
		return resolver;
	}
}

4、實(shí)現(xiàn) HandlerExceptionResolver 接口處理異常

@Configuration
public class HandlerException implements HandlerExceptionResolver {
	@Override
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
 
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("message", "實(shí)現(xiàn)HandlerExceptionResolver接口");
 
		//判斷不同異常類型,做不同視圖跳轉(zhuǎn)
		if(ex instanceof NullPointerException){
			modelAndView.setViewName("index");
		}
		if(ex instanceof ArithmeticException){
			modelAndView.setViewName("index");
		}
		return modelAndView;
	}
}

155、單點(diǎn)登錄

1、概念

單點(diǎn)登錄SSO,說的是在一個(gè)多系統(tǒng)共存的環(huán)境下,用戶在一處登錄后,就不用在其他系統(tǒng)中登錄,也就是用戶的一次登錄能得到其他所有系統(tǒng)的信任。

2、單點(diǎn)登錄的要點(diǎn)

  • 存儲信任;
  • 驗(yàn)證信任;

3、實(shí)現(xiàn)單點(diǎn)登錄的三種方式

(1)以cookie作為憑證

最簡單的單點(diǎn)登錄實(shí)現(xiàn)方式,是使用cookie作為媒介,存放用戶憑證。

用戶登錄父應(yīng)用之后,應(yīng)用返回一個(gè)加密的cookie,當(dāng)用戶訪問子應(yīng)用的時(shí)候,攜帶上這個(gè)cookie,授權(quán)應(yīng)用解密cookie進(jìn)行校驗(yàn),校驗(yàn)通過則登錄當(dāng)前用戶。

缺點(diǎn):

cookie不安全

通過加密可以保證安全性,但如果對方掌握了解密算法就完蛋了。

不能跨域?qū)崿F(xiàn)免登

(2)通過JSONP實(shí)現(xiàn)

對于跨域問題,可以使用JSONP實(shí)現(xiàn)。用戶在父應(yīng)用中登錄后,跟session匹配的cookie會存到客戶端中,當(dāng)用戶需要登錄子應(yīng)用的時(shí)候,授權(quán)應(yīng)用訪問父應(yīng)用提供的JSONP接口,并在請求中帶上父應(yīng)用域名下的cookie,父應(yīng)用接收到請求,驗(yàn)證用戶的登錄狀態(tài),返回加密的信息,子應(yīng)用通過解析返回來的加密信息來驗(yàn)證用戶,如果通過驗(yàn)證則登錄用戶。

缺點(diǎn):

這種方法雖然能解決跨域問題,但是治標(biāo)不治本,沒有解決cookie安全性的問題。

(3)通過頁面重定向的方式

最后一種介紹的方式,是通過父應(yīng)用和子應(yīng)用來回重定向進(jìn)行通信,實(shí)現(xiàn)信息的安全傳遞。

父應(yīng)用提供一個(gè)GET方式的登錄接口A(此時(shí)的父應(yīng)用接口固定,攻擊者無法去偽造),用戶通過子應(yīng)用重定向連接的方式訪問這個(gè)接口

如果用戶還沒有登錄,則返回一個(gè)登錄頁面,用戶輸入賬號密碼進(jìn)行登錄

如果用戶已經(jīng)登錄了,則生成加密的token,并且重定向到子應(yīng)用提供的驗(yàn)證token的接口B(此時(shí)的子應(yīng)用接口固定,攻擊者無法去偽造)

通過解密和校驗(yàn)之后,子應(yīng)用登錄當(dāng)前用戶。

缺點(diǎn):

這種方式較前面的兩種方式,是解決了安全性和跨域的問題,但是并沒有前面兩種方式簡單,安全與方便,本來就是矛盾的。

4、使用獨(dú)立登錄系統(tǒng)

一般來說,大型應(yīng)用會把授權(quán)的邏輯和用戶信息的相關(guān)邏輯獨(dú)立成一個(gè)應(yīng)用,稱為用戶中心。

用戶中心不處理業(yè)務(wù)邏輯,只是處理用戶信息的管理以及授權(quán)給第三方應(yīng)用。

第三方應(yīng)用需要登錄的時(shí)候,則把用戶的登錄請求轉(zhuǎn)發(fā)給用戶中心進(jìn)行處理,用戶處理完畢后返回憑證,第三方應(yīng)用驗(yàn)證憑證,通過后就登錄用戶。

5、sso(單點(diǎn)登錄)與OAuth2.0(授權(quán))的區(qū)別?

(1)sso(單點(diǎn)登錄)

  • 通常處理的是一個(gè)公司的不同應(yīng)用間的訪問登錄問題,如企業(yè)應(yīng)用有很多子系統(tǒng),只需登錄一個(gè)系統(tǒng),就可以實(shí)現(xiàn)不同子系統(tǒng)間的跳轉(zhuǎn),而避免了登錄操作;
  • 通過cookie、jsonp、重定向來實(shí)現(xiàn);

(2)OAuth2.0(授權(quán))

解決的是服務(wù)提供方(如微信)給第三方應(yīng)用授權(quán)的問題,簡稱微信登錄;

是一種具體的協(xié)議,只是為用戶資源的授權(quán)提供了一個(gè)安全的、開放的而又簡易的標(biāo)準(zhǔn),OAuth2.0(授權(quán))為客戶開發(fā)者開發(fā)web應(yīng)用,桌面應(yīng)用程序,移動應(yīng)用及客廳設(shè)備提供特定的授權(quán)流程。

156、Spring Boot比Spring多哪些注解

Spring Boot常用注解(絕對經(jīng)典)

157、打包和部署

Spring和Spring Boot都支持maven和Gradle通用打包管理技術(shù)。

Spring Boot相對Spring的一些優(yōu)點(diǎn):

  • 提供嵌入式容器支持;
  • 使用命令java -jar獨(dú)立運(yùn)行jar;
  • 部署時(shí)可以靈活指定配置文件;

最近項(xiàng)目是分布式的項(xiàng)目,都是通過分項(xiàng)目打包部署,然后部署在docker中運(yùn)行。

158、Spring Boot如何訪問不同的數(shù)據(jù)庫

可以使用druidDataSource創(chuàng)建DataSource,然后通過jdbcTemplate執(zhí)行sql。

159、查詢網(wǎng)站在線人數(shù)

通過監(jiān)聽session對象的方式來實(shí)現(xiàn)在線人數(shù)的統(tǒng)計(jì)和在線人信息展示,并且讓超時(shí)的自動銷毀。

對session對象實(shí)現(xiàn)監(jiān)聽,首先必須繼承HttpSessionListener類,該程序的基本原理就是當(dāng)瀏覽器訪問頁面的時(shí)候必定會產(chǎn)生一個(gè)session對象,當(dāng)關(guān)閉該頁面的時(shí)候必然會刪除session對象。

所以每當(dāng)產(chǎn)生一個(gè)新的session對象就讓在線人數(shù)+1,當(dāng)刪除一個(gè)session對象就讓在線人數(shù)-1。

還要繼承一個(gè)HttpSessionAttributeListener,來實(shí)現(xiàn)對其屬性的監(jiān)聽。

分別實(shí)現(xiàn)attributeAdded方法,attributeReplace方法以及attributeRemove方法。

sessionCreated//新建一個(gè)會話的時(shí)候觸發(fā),也可以說是客戶端第一次喝服務(wù)器交互時(shí)觸發(fā)。

sessionDestroyed//銷毀會話的時(shí)候,一般來說只有某個(gè)按鈕觸發(fā)進(jìn)行銷毀,或者配置定時(shí)銷毀。

HttpSessionAttributeListener有三個(gè)方法需要實(shí)現(xiàn)

attributeAdded//在session中添加對象時(shí)觸發(fā)此操作 籠統(tǒng)的說就是調(diào)用setAttribute這個(gè)方法時(shí)候會觸發(fā)的

attributeRemoved//修改、刪除session中添加對象時(shí)觸發(fā)此操作  籠統(tǒng)的說就是調(diào)用 removeAttribute這個(gè)方法時(shí)候會觸發(fā)的

attributeReplaced//在Session屬性被重新設(shè)置時(shí)。

160、easyExcel如何實(shí)現(xiàn)

異步讀取

新建一個(gè)  ExcelModelListener 監(jiān)聽類出來,并且 繼承 AnalysisEventListener 類

package com.zh.oukele.listener;
 
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.zh.oukele.model.ExcelMode;
 
import java.util.ArrayList;
import java.util.List;
 
/***
 *  監(jiān)聽器
 */
public class ExcelModelListener extends AnalysisEventListener<ExcelMode> {
 
    /**
     * 每隔5條存儲數(shù)據(jù)庫,實(shí)際使用中可以3000條,然后清理list ,方便內(nèi)存回收
     */
    private static final int BATCH_COUNT = 5;
    List<ExcelMode> list = new ArrayList<ExcelMode>();
    private static int count = 1;
    @Override
    public void invoke(ExcelMode data, AnalysisContext context) {
        System.out.println("解析到一條數(shù)據(jù):{ "+ data.toString() +" }");
        list.add(data);
        count ++;
        if (list.size() >= BATCH_COUNT) {
            saveData( count );
            list.clear();
        }
    }
 
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData( count );
        System.out.println("所有數(shù)據(jù)解析完成!");
        System.out.println(" count :" + count);
    }
 
    /**
     * 加上存儲數(shù)據(jù)庫
     */
    private void saveData(int count) {
        System.out.println("{ "+ count +" }條數(shù)據(jù),開始存儲數(shù)據(jù)庫!" + list.size());
        System.out.println("存儲數(shù)據(jù)庫成功!");
    }
 
}

161、什么是 Swagger?你用 Spring Boot 實(shí)現(xiàn)了它嗎?

Swagger是用于生成RestFul Web服務(wù)的可視化表示工具,它使文檔和服務(wù)器可視化更新;

當(dāng)定義好Swagger后,可以調(diào)用服務(wù)端接口,來查看接口的返回值,驗(yàn)證返回?cái)?shù)據(jù)的正確性;

162、數(shù)據(jù)庫的三范式是什么?

1、列不可再分;

2、每一行數(shù)據(jù)只做一件事,只與一列相關(guān),主鍵;

3、每個(gè)屬性都與主鍵有直接關(guān)系,而不是間接關(guān)系;

三大范式只是設(shè)計(jì)數(shù)據(jù)庫的基本理念,可以建立冗余較小、結(jié)構(gòu)合理的數(shù)據(jù)庫。

如果有特殊情結(jié),當(dāng)然要特殊對待,數(shù)據(jù)庫設(shè)計(jì)最重要的是看需求和性能,需求>性能>表結(jié)構(gòu)。

所以不能一味的追求三范式建立數(shù)據(jù)庫。

163、一張自增表里面總共有 7 條數(shù)據(jù),刪除了最后 2 條數(shù)據(jù),重啟 mysql 數(shù)據(jù)庫,又插入了一條數(shù)據(jù),此時(shí) id 是幾?

一般情況下,我們創(chuàng)建的表類型是InnoDB。

  • 不重啟MySQL,如果新增一條記錄,id是8;
  • 重啟,ID是6;因?yàn)镮nnoDB表只把自增主鍵的最大ID記錄在內(nèi)存中,如果重啟,已刪除的最大ID會丟失。
  • 如果表類型是MyISAM,重啟之后,最大ID也不會丟失,ID是8;

InnoDB必須有主鍵(建議使用自增主鍵,不用UUID,自增主鍵索引查詢效率高)、支持外鍵、支持事務(wù)、支持行級鎖。

系統(tǒng)崩潰后,MyISAM很難恢復(fù);

綜合考慮,優(yōu)先選擇InnoDB,MySQL默認(rèn)也是InnoDB。

164、如何獲取當(dāng)前數(shù)據(jù)庫版本?

//MySQL,,mysql -v
select version();
//Oracle 
select * from v$version;

165、說一下 ACID 是什么?

ACID是數(shù)據(jù)庫事務(wù)執(zhí)行的四大基本要素,包括原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。

1、原子性

整個(gè)事務(wù)中的所有操作,要么全部完成,要不全部不完成,不可能停滯在中間某個(gè)環(huán)節(jié)。

事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤,會被roolback回滾到事務(wù)開始前的狀態(tài),就像這個(gè)事務(wù)從未執(zhí)行過一樣。

2、一致性

事務(wù)必須始終保持系統(tǒng)處于一致的狀態(tài),不管在任何給定的時(shí)間并發(fā)事務(wù)有多少。

3、隔離性

隔離狀態(tài)執(zhí)行事務(wù),使他們好像是系統(tǒng)在給定時(shí)間內(nèi)執(zhí)行的唯一操作。

如果有兩個(gè)事務(wù),運(yùn)行在相同的時(shí)間內(nèi),執(zhí)行相同的功能,事務(wù)的隔離性確保每一個(gè)事務(wù)在系統(tǒng)中認(rèn)為只有自己在使用系統(tǒng)。

這種屬性稱為串行化,為了防止事務(wù)操作間的混淆,必須串行化或序列化請求,使得在同一時(shí)間僅有一個(gè)請求用于同一數(shù)據(jù)。

4、持久性

一個(gè)成功的事務(wù)將永久的改變系統(tǒng)的狀態(tài)。

166、char 和 varchar 的區(qū)別是什么?

  1. char的長度是固定的,varchar的長度的可變的;
  2. char的效率比varchar的效率高;
  3. char占用空間比varchar大,char在查詢時(shí)需要使用trim;

167、float 和 double 的區(qū)別是什么?

1、float 和 double 的區(qū)別是什么?

(1)內(nèi)存中占有的字節(jié)數(shù)不同

  • 單精度浮點(diǎn)數(shù)在內(nèi)存中占有4個(gè)字節(jié);
  • 雙精度浮點(diǎn)數(shù)在內(nèi)存中占有8個(gè)字節(jié);

(2)有效數(shù)字位數(shù)不同

  • 單精度浮點(diǎn)數(shù)有效數(shù)字8位;
  • 雙精度浮點(diǎn)數(shù)有效數(shù)字16位;

(3)數(shù)值取值范圍不同

  • 單精度浮點(diǎn)數(shù)的表示范圍:-3.40E+38~3.40E+38
  • 雙精度浮點(diǎn)數(shù)的表示范圍:-1.79E+308~-1.79E+308

(4)在程序中處理速度不同

一般來說,CPU處理單精度浮點(diǎn)數(shù)的速度比雙精度浮點(diǎn)數(shù)的速度快

如果不聲明,默認(rèn)小數(shù)是double類型,如果想用float,要進(jìn)行強(qiáng)轉(zhuǎn);

2、例如

float f = 1.3;會編譯報(bào)錯(cuò),正確的寫法是float f = (float)1.3;或者float a = 1.3f;(f或F都可以不區(qū)分大小寫)

3、注意

float是八位有效數(shù)字,第七位會四舍五入;

4、面試題

(1)java中3*0.1==0.3將會返回什么?true還是false?

答:返回false,因?yàn)楦↑c(diǎn)數(shù)不能完全精確的表示出來,一般會損失精度;

(2)java中float f = 3.4;是否正確?

答:不正確。因?yàn)?.4是雙精度浮點(diǎn)數(shù),將雙精度賦給單精度屬于向下轉(zhuǎn)型,會造成精度損失,因此需要強(qiáng)制類型轉(zhuǎn)換float=(float)3.4;或者寫成float f = 3.4f;

168、Oracle分頁sql

#不帶排序的
SELECT * FROM (
SELECT ROWNUM AS rowno, t.* FROM worker t where ROWNUM <=20) table_alias 
WHERE table_alias.rowno > 10;
#帶排序的
SELECT * FROM (
SELECT tt.*, ROWNUM AS rowno FROM (  
SELECT t.* FROM worker t ORDER BY wkid aSC) tt WHERE ROWNUM <= 20) table_alias 
WHERE table_alias.rowno >= 10;

169、數(shù)據(jù)庫如何保證主鍵唯一性

1、主鍵約束

主鍵列上沒有任何兩行具有相同值(即重復(fù)值),不允許空(NULL);

2、唯一性約束

保證一個(gè)字段或者一組字段里的數(shù)據(jù)都與表中其它行的對應(yīng)數(shù)據(jù)不同。

和主鍵約束不同,唯一性約束允許為null,但是只能有一行;

3、唯一性索引

不允許具有索引值相同的行,從而禁止重復(fù)的索引和鍵值;

4、三者的區(qū)別

  • 約束是用來檢查數(shù)據(jù)的正確性;索引是用來優(yōu)化查詢的;
  • 創(chuàng)建唯一性約束會創(chuàng)建一個(gè)約束和一個(gè)唯一性索引;
  • 創(chuàng)建唯一性索引只會創(chuàng)建一個(gè)唯一性索引;
  • 主鍵約束和唯一性約束都會創(chuàng)建一個(gè)唯一性索引

170、如何設(shè)計(jì)數(shù)據(jù)庫

1、數(shù)據(jù)庫設(shè)計(jì)最起碼要占用這個(gè)項(xiàng)目開發(fā)的40%以上的時(shí)間

2、數(shù)據(jù)庫設(shè)計(jì)不僅僅停留在頁面demo的表面

頁面內(nèi)容所需字段,在數(shù)據(jù)庫設(shè)計(jì)中只是一部分,還有系統(tǒng)運(yùn)轉(zhuǎn)、模塊交互、中轉(zhuǎn)數(shù)據(jù)、表之間的聯(lián)系等等所需要的字段

因此數(shù)據(jù)庫設(shè)計(jì)絕對不是簡單的基本數(shù)據(jù)存儲,還有邏輯數(shù)據(jù)存儲。

3、數(shù)據(jù)庫設(shè)計(jì)完成后,項(xiàng)目80%的設(shè)計(jì)開發(fā)都要存在你的腦海中

每個(gè)字段的設(shè)計(jì)都要有他存在的意義,要清楚的知道程序中如何去運(yùn)用這些字段,多張表的聯(lián)系在程序中是如何體現(xiàn)的。

4、數(shù)據(jù)庫設(shè)計(jì)時(shí)就要考慮效率和優(yōu)化問題

數(shù)據(jù)量大的表示粗粒度的,會冗余一些必要字段,達(dá)到用最少的表,最弱的表關(guān)系去存儲海量的數(shù)據(jù)。

大數(shù)據(jù)的表要建立索引,方便查詢。對于含有計(jì)算、數(shù)據(jù)交互、統(tǒng)計(jì)這類需求時(shí),還有考慮是否有必要采用存儲過程。

5、添加必要的冗余字段

像創(chuàng)建時(shí)間、修改時(shí)間、操作用戶IP、備注這些字段,在每張表中最好都有,一些冗余的字段便于日后維護(hù)、分析、拓展而添加。

6、設(shè)計(jì)合理的表關(guān)聯(lián) 

若兩張表之間的關(guān)系復(fù)雜,建議采用第三張映射表來關(guān)聯(lián)維護(hù)兩張表之間的關(guān)系,以降低表之間的直接耦合度。

7、設(shè)計(jì)表時(shí)不加主外鍵等約束關(guān)聯(lián),系統(tǒng)編碼階段完成后再添加約束性關(guān)聯(lián)

8、選擇合適的主鍵生成策略

數(shù)據(jù)庫的設(shè)計(jì)難度其實(shí)比單純的技術(shù)實(shí)現(xiàn)難很多,他充分體現(xiàn)了一個(gè)人的全局設(shè)計(jì)能力和掌控能力,最后說一句,數(shù)據(jù)庫設(shè)計(jì),很重要,很復(fù)雜。

171、性別是否適合做索引

區(qū)分度不高的字段不適合做索引,因?yàn)樗饕撌切枰虚_銷的,需要存儲的,不過這類字段可以做聯(lián)合索引的一部分。

172、如何查詢重復(fù)的數(shù)據(jù)

1、查詢重復(fù)的單個(gè)字段(group by)

select 重復(fù)字段A, count(*) from 表 group by 重復(fù)字段A having count(*) > 1

2、查詢重復(fù)的多個(gè)字段(group by)

select 重復(fù)字段A, 重復(fù)字段B, count(*) from 表 group by 重復(fù)字段A, 重復(fù)字段B having count(*) > 1

173、數(shù)據(jù)庫一般會采取什么樣的優(yōu)化方法?

1、選取適合的字段屬性

  • 為了獲取更好的性能,可以將表中的字段寬度設(shè)得盡可能小。
  • 盡量把字段設(shè)置成not null執(zhí)行查詢的時(shí)候,數(shù)據(jù)庫不用去比較null值。
  • 對某些省份或者性別字段,將他們定義為enum類型,enum類型被當(dāng)做數(shù)值型數(shù)據(jù)來處理,而數(shù)值型數(shù)據(jù)被處理起來的速度要比文本類型塊很多。

2、使用join連接代替子查詢

3、使用聯(lián)合union來代替手動創(chuàng)建的臨時(shí)表

注意:union用法中,兩個(gè)select語句的字段類型要匹配,而且字段個(gè)數(shù)要相同。

4、事務(wù)

要么都成功,要么都失敗。

可以保證數(shù)據(jù)庫中數(shù)據(jù)的一致性和完整性。

事務(wù)以begin開始,commit關(guān)鍵字結(jié)束。

如果出錯(cuò),rollback命令可以將數(shù)據(jù)庫恢復(fù)到begin開始之前的狀態(tài)。

事務(wù)的另一個(gè)重要作用是當(dāng)多個(gè)用戶同時(shí)使用相同的數(shù)據(jù)源時(shí),它可以利用鎖定數(shù)據(jù)庫的方式為用戶提供一種安全的訪問方式,這樣就可以保證用戶的操作不被其他的用戶干擾。

5、鎖定表

盡管事務(wù)是維護(hù)數(shù)據(jù)庫完整性的一個(gè)非常好的方法,但卻因?yàn)樗莫?dú)占性,有時(shí)會影響數(shù)據(jù)庫的性能,尤其是在大應(yīng)用中。

由于在事務(wù)執(zhí)行的過程中,數(shù)據(jù)庫會被鎖定,因此其它用戶只能暫時(shí)等待直到事務(wù)結(jié)束。

有的時(shí)候可以用鎖定表的方法來獲得更好的性能,

共享鎖:其它用戶只能看,不能修改

lock table person in share mode;

對于通過lock table 命令主動添加的鎖來說,如果要釋放它們,只需發(fā)出rollback命令即可。

6、使用外鍵

鎖定表的方法可以維護(hù)數(shù)據(jù)的完整性,但是它卻不能保證數(shù)據(jù)的關(guān)聯(lián)性,這個(gè)時(shí)候可以使用外鍵。

7、使用索引

索引是提高數(shù)據(jù)庫查詢速度的常用方法,尤其是查詢語句中包含max()、min()、order by這些命令的時(shí)候,性能提高更為顯著。

一般來說索引應(yīng)該建在常用于join、where、order by的字段上。盡量不要對數(shù)據(jù)庫中含有大量重復(fù)的值得字段建立索引。

8、優(yōu)化的查詢語句

在索引的字段上盡量不要使用函數(shù)進(jìn)行操作。

盡量不要使用like關(guān)鍵字和通配符,這樣做法很簡單,但卻是以犧牲性能為代價(jià)的。

避免在查詢中進(jìn)行自動類型轉(zhuǎn)換,因?yàn)轭愋娃D(zhuǎn)換也會使索引失效。

174、索引怎么定義,分哪幾種

  1. b-tree索引,如果不建立索引的情況下,oracle就自動給每一列都加一個(gè)B 樹索引;
  2. normal:普通索引
  3. unique:唯一索引
  4. bitmap:位圖索引,位圖索引特定于只有幾個(gè)枚舉值的情況,比如性別字段;
  5. 基于函數(shù)的索引

175、mysql 的內(nèi)連接、左連接、右連接有什么區(qū)別?

  • 內(nèi)連接,顯示兩個(gè)表中有聯(lián)系的所有數(shù)據(jù);
  • 左鏈接,以左表為參照,顯示所有數(shù)據(jù),右表中沒有則以null顯示
  • 右鏈接,以右表為參照顯示數(shù)據(jù),,左表中沒有則以null顯示

176、RabbitMQ的使用場景有哪些?

1、解決異步問題

例如用戶注冊,發(fā)送郵件和短信反饋?zhàn)猿晒?,可以使用RabbitMQ消息隊(duì)列,用戶無需等待反饋。

2、服務(wù)間解耦

訂單系統(tǒng)和庫存系統(tǒng),中間加入RabbitMQ消息隊(duì)列,當(dāng)庫存系統(tǒng)出現(xiàn)問題時(shí),訂單系統(tǒng)依舊能正常使用,降低服務(wù)間耦合度。

3、秒殺系統(tǒng)

利用RabbitMQ的最大值,實(shí)現(xiàn)秒殺系統(tǒng)。

177、RabbitMQ有哪些重要的角色?有哪些重要的組件?

1、RabbitMQ有哪些重要的角色?

客戶端、RabbitMQ、服務(wù)端。

2、有哪些重要的組件?

(1)connectionFactory(連接管理器)

應(yīng)用程序與RabbitMQ之間建立連接的管理器。

(2)Channel(信道)

消息推送使用的信道。

(3)RoutingKey(路由鍵)

用于把生產(chǎn)者的數(shù)據(jù)分配到交換機(jī)上。

(4)Exchange(交換機(jī))

用于接受和分配消息。

(5)BindKey(綁定鍵)

用于把交換機(jī)的消息綁定到隊(duì)列上

(6)Queue(隊(duì)列)

用于存儲生產(chǎn)者消息。

178、RabbitMQ中 vhost 的作用是什么?

vhost可以理解為mini版的RabbitMQ,其內(nèi)部均含有獨(dú)立的交換機(jī)、綁定、隊(duì)列,最重要的是擁有獨(dú)立的權(quán)限系統(tǒng),可以做到vhost范圍內(nèi)的用戶控制。

從RabbitMQ全局考慮,不同的應(yīng)用可以跑在不同的vhost上,作為不同權(quán)限隔離的手段。

179、說一下 jvm 的主要組成部分?及其作用?

JVM包括類加載子系統(tǒng)、堆、方法區(qū)、棧、本地方法棧、程序計(jì)數(shù)器、直接內(nèi)存、垃圾回收器、執(zhí)行引擎。

1、類加載子系統(tǒng)

類加載子系統(tǒng)負(fù)責(zé)加載class信息,加載的類信息存放于方法區(qū)中。

2、直接內(nèi)存

直接內(nèi)存是在Java堆外的、直接向系統(tǒng)申請的內(nèi)存空間。訪問直接內(nèi)存的速度會由于Java堆。

出于性能的考慮,讀寫頻繁的場合可能會考慮使用直接內(nèi)存。

3、垃圾回收器

垃圾回收器可以對堆、方法區(qū)、直接內(nèi)存進(jìn)行回收。

4、執(zhí)行引擎

執(zhí)行引擎負(fù)責(zé)執(zhí)行虛擬機(jī)的字節(jié)碼,虛擬機(jī)會使用即時(shí)編譯技術(shù)將方法編譯成機(jī)器碼后再執(zhí)行。

180、說一下 jvm 運(yùn)行時(shí)數(shù)據(jù)區(qū)?

運(yùn)行時(shí)數(shù)據(jù)區(qū)包括堆、方法區(qū)、棧、本地方法棧、程序計(jì)數(shù)器。

1、堆

堆解決的是對象實(shí)例存儲的問題,垃圾回收器管理的主要區(qū)域。

2、方法區(qū)

方法區(qū)可以認(rèn)為是堆的一部分,用于存儲已被虛擬機(jī)加載的信息,常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼。

3、棧

棧解決的是程序運(yùn)行的問題,棧里面存的是棧幀,棧幀里面存的是局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。

(1)棧幀

每個(gè)方法從調(diào)用到執(zhí)行的過程就是一個(gè)棧幀在虛擬機(jī)棧中入棧到出棧的過程。

(2)局部變量表

用于保存函數(shù)的參數(shù)和局部變量。

(3)操作數(shù)棧

操作數(shù)棧又稱操作棧,大多數(shù)指令都是從這里彈出數(shù)據(jù),執(zhí)行運(yùn)算,然后把結(jié)果壓回操作數(shù)棧。

4、本地方法棧

與棧功能相同,本地方法棧執(zhí)行的是本地方法,一個(gè)Java調(diào)用非Java代碼的接口。

5、程序計(jì)數(shù)器(PC寄存器)

程序計(jì)數(shù)器中存放的是當(dāng)前線程所執(zhí)行的字節(jié)碼的行數(shù)。JVM工作時(shí)就是通過改變這個(gè)計(jì)數(shù)器的值來選取下一個(gè)需要執(zhí)行的字節(jié)碼指令。

到此這篇關(guān)于Java經(jīng)典面試題最全匯總208道(五)的文章就介紹到這了,更多相關(guān)Java面試題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spark SQL 編程初級實(shí)踐詳解

    Spark SQL 編程初級實(shí)踐詳解

    這篇文章主要為大家介紹了Spark SQL 編程初級實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java中Base64和File之間互轉(zhuǎn)代碼示例

    Java中Base64和File之間互轉(zhuǎn)代碼示例

    這篇文章主要給大家介紹了關(guān)于Java中Base64和File之間互轉(zhuǎn)的相關(guān)資料,Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的方法,需要的朋友可以參考下
    2023-08-08
  • Java多線程中ReentrantLock與Condition詳解

    Java多線程中ReentrantLock與Condition詳解

    這篇文章主要介紹了Java多線程中ReentrantLock與Condition詳解,需要的朋友可以參考下
    2017-11-11
  • 基于Springboot疫苗接種行程管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

    基于Springboot疫苗接種行程管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

    本文主要介紹了基于Springboot實(shí)現(xiàn)的疫苗接種行程管理系統(tǒng)的示例代碼,系統(tǒng)主要實(shí)現(xiàn)個(gè)人疫苗接種管理、行程管理、病史管理、風(fēng)險(xiǎn)地區(qū)管理、核酸檢測報(bào)告結(jié)果上報(bào)、疫情新聞管理等功能,需要的可以參考一下
    2022-03-03
  • Flask接口如何返回JSON格式數(shù)據(jù)自動解析

    Flask接口如何返回JSON格式數(shù)據(jù)自動解析

    這篇文章主要介紹了Flask接口如何返回JSON格式數(shù)據(jù)自動解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • JDK8新特性之判空遍歷寫法

    JDK8新特性之判空遍歷寫法

    這篇文章主要介紹了JDK8新特性之判空遍歷寫法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java實(shí)現(xiàn)調(diào)用外部程序的示例代碼

    Java實(shí)現(xiàn)調(diào)用外部程序的示例代碼

    本文主要介紹了Java實(shí)現(xiàn)調(diào)用外部程序的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • java 中Thread.join()的使用方法

    java 中Thread.join()的使用方法

    這篇文章主要介紹了java 中Thread.join()的使用方法的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java通過導(dǎo)出超大Excel文件解決內(nèi)存溢出問題

    Java通過導(dǎo)出超大Excel文件解決內(nèi)存溢出問題

    導(dǎo)出excel是咱Java開發(fā)的必備技能,下面這篇文章主要給大家介紹了關(guān)于Java通過導(dǎo)出超大Excel文件解決內(nèi)存溢出問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Java實(shí)現(xiàn)批量查找與替換Excel文本的思路詳解

    Java實(shí)現(xiàn)批量查找與替換Excel文本的思路詳解

    在 Java 中,可以通過find和replace的方法來查找和替換單元格的數(shù)據(jù),下面小編將以Excel文件為例為大家介紹如何實(shí)現(xiàn)Excel文件內(nèi)容的批量替換,感興趣的朋友跟隨小編一起看看吧
    2023-10-10

最新評論