自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

被美團(tuán)【面試官】榨干了!

開(kāi)發(fā) 前端
索引的類型有哈希索引,B+樹(shù)索引,而hash索引的時(shí)間復(fù)雜度是o1,那為什么我們一般情況下不使用哈希索引,而使用b+樹(shù)索引呢?

大家好,我是Tom哥。

今天分享一份美團(tuán)春招實(shí)習(xí)的 Java 崗的面經(jīng),總共被問(wèn)了接近 50 個(gè)八股文,問(wèn)了非常多 Java 框架和 Java 并發(fā)的問(wèn)題

面試時(shí)長(zhǎng)超過(guò)了 1 個(gè)小時(shí),感覺(jué)被榨干了。

MySQL

可重復(fù)讀和已提交讀隔離級(jí)別表現(xiàn)的現(xiàn)象是什么,區(qū)別是什么樣的?

已提交讀只能讀取其他事務(wù)已經(jīng)提交的數(shù)據(jù),但是這個(gè)隔離級(jí)別就會(huì)造成一個(gè)不可重復(fù)讀和幻讀的現(xiàn)象,可重復(fù)讀就是消除了不可重復(fù)讀和幻讀的現(xiàn)象。

補(bǔ)充:

  • 讀提交,指一個(gè)事務(wù)提交之后,它做的變更才能被其他事務(wù)看到,會(huì)有不可重復(fù)讀、幻讀的問(wèn)題。
  • 可重復(fù)讀,指一個(gè)事務(wù)執(zhí)行過(guò)程中看到的數(shù)據(jù),一直跟這個(gè)事務(wù)啟動(dòng)時(shí)看到的數(shù)據(jù)是一致的,MySQL InnoDB 引擎的默認(rèn)隔離級(jí)別,解決了不可重復(fù)讀的問(wèn)題,并且以很大程度上避免幻讀現(xiàn)象的發(fā)生。

數(shù)據(jù)文件大體分成哪幾種數(shù)據(jù)文件?

因?yàn)槭蔷鄞厮饕灾挥幸粋€(gè)文件,索引和數(shù)據(jù)是放在一起的,就是一個(gè)bd文件。

補(bǔ)充:我們每創(chuàng)建一個(gè) database(數(shù)據(jù)庫(kù)) 都會(huì)在 /var/lib/mysql/ 目錄里面創(chuàng)建一個(gè)以 database 為名的目錄,然后保存表結(jié)構(gòu)和表數(shù)據(jù)的文件都會(huì)存放在這個(gè)目錄里。

比如,我這里有一個(gè)名為 my_test 的 database,該 database 里有一張名為 t_order 數(shù)據(jù)庫(kù)表。

圖片

然后,我們進(jìn)入 /var/lib/mysql/my_test 目錄,看看里面有什么文件?

[root@xiaolin ~]#ls /var/lib/mysql/my_test
db.opt  
t_order.frm  
t_order.ibd

可以看到,共有三個(gè)文件,這三個(gè)文件分別代表著:

  • db.opt,用來(lái)存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)的默認(rèn)字符集和字符校驗(yàn)規(guī)則。
  • t_order.frm ,t_order 的表結(jié)構(gòu)會(huì)保存在這個(gè)文件。在 MySQL 中建立一張表都會(huì)生成一個(gè).frm 文件,該文件是用來(lái)保存每個(gè)表的元數(shù)據(jù)信息的,主要包含表結(jié)構(gòu)定義。
  • t_order.ibd,t_order 的表數(shù)據(jù)會(huì)保存在這個(gè)文件。表數(shù)據(jù)既可以存在共享表空間文件(文件名:ibdata1)里,也可以存放在獨(dú)占表空間文件(文件名:表名字.ibd)。這個(gè)行為是由參數(shù) innodb_file_per_table 控制的,若設(shè)置了參數(shù) innodb_file_per_table 為 1,則會(huì)將存儲(chǔ)的數(shù)據(jù)、索引等信息單獨(dú)存儲(chǔ)在一個(gè)獨(dú)占表空間,從 MySQL 5.6.6 版本開(kāi)始,它的默認(rèn)值就是 1 了,因此從這個(gè)版本之后, MySQL 中每一張表的數(shù)據(jù)都存放在一個(gè)獨(dú)立的 .ibd 文件。

mysql日志文件是分成了哪幾種?

mysql有三種日志文件,binlog,redolog和undolog。

補(bǔ)充:

  • redo log 重做日志,確保事務(wù)的持久性
  • undo log 回滾日志,確保事務(wù)的原子性,用于回滾事務(wù),同時(shí)提供mvcc下的非鎖定讀
  • bin log 二進(jìn)制日志,用于主從復(fù)制場(chǎng)景下,記錄master做過(guò)的操作
  • relay log 中繼日志,用于主從復(fù)制場(chǎng)景下,slave通過(guò)io線程拷貝master的bin log后本地生成的日志
  • 慢查詢?nèi)罩荆糜谟涗泩?zhí)行時(shí)間過(guò)長(zhǎng)的sql,需要設(shè)置閾值后手動(dòng)開(kāi)啟

說(shuō)下MVCC機(jī)制的原理?

MVCC就是多版本并發(fā)控制,實(shí)現(xiàn)了讀寫(xiě)的并發(fā)控制,在mysql通過(guò)readview 隱藏字段和undolog實(shí)現(xiàn)了,比如在可重復(fù)讀里面,比如開(kāi)啟了一個(gè)事務(wù),就生成了一個(gè)readview,然后記錄現(xiàn)在active的事務(wù),判斷查詢的數(shù)據(jù)在這個(gè)事務(wù)可不可讀。

索引的類型有哈希索引,B+樹(shù)索引,而hash索引的時(shí)間復(fù)雜度是o1,那為什么我們一般情況下不使用哈希索引,而使用b+樹(shù)索引呢?

因?yàn)閔ash索引只能做一個(gè)等值查詢,像范圍查詢是做不到的。還有哈??赡軙?huì)出現(xiàn)hash碰撞的問(wèn)題。

還能想到其他的原因嗎?

想不到了

補(bǔ)充:

  • 哈希索引的key是經(jīng)過(guò)hash運(yùn)算得出的,即跟實(shí)際數(shù)據(jù)的值沒(méi)有關(guān)系,因此哈希索引不適用于范圍查詢和排序操作
  • 容易導(dǎo)致全表掃描,因?yàn)榭赡艽嬖诓煌膋ey經(jīng)過(guò)hash運(yùn)算后值相同
  • 索引列上的值相同的話,易造成hash沖突,效率低下

對(duì)一個(gè)慢sql怎么去排查?

如果是在項(xiàng)目中,可以通過(guò)SpringAOP去查詢這個(gè)接口運(yùn)行的時(shí)間,如果是一個(gè)sql,可以通過(guò)explain的指令去查這個(gè)sql的執(zhí)行計(jì)劃。

補(bǔ)充:

可通過(guò)開(kāi)啟mysql的慢日志查詢,設(shè)置好時(shí)間閾值,進(jìn)行捕獲

索引字段是不是建的越多越好

不是,建的的越多會(huì)占用越多的空間

補(bǔ)充:

索引越多,在寫(xiě)入頻繁的場(chǎng)景下,對(duì)于B+樹(shù)的維護(hù)所付出的性能消耗也會(huì)越大

網(wǎng)絡(luò)

http協(xié)議的報(bào)文的格式有了解嗎?

不是太清楚,有報(bào)文頭,報(bào)文體,如果是post請(qǐng)求就會(huì)在報(bào)文體寫(xiě)上數(shù)據(jù)。

補(bǔ)充:

圖片

HTTP 請(qǐng)求報(bào)文結(jié)構(gòu)

HTTP 的請(qǐng)求報(bào)文分為三個(gè)部分:

請(qǐng)求行、首部行、實(shí)體主體。

http常用的狀態(tài)碼?

4XX是請(qǐng)求報(bào)文有誤,5XX是服務(wù)器有錯(cuò),2XX是成功的。3XX忘了(是重定向

補(bǔ)充:

RFC 規(guī)定 HTTP 的狀態(tài)碼為三位數(shù),被分為五類:

  • 1xx:表示目前是協(xié)議處理的中間狀態(tài),還需要后續(xù)操作
  • 2xx:表示成功狀態(tài)
  • 3xx:重定向狀態(tài),資源位置發(fā)生變動(dòng),需要重新請(qǐng)求
  • 4xx:請(qǐng)求報(bào)文有誤
  • 5xx:服務(wù)端發(fā)生錯(cuò)誤

Java框架

java這一塊對(duì)框架都是熟悉的吧?

只用過(guò)SSM,SpringBoot還在學(xué)中。

MyBatis運(yùn)用了哪些常見(jiàn)的設(shè)計(jì)模式?

運(yùn)用了工廠模式,創(chuàng)建sqlsession的時(shí)候用了工廠模式,其他的沒(méi)想起來(lái)。

補(bǔ)充:

  • 工廠模式,工廠模式在 MyBatis 中的典型代表是 SqlSessionFactory
  • 建造者模式,建造者模式在 MyBatis 中的典型代表是 SqlSessionFactoryBuilder
  • 單例模式,單例模式在 MyBatis 中的典型代表是 ErrorContext
  • 適配器模式,適配器模式在 MyBatis 中的典型代表是 Log
  • 代理模式,代理模式在 MyBatis 中的典型代表是 MapperProxyFactory
  • 模板方法模式,模板方法在 MyBatis 中的典型代表是 BaseExecutor
  • 裝飾器模式,裝飾器模式在 MyBatis 中的典型代表是 Cache

MyBatis中創(chuàng)建了一個(gè)Mapper接口,在寫(xiě)一個(gè)xml文件,java的接口是要實(shí)現(xiàn)的,為什么這沒(méi)有實(shí)現(xiàn)呢?

(現(xiàn)在回想起來(lái),是要誘導(dǎo)我說(shuō)動(dòng)態(tài)代理)一個(gè)mapper接口通過(guò)namespace的id對(duì)應(yīng)的就是一個(gè)xml的文件。沒(méi)了解背后的原理

補(bǔ)充:

MyBatis中的Mapper接口并不需要實(shí)現(xiàn),它只是定義了一組方法簽名。MyBatis會(huì)根據(jù)Mapper接口中的方法名、參數(shù)類型和返回值類型,自動(dòng)生成實(shí)現(xiàn)方法。因此,Mapper接口中的方法不需要實(shí)現(xiàn),也不需要在該接口中編寫(xiě)任何方法體。

相反,你需要編寫(xiě)一個(gè)與Mapper接口同名的XML文件,來(lái)實(shí)現(xiàn)這些方法的具體SQL操作。這樣,當(dāng)你在Java代碼中調(diào)用Mapper接口中的方法時(shí),MyBatis會(huì)自動(dòng)將該方法映射到對(duì)應(yīng)的XML文件中的SQL語(yǔ)句,并執(zhí)行該語(yǔ)句。

與傳統(tǒng)的JDBC相比,MyBatis的優(yōu)點(diǎn)?

有些功能封裝的更好,像打開(kāi)一個(gè)sqlsession的連接,而且寫(xiě)的代碼要少

補(bǔ)充:

  • mybatis的全局配置文件中可以設(shè)置數(shù)據(jù)庫(kù)連接池,和spring整合可以配置數(shù)據(jù)庫(kù)連接
  • mybatis把sql和代碼分離,提供了Mapper.xml映射文件,在映射文件中通過(guò)標(biāo)簽來(lái)寫(xiě)sql
  • mybatis中自動(dòng)完成java對(duì)象和sql中參數(shù)的映射
  • mybatis中通過(guò)ResultSetHandler自動(dòng)將結(jié)果集映射到對(duì)應(yīng)的java對(duì)象中

還記得JDBC連接數(shù)據(jù)庫(kù)的步驟嗎?

不記得了,太久沒(méi)用JDBC

補(bǔ)充:

使用JDBC連接數(shù)據(jù)庫(kù)的步驟如下:

  • 加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序:使用Class.forName()方法加載對(duì)應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,例如:Class.forName("com.mysql.jdbc.Driver");
  • 建立數(shù)據(jù)庫(kù)連接:使用DriverManager.getConnection()方法建立與數(shù)據(jù)庫(kù)的連接,需要指定數(shù)據(jù)庫(kù)的URL、用戶名和密碼,例如:Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "username", "password");
  • 創(chuàng)建Statement對(duì)象:使用Connection對(duì)象的createStatement()方法創(chuàng)建一個(gè)Statement對(duì)象,用于執(zhí)行SQL語(yǔ)句,例如:Statement stmt = conn.createStatement();
  • 執(zhí)行SQL語(yǔ)句:使用Statement對(duì)象的executeQuery()或executeUpdate()方法執(zhí)行SQL語(yǔ)句,例如:ResultSet rs = stmt.executeQuery("SELECT * FROM mytable");
  • 處理查詢結(jié)果:如果執(zhí)行的是查詢語(yǔ)句,需要使用ResultSet對(duì)象來(lái)處理查詢結(jié)果,例如:while (rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); }
  • 關(guān)閉數(shù)據(jù)庫(kù)連接:在程序結(jié)束時(shí),需要使用Connection對(duì)象的close()方法關(guān)閉數(shù)據(jù)庫(kù)連接,例如:conn.close();

怎么理解SpringIoc?

SpringIoc就是控制反轉(zhuǎn),把創(chuàng)建對(duì)象的權(quán)力交給了框架,然后Spring通過(guò)反射就會(huì)創(chuàng)建一個(gè)對(duì)象。當(dāng)我創(chuàng)建的一個(gè)類要用到這個(gè)對(duì)象,Spring就會(huì)把這個(gè)對(duì)象交給我。

如果讓你設(shè)計(jì)一個(gè)SpringIoc,你覺(jué)得會(huì)從哪些方面考慮這個(gè)設(shè)計(jì)?

  • 多線程,這個(gè)對(duì)象是單例的還是每個(gè)線程都特有的。
  • 可能會(huì)有循環(huán)依賴的問(wèn)題,像對(duì)象A有B的引用,然后對(duì)象B有A的引用
  • bean的生命周期也需要考慮。

補(bǔ)充:

  1. Bean的生命周期管理:需要設(shè)計(jì)Bean的創(chuàng)建、初始化、銷毀等生命周期管理機(jī)制,可以考慮使用工廠模式和單例模式來(lái)實(shí)現(xiàn)。
  2. 依賴注入:需要實(shí)現(xiàn)依賴注入的功能,包括屬性注入、構(gòu)造函數(shù)注入、方法注入等,可以考慮使用反射機(jī)制和XML配置文件來(lái)實(shí)現(xiàn)。
  3. Bean的作用域:需要支持多種Bean作用域,比如單例、原型、會(huì)話、請(qǐng)求等,可以考慮使用Map來(lái)存儲(chǔ)不同作用域的Bean實(shí)例。
  4. AOP功能的支持:需要支持AOP功能,可以考慮使用動(dòng)態(tài)代理機(jī)制和切面編程來(lái)實(shí)現(xiàn)。
  5. 異常處理:需要考慮異常處理機(jī)制,包括Bean創(chuàng)建異常、依賴注入異常等,可以考慮使用try-catch機(jī)制來(lái)處理異常。
  6. 配置文件加載:需要支持從不同的配置文件中加載Bean的相關(guān)信息,可以考慮使用XML、注解或者Java配置類來(lái)實(shí)現(xiàn)。

Spring給我們提供了很多擴(kuò)展點(diǎn),這些有了解嗎?

不太清楚擴(kuò)展點(diǎn)指的什么

補(bǔ)充:

Spring框架提供了許多擴(kuò)展點(diǎn),使得開(kāi)發(fā)者可以根據(jù)需求定制和擴(kuò)展Spring的功能。以下是一些常用的擴(kuò)展點(diǎn):

  1. BeanFactoryPostProcessor:允許在Spring容器實(shí)例化bean之前修改bean的定義。常用于修改bean屬性或改變bean的作用域。
  2. BeanPostProcessor:可以在bean實(shí)例化、配置以及初始化之后對(duì)其進(jìn)行額外處理。常用于代理bean、修改bean屬性等。
  3. PropertySource:用于定義不同的屬性源,如文件、數(shù)據(jù)庫(kù)等,以便在Spring應(yīng)用中使用。
  4. ImportSelector和ImportBeanDefinitionRegistrar:用于根據(jù)條件動(dòng)態(tài)注冊(cè)bean定義,實(shí)現(xiàn)配置類的模塊化。
  5. Spring MVC中的HandlerInterceptor:用于攔截處理請(qǐng)求,可以在請(qǐng)求處理前、處理中和處理后執(zhí)行特定邏輯。
  6. Spring MVC中的ControllerAdvice:用于全局處理控制器的異常、數(shù)據(jù)綁定和數(shù)據(jù)校驗(yàn)。
  7. Spring Boot的自動(dòng)配置:通過(guò)創(chuàng)建自定義的自動(dòng)配置類,可以實(shí)現(xiàn)對(duì)框架和第三方庫(kù)的自動(dòng)配置。
  8. 自定義注解:創(chuàng)建自定義注解,用于實(shí)現(xiàn)特定功能或約定,如權(quán)限控制、日志記錄等。

servlet有寫(xiě)過(guò)簡(jiǎn)單的代碼嗎?

沒(méi)用框架之前,就用的servlet,用了框架就用的框架

大致了解SpringMVC的處理流程嗎?

首先通過(guò)一個(gè)dispatchservlet去轉(zhuǎn)接請(qǐng)求,到handlermapping去返回一個(gè)執(zhí)行鏈,就比如攔截器到哪個(gè)controller,返回以后就到handler適配器獲取這個(gè)請(qǐng)求要求的controller,然后去controller這里返回一個(gè)數(shù)據(jù)或者頁(yè)面modelandview,然后給前端。

SpringAOP主要想解決什么問(wèn)題

提供了一個(gè)擴(kuò)展功能,可以一個(gè)類的某個(gè)方法進(jìn)行加強(qiáng),比如在之前加強(qiáng),在之后加強(qiáng),環(huán)繞加強(qiáng)。

補(bǔ)充:

Spring AOP主要解決的是橫切關(guān)注點(diǎn)的問(wèn)題,即在一個(gè)系統(tǒng)中,可能存在多個(gè)模塊或組件都需要實(shí)現(xiàn)類似的功能,比如日志記錄、權(quán)限校驗(yàn)、事務(wù)管理等等。如果每個(gè)模塊都去實(shí)現(xiàn)這些功能,就會(huì)導(dǎo)致代碼冗余,可維護(hù)性和可擴(kuò)展性降低。而AOP則是基于動(dòng)態(tài)代理的機(jī)制,在不修改原有代碼的情況下,通過(guò)在代碼執(zhí)行前后插入增強(qiáng)代碼的方式,實(shí)現(xiàn)對(duì)橫切關(guān)注點(diǎn)的統(tǒng)一處理,從而提高代碼的復(fù)用性和可維護(hù)性。

SpringAOP的原理了解嗎

基于一個(gè)動(dòng)態(tài)代理的設(shè)計(jì)模式,如果動(dòng)態(tài)加強(qiáng)的類實(shí)現(xiàn)了某個(gè)接口,就會(huì)用JDK動(dòng)態(tài)代理,如果是對(duì)于沒(méi)有實(shí)現(xiàn)接口的類,就會(huì)用cglib動(dòng)態(tài)代理模板,去生成一個(gè)被代理對(duì)象的一個(gè)子類來(lái)作為代理對(duì)象。

補(bǔ)充:

Spring AOP的主要目的是將橫切關(guān)注點(diǎn)(如日志、安全和事務(wù)管理等)從業(yè)務(wù)邏輯中分離出來(lái),從而提高代碼的模塊性和可維護(hù)性。

原理主要包括以下幾個(gè)方面:

  1. 代理模式:Spring AOP基于代理模式實(shí)現(xiàn),主要有兩種代理方式,JDK動(dòng)態(tài)代理和CGLIB代理。JDK動(dòng)態(tài)代理要求目標(biāo)類必須實(shí)現(xiàn)接口,而CGLIB代理則可以針對(duì)沒(méi)有實(shí)現(xiàn)接口的類進(jìn)行代理。
  2. 切面(Aspect):切面是將橫切關(guān)注點(diǎn)模塊化的實(shí)現(xiàn)。切面通常包含通知(Advice)和切點(diǎn)(Pointcut)。通知是在特定的切點(diǎn)執(zhí)行的動(dòng)作,切點(diǎn)則用于定義通知應(yīng)該在何處執(zhí)行。
  3. 連接點(diǎn)(Joinpoint):連接點(diǎn)代表在應(yīng)用程序中可以插入切面的點(diǎn),如方法調(diào)用、異常處理等。
  4. 織入(Weaving):織入是將切面應(yīng)用到目標(biāo)對(duì)象的過(guò)程,從而創(chuàng)建代理對(duì)象。在Spring AOP中,織入過(guò)程發(fā)生在運(yùn)行時(shí)。

通過(guò)以上原理,Spring AOP能夠在不修改原有業(yè)務(wù)代碼的情況下,將橫切關(guān)注點(diǎn)進(jìn)行模塊化管理,提高代碼的可讀性和易維護(hù)性。

動(dòng)態(tài)代理和靜態(tài)代理的區(qū)別

靜態(tài)代理是自己手寫(xiě)一個(gè)代理類,但是動(dòng)態(tài)代理不需要直接實(shí)現(xiàn)這個(gè)代理類的,相當(dāng)于靜態(tài)代理在編譯的時(shí)候就已經(jīng)變成了一個(gè)個(gè)二進(jìn)制文件了,動(dòng)態(tài)代理在運(yùn)行的時(shí)候動(dòng)態(tài)生成類的字節(jié)碼文件。

動(dòng)態(tài)代理中如果有實(shí)現(xiàn)了接口,就會(huì)用JDK動(dòng)態(tài)代理呢?

不太了解(后來(lái)查了應(yīng)該是因?yàn)镴DK動(dòng)態(tài)代理會(huì)繼承Proxy類,但是java是單繼承)

代理模式和適配器模式有什么區(qū)別?

代理模式主要是去加強(qiáng)一個(gè)類的方法。適配器模式是接口轉(zhuǎn)換成一個(gè)想要的接口(這個(gè)問(wèn)題被面試說(shuō)回答的不好)

補(bǔ)充:

代理模式和適配器模式是兩種常用的設(shè)計(jì)模式,它們的區(qū)別主要體現(xiàn)在以下幾個(gè)方面:

  1. 作用不同:代理模式是為了控制對(duì)對(duì)象的訪問(wèn),而適配器模式是為了解決接口不匹配的問(wèn)題。
  2. 解決問(wèn)題的角度不同:代理模式是從外部控制訪問(wèn),保護(hù)目標(biāo)對(duì)象,而適配器模式是從內(nèi)部改變對(duì)象接口,讓其能夠適配客戶端的要求。
  3. 實(shí)現(xiàn)方式不同:代理模式通常使用面向?qū)ο蟮睦^承或者組合方式實(shí)現(xiàn),而適配器模式則通常使用對(duì)象組合方式實(shí)現(xiàn)。
  4. 適用場(chǎng)景不同:代理模式適用于需要對(duì)對(duì)象進(jìn)行控制和保護(hù)的情況,例如遠(yuǎn)程代理、虛擬代理等。適配器模式適用于需要將一個(gè)類的接口轉(zhuǎn)換成客戶端期望的另一個(gè)接口的情況,例如舊系統(tǒng)的升級(jí)改造、不兼容接口的統(tǒng)一等。

java 并發(fā)

java線程的生命周期有了解嗎?

new就是創(chuàng)建一個(gè)線程,變成ready的狀態(tài),如果分配到時(shí)間片,就會(huì)是一個(gè)運(yùn)行的狀態(tài),等待其他線程做出一個(gè)動(dòng)作就是waiting的狀態(tài),如果是等待其他資源的釋放,就是block的狀態(tài),最后是一個(gè)終止的狀態(tài)。

使用多線程要注意哪些問(wèn)題?

避免死鎖,保證數(shù)據(jù)的可見(jiàn)性或者多個(gè)線程對(duì)這個(gè)數(shù)據(jù)的一致性。

保證數(shù)據(jù)的一致性有哪些方案呢?

比如有violate修飾一個(gè)變量,或者sychonized或者加鎖。

線程池有了解嗎?線程池大概的原理?

分為核心線程池,線程池的最大容量,還有等待任務(wù)的隊(duì)列,提交一個(gè)任務(wù),如果核心線程沒(méi)有滿,就創(chuàng)建一個(gè)線程,如果滿了,就是會(huì)加入等待隊(duì)列,如果等待隊(duì)列滿了,就會(huì)增加線程,如果達(dá)到最大線程數(shù)量,如果都達(dá)到最大線程數(shù)量,就會(huì)按照一些丟棄的策略進(jìn)行處理。

ArrayList和LinkedList有什么區(qū)別

ArrayList通過(guò)數(shù)組存儲(chǔ)數(shù)據(jù),如果查詢的話是會(huì)快速定位到這個(gè)數(shù)據(jù),但是新增和刪除數(shù)據(jù)會(huì)涉及數(shù)據(jù)的移動(dòng),像linkedList就是雙向鏈表,定位數(shù)據(jù)會(huì)一個(gè)個(gè)查,新增和刪除是一個(gè)o1。

補(bǔ)充:

ArrayList和LinkedList是Java中的兩種常用的List實(shí)現(xiàn),它們的區(qū)別主要體現(xiàn)在底層數(shù)據(jù)結(jié)構(gòu)、性能和使用場(chǎng)景上:

  1. 底層數(shù)據(jù)結(jié)構(gòu):ArrayList基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn),LinkedList基于雙向鏈表實(shí)現(xiàn)。
  2. 插入和刪除操作性能:
  • ArrayList:在插入和刪除元素時(shí),需要移動(dòng)元素以保持?jǐn)?shù)組的連續(xù)性,所以在非尾部的插入和刪除操作性能較差,時(shí)間復(fù)雜度為O(n)。
  • LinkedList:由于基于鏈表實(shí)現(xiàn),插入和刪除元素只需修改指針,所以在任何位置的插入和刪除操作性能較好,時(shí)間復(fù)雜度為O(1)。
  1. 訪問(wèn)和查找操作性能:
  • ArrayList:由于基于數(shù)組實(shí)現(xiàn),支持隨機(jī)訪問(wèn),訪問(wèn)和查找元素的時(shí)間復(fù)雜度為O(1)。
  • LinkedList:由于基于鏈表實(shí)現(xiàn),需要順序遍歷鏈表,訪問(wèn)和查找元素的時(shí)間復(fù)雜度為O(n)。
  1. 內(nèi)存占用:
  • ArrayList:內(nèi)存占用相對(duì)較小,因?yàn)橹恍璐鎯?chǔ)元素本身。
  • LinkedList:由于需要存儲(chǔ)額外的指針信息(前后節(jié)點(diǎn)指針),內(nèi)存占用相對(duì)較大。
  1. 使用場(chǎng)景:
  • ArrayList:更適合頻繁訪問(wèn)和查找元素的場(chǎng)景,如查詢操作較多的情況。
  • LinkedList:更適合頻繁插入和刪除元素的場(chǎng)景,如在列表中間進(jìn)行大量的增刪操作。

ArrayList線程安全嗎?把ArrayList變成線程安全有哪些方法?

線程不安全,使用它的線程安全類Vector(被問(wèn)還有呢?)

補(bǔ)充:

將ArrayList變成線程安全有幾種方法:

  1. 使用Collections.synchronizedList()方法將ArrayList轉(zhuǎn)換為線程安全的List。該方法會(huì)返回一個(gè)線程安全的List,使用該List時(shí)需要在訪問(wèn)它的方法上添加synchronized關(guān)鍵字,以保證多線程訪問(wèn)的安全性。
  2. 使用CopyOnWriteArrayList類來(lái)代替ArrayList。CopyOnWriteArrayList是一種線程安全的List實(shí)現(xiàn),它通過(guò)在寫(xiě)操作時(shí)復(fù)制整個(gè)數(shù)組來(lái)保證線程安全性,在讀操作時(shí)不需要加鎖,因此可以提高讀取效率。
  3. 使用Lock接口來(lái)實(shí)現(xiàn)同步??梢允褂肦eentrantLock類來(lái)實(shí)現(xiàn)對(duì)ArrayList的同步操作,該類提供了與synchronized類似的功能,但是具有更高的靈活性。比如可以使用tryLock()方法來(lái)嘗試獲取鎖,避免了線程的長(zhǎng)時(shí)間等待。
  4. 使用讀寫(xiě)鎖來(lái)實(shí)現(xiàn)同步??梢允褂肦eentrantReadWriteLock類來(lái)實(shí)現(xiàn)對(duì)ArrayList的讀寫(xiě)操作的同步。該類提供了讀鎖和寫(xiě)鎖兩種鎖,多個(gè)線程可以同時(shí)獲取讀鎖,但是只有一個(gè)線程可以獲取寫(xiě)鎖,在寫(xiě)操作時(shí)需要先獲取寫(xiě)鎖,以保證線程安全。

其他

對(duì)面向?qū)ο蟮睦斫猓?/span>

像面向過(guò)程就是把問(wèn)題分解成一個(gè)一個(gè)函數(shù),然后調(diào)用函數(shù)去解決問(wèn)題。而面向?qū)ο缶褪前堰@個(gè)世界抽象成一個(gè)一個(gè)對(duì)象,然后賦予這些對(duì)象一個(gè)屬性,成員變量和方法,然后去調(diào)用對(duì)象的方法去解決問(wèn)題,耦合性比較低。

面向過(guò)程的方法存在哪些問(wèn)題?

耦合度比較高,分工不好分工。

補(bǔ)充:

  1. 可維護(hù)性較差:面向過(guò)程編程主要依賴于函數(shù)和過(guò)程,隨著代碼規(guī)模的增大,可能會(huì)導(dǎo)致代碼結(jié)構(gòu)復(fù)雜,不易維護(hù)。
  2. 可復(fù)用性較低:面向過(guò)程編程難以實(shí)現(xiàn)模塊化,導(dǎo)致代碼難以復(fù)用,進(jìn)一步增加開(kāi)發(fā)時(shí)間和成本。
  3. 擴(kuò)展性不足:面向過(guò)程編程在代碼邏輯發(fā)生變化時(shí),往往需要對(duì)程序進(jìn)行大量的修改,這樣的代碼擴(kuò)展性不足。
  4. 抽象能力有限:面向過(guò)程編程主要關(guān)注過(guò)程和算法,而不是數(shù)據(jù)結(jié)構(gòu)和對(duì)象,這使得它在表達(dá)現(xiàn)實(shí)世界的復(fù)雜問(wèn)題時(shí)抽象能力有限。
  5. 封裝性差:面向過(guò)程編程沒(méi)有提供良好的封裝機(jī)制,程序中的數(shù)據(jù)和處理過(guò)程容易暴露,可能導(dǎo)致數(shù)據(jù)安全性和程序穩(wěn)定性問(wèn)題。
  6. 強(qiáng)耦合:面向過(guò)程編程的方法往往導(dǎo)致程序組件之間存在強(qiáng)耦合,當(dāng)一個(gè)組件發(fā)生變化時(shí),可能會(huì)影響其他組件的正常工作。

面向過(guò)程好處是什么?

解決問(wèn)題思路比較簡(jiǎn)單。

補(bǔ)充:

  • 面向過(guò)程編程采用自頂向下的編程方式,將問(wèn)題分解為一個(gè)個(gè)小的模塊,便于理解和編寫(xiě)。
  • 每個(gè)模塊相對(duì)獨(dú)立,出現(xiàn)問(wèn)題時(shí)可以單獨(dú)調(diào)試,降低了調(diào)試難度。
  • 面向過(guò)程編程適合解決簡(jiǎn)單、邏輯性強(qiáng)的問(wèn)題,對(duì)于初學(xué)者來(lái)說(shuō),學(xué)習(xí)成本較低。

面試總結(jié)

感覺(jué):

  • 面試官有引導(dǎo),大多問(wèn)的是八股,會(huì)的就回答的比較流暢,不熟悉的就磕磕巴巴
  • 面試官給的反饋基礎(chǔ)還行,但是深度不夠,對(duì)剛剛設(shè)計(jì)模式的對(duì)比回答不滿意,和mybatis的原理回答也不太滿意

不足之處:

  • 對(duì)框架還是不夠熟練,回答不夠全面,經(jīng)常被面試官問(wèn)還有呢,但就回答不上來(lái)了
  • 網(wǎng)絡(luò)這方面看了就忘,面試官建議講項(xiàng)目從以下四點(diǎn):項(xiàng)目的背景、核心解決思路、技術(shù)上的挑戰(zhàn)點(diǎn)、最后取得什么結(jié)果。
責(zé)任編輯:武曉燕 來(lái)源: 小林coding
相關(guān)推薦

2021-08-04 20:36:12

MySQL結(jié)構(gòu)體系

2024-05-08 00:00:00

核心線程數(shù)隊(duì)列

2023-07-27 07:28:04

存儲(chǔ)鏈表HashSet

2020-11-11 10:05:04

數(shù)據(jù)庫(kù)分庫(kù)分表美團(tuán)面試

2022-09-27 18:55:49

OracleJavaJDK

2018-04-23 09:50:54

2022-05-23 08:43:02

BigIntJavaScript內(nèi)置對(duì)象

2015-08-13 10:29:12

面試面試官

2023-02-16 08:10:40

死鎖線程

2023-03-28 21:33:53

面試隔離MVCC

2024-05-16 17:58:30

線程任務(wù)線程通訊線程池

2021-11-02 09:05:25

Redis

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2024-03-18 14:06:00

停機(jī)Spring服務(wù)器

2025-03-07 00:00:10

2021-09-07 10:44:33

Java 注解開(kāi)發(fā)

2024-02-20 14:10:55

系統(tǒng)緩存冗余

2020-12-09 10:29:53

SSH加密數(shù)據(jù)安全

2021-07-06 07:08:18

管控數(shù)據(jù)數(shù)倉(cāng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)