Java開發工程師2020最新面試題-適用於2-3年工作經驗(不斷更新中...)


1、自我介紹
  略
2、springboot和ssm有什么區別?
  springboot和ssm不沖突,springboot只是簡化了配置,實際開發沒什么區別,
  傳統的SSM框架項目會有大量的配置文件,需要手動的去整合三個框架,
  也就是springmvc,spring,mybatis,並且需要注意各種配置和兼容,后期的維護難度也很大.
3、springboot有哪些注解?
  @Service: 注解在類上,表示這是一個業務層bean
  @Controller:注解在類上,表示這是一個控制層bean
  @Repository: 注解在類上,表示這是一個數據訪問層bean
  @Component: 注解在類上,表示通用bean ,value不寫默認就是類名首字母小寫
  @Autowired:自動注入
  @Resource: 按名稱裝配
  @ConfigurationProperties(prefix = "user1")//設置配置文件的前綴
  @PropertySource("classpath:detifalManager.properties")//設置自定義文件的路徑
  @Value("${test.name}")取自定義配置文件的值
  區別:
  @Resource默認按照名稱方式進行bean匹配
  @Autowired默認按照類型方式進行bean匹配
  @Resource(importjavax.annotation.Resource;)是J2EE的注解
  @Autowired(importorg.springframework.beans.factory.annotation.Autowired;)是Spring的注解
4、redis的數據類型?
  string(字符串)
  hash(哈希)
  list(列表)
  set(集合)
  zset(有序集合)
5、反射機制是怎么樣的?
  反射機制是Java語言中一個非常重要的特性,它允許程序在運行時進行自我檢查,同時也允許其對內部成員進行操作。
  由於反射機制能夠實現在運行時對類進行裝載,因此能夠增加程序的靈活性,但是不恰當地使用反射機制,
  也會嚴重影響系統的性能。具體而言,
  反射機制的主要功能主要有:
  ①得到一個對象所屬的類
  ②獲取一個類的所有成員變量和方法
  ③在運行時創建對象,調用對象的方法。
6、RPC是基於什么協議通訊的?
  RPC遠程服務調用
  RPC可以基於TCP協議也可以基於HTTP協議,RPC的主要目的只是獲取由遠程機器上的程序所執行的結果。
7、悲觀鎖和樂觀鎖的區別?
  悲觀鎖
    每次拿數據都以為別人會修改,所以每次拿數據時都會上鎖。
  實現:開啟事務,啟用鎖機制

  樂觀鎖
    每次拿數據時候都認為別人不會修改,所以不會上鎖,但是在更新數據時候會判斷在此期間是否有人更新過。
  實現:1.使用版本號2.使用時間戳
8、nginx的啟動與停止?
  啟動:
    ./nginx
  停止:
    查詢nginx主進程號
      ps -ef | grep nginx
      從容停止 kill -QUIT 主進程號
      快速停止 kill -TERM 主進程號
      強制停止 kill -9 nginx
9、說說你對大數據的理解?
    大數據技術主要圍繞“數據價值化”這個核心來展開,涉及到數據采集、數據整理、數據存儲、數據安全、
  數據分析、數據呈現和數據應用等技術。
10、應用服務器有哪些?
  tomcat,jboss,WebLogic
11、事務的四大特征?
  原子性(Atomicity):表示事務內不可分割,要么都成功,要么都失敗
  一致性(Consistency):要么都成功,要么都失敗.失敗了,要對前面的操作進行回滾
  隔離性(Isolation):一個事務開啟了,不能受其它事務的影響
  持久性(Durability):持續性,表示事務開始了,就不能終止.事務提交后,將數據序列化到數據庫
12、redis三大策略?
  持久化策略(內存到磁盤上):RDB(全部選中的數據進行全量備份)、AOF日志記錄修改指令(增量備份針對上一次選中的數據)兩種方案

  內存淘汰策略:noeviction--默認策略,不刪除數據    allkeys-lru--所有key中,刪除最近最少使用的數據  volatile-lru--設置過期時間的所有key中,
  選取最近最少使用的數據刪除  volatile-random--在所有key中,隨機刪除設置過期時間key的數據   volatile-ttl--設置過期時間key中,刪除存活時間最短的數據

  過期(定期)策略:定期刪除(過期key放入獨立字典中,定期刪除字典數據)、定期刪除策略(定期刪除)、惰性刪除(過期了,刪除,不返回任何數據)
13、SOA、微服務、Spring Cloud、Spring Boot的區別?
  SOA:面向服務體系架構(Service-Oriented Architecture),基於分布式思想,側重點在於提取核心服務,減少代碼冗余,增加業務代碼復用,解決信息孤島等一些問題。

  微服務:基於SOA架構的更細粒度的服務思想,側重點在於服務解耦。

  Spring Cloud:是Spring提供的一套微服務標准,Spring Cloud生態能夠幫助開發者快速構建分布式應用,
    同時提供了分布式應用常見的一些問題解決方案,包括spring自主開發的及第三方解決方案。

  Spring Boot:是spring提供的,能夠幫助開發者快速構建獨立的,基於Spring的應用程序。基於約定大於配置的思想,自動配置,
    應用程序只需要很少的Spring配置即可。提供應用程序監控和外部化配置功能。
14、RabbitMQ工作模式?
  在 RabbitMQ 官網上提供了 6 種工作模式:簡單模式、工作隊列模式、發布/訂閱模式、路由模式、主題模式 和 RPC 模式。
15、Lucene與solr區別?
  Lucene:單獨使用Lucene實現站內搜索需要開發的工作量較大,主要表現在:索引維護、索引性能優化、搜索性能優化等,因此不建議采用。
  Solr:基於Solr實現站內搜索擴展性較好並且可以減少程序員的工作量,因為Solr提供了較為完備的搜索引擎解決方案,因此在門戶、論壇等系統中常用此方案。
16、怎么理解MySQL存儲過程?
  mysql執行語句是先編譯后執行的,這樣如果查詢的並發大的時候會浪費很多資源和時間。造成mysql進程占用資源過多,症狀就是慢。
  存儲過程可以把一些特別的語句封裝成一個方法,再編譯好成一個可執行的方法對外只要接收參數就可以,這樣就不用再編譯。執行速度更快,主要用來性能提升
17、存儲過程有哪些特點?
  能完成較復雜的判斷和運算
  可編程行強,靈活
  SQL編程的代碼可重復使用
  執行速度相對快一些
  減少網絡之間的數據傳輸,節省開銷
18、Nginx負載均衡的作用?
  分攤到多個操作單元上進行執行,和它的英文名稱很匹配。就是我們需要一個調度者,保證所有后端服務器都將性能充分發揮,從而保持服務器集群的整體性能最優,這就是負載均衡。
19、如何解決高並發問題?
  解決高並發可以從四個方向:前端、服務器、數據庫、硬件提升
  前端:實現負載均衡,配置前置代理服務器,如NGINX,Apache等
  后台:增加網絡帶寬,DNS域名解析分發多台服務器;
  數據庫:對數據的查詢進行優化,實現讀寫分離。
  硬件提升:搭建服務器集群,數據庫集群,實現讀寫分離等等
20、如何理解消息隊列?為什么使用消息隊列?
  消息隊列是為了解決生產和消費的速度不一致導致的問題,有以下好處:

  減少請求響應時間。比如注冊功能需要調用第三方接口來發短信,如果等待第三方響應可能會需要很多時間
  服務之間解耦。主服務只關心核心的流程,其他不重要的、耗費時間流程是否如何處理完成不需要知道,只通知即可
  流量削鋒。對於不需要實時處理的請求來說,當並發量特別大的時候,可以先在消息隊列中作緩存,然后陸續發送給對應的服務去處理
21、tomcat三種運行模式?
  bio nio apr
22、MySQL五個聚合函數和兩個排序關鍵字?
  聚合函數:count、sum、avg、max、min
  排序關鍵字:升序asc 降序desc
23、數組與List集合之間的相互轉換
  數組轉換為list集合:
    String[] arr = new String[5];
    arr[0]="a";
    arr[1]="b";
    arr[2]="c";
    arr[3]="d";
    arr[4]="e";
    List<String> list = new ArrayList<>();
    List<String> list1 = Arrays.asList(arr);
  list集合轉換為數組Array:
    List<Integer> ls = new ArrayList<>();
    ls.add(1);
    ls.add(2);
    ls.add(3);
    ls.add(4);
    ls.add(5);
    Object[] objects = ls.toArray();
24、Redis為什么是單線程?
    redis 核心就是 如果我的數據全都在內存里,我單線程的去操作 就是效率最高的,為什么呢,因為多線程的本質就是 CPU 模擬出來多個線程的情況,這種模擬出來的情況就有一個代價,
  就是上下文的切換,對於一個內存的系統來說,它沒有上下文的切換就是效率最高的。
  redis用單個CPU 綁定一塊內存的數據,然后針對這塊內存的數據進行多次讀寫的時候,都是在一個CPU上完成的,所以它是單線程處理這個事。

25、日志的好處?

  便於開發錯誤跟蹤
  對於用戶問題能根據日志跟蹤
26、log4j的隔離級別
  一共分為五個級別:DEBUG、INFO、WARN、ERROR和FATAL。這五個級別是有順序的,DEBUG < INFO < WARN < ERROR < FATAL,明白這一點很重要,
  這里Log4j有一個規則:假設設置了級別為P,如果發生了一個級別Q比P高,則可以啟動,否則屏蔽掉。
27、什么是跨域?
  跨域是指一個域下的文檔或腳本試圖去請求另一個域下的資源,這里跨域是廣義的。
28、怎么解決跨域?
  response 添加 header resp.setHeader("Access-Control-Allow-Origin", "*");
  JSONP 方式
  HttpClient 請求轉發
  nginx 轉發
29、String,StringBuffer與StringBuilder的區別?
  String 字符串常量 適用於少量的字符串操作
  StringBuffer 字符串變量(線程安全) 適用於多線程下字符緩沖區進行大量操作
  StringBuilder 字符串變量(非線程安全) 適用於單線程下字符緩沖區進行大量操作
  StringBuilder > StringBuffer > String
30、Spring常用的三種注入方式
  Spring通過DI(依賴注入)實現IOC(控制反轉),常用的注入方式主要有三種:構造方法注入,setter注入,基於注解的注入。
31、接口和抽象類的區別?
  實現:抽象類的子類使用excends來繼承,接口必須使用implements來實現接口
  構造函數:抽象類可以有構造函數,接口不能有
  實現數量:類可以實現多個接口,但是只能繼承一個實現類
  訪問修飾符:接口中可以默認使用public修飾,抽象類中的方法可以是任意訪問修飾符
32、說說你對jvm的理解?
  Java程序不考慮內存管理,是因為把內存的管理交給了jvm,jvm有一套完整的存儲和垃圾回收機制
    類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區中,然后在堆區創建java.lang.Class對象,
  用來封裝類在方法區中的數據結構。
  Java虛擬機與程序的生閩南歌周期
    (1)程序正常執行完,進程結束
    (2)System.exit()方法來終止程序執行,傳入參數為0,代表正常退出
    (3)程序出現異常或者錯誤導致虛擬機進程退出
    (4)操作系統出現錯誤導致虛擬機進程退出
33、怎么遍歷一個map
    通過map.keyset遍歷keyhevalue:
    for(Integer in : map.keySet()){
      String str = map.get(in);
      System.out.println(in+" ”+str);
    }
    通過map.value()遍歷所有的value,但不能遍歷key
    for(String v :map.values()){
      System.out.println("value=" + v );
    }
34、Jquery 的選擇器有幾種?
  基本選擇器 過濾選擇器 表單選擇器 層級選擇器
35、什么是值傳遞和引用傳遞?
  值傳遞:指的是把值復制的傳過去一份 特點:傳遞的是值的拷貝,也就是傳遞后互不相關
  引用傳遞:指的是方法調用時,傳遞的參數是按引用進行傳遞,其傳遞的是引用地址,也就是變量所對應的內存空間的地址
36、攔截器和過濾器的區別?
  (1)攔截器是基於Java的反射機制,過濾器是基於函數的回調
  (2)過濾器依賴於servlet容器,攔截器不依賴servlet容器
  (3)攔截器只對action請求起作用,過濾器可以對所有請求起作用
  (4)攔截器可以訪問action上下文、值棧里的對象,過濾器不能
  (5)在action生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時調用一次
37、數組和集合的區別?
  數組:長度不可以改變,只能裝同種數據類型
  集合:集合長度可改變,可裝任意數據類型
38、spring注解@Autowrite和@Resource
  Autowired:按類型裝配
  Resource:按名字裝配
39、resultmap和resulttype的區別?
  resulttype:當使用resulttype做sql語句返回結果時,對於SQL語句查出的字段在相應的polo中必須和它的相同字段類型對應,而resulttype的內容就是pojo在本項目中的位置
  resultmap:當使用resultmap做sql返回結果時,通常需在mapper.xml中定義resultmap進行pojo和相應字段的對應
40、hashmap和hashtable的區別?
  (1)hashmap線程不安全,hashtable線程安全
  (2)hashmap允許有null的鍵和值,hashtable不允許有null的鍵和值
  (3)hashmap效率高一點,hashtable效率稍低
  (4)hashmap方法不是Synchronize的要提供外同步,hashtable方法是Synchronize的
  (5)hashmap有containsvalue和containsKey方法,hashtable有contains方法方法
  (6)Hashmap 是Java1.2 引進的Map interface 的一個實現,Hashtable 繼承於Dictionary 類
  (7)Hashmap是Hashtable的輕量級實現,Hashtable 比Hashmap 要舊
41、多線程創建的方式?
  繼承 Thread 類
  實現 Runable 接口
  實現 Callable 接口和 Future 接口
42、線程中wait和sleep的區別?
  對時間的指定:
  (1)sleep方法必須設置指定時間
  (2)wait方法有重載形式,可以指定時間,也可以不指定時間
  對於執行器和鎖的操作:
  (1)sleep():釋放執行權,不釋放鎖,因為肯定能醒,肯定可以恢復到臨時阻塞狀態
  (2)wait():釋放執行權,釋放鎖,因為wait不釋放鎖,如果沒有時間指定,那么其它線程都進行不了同步中,無法將其喚醒
43、mybatis一級緩存和二級緩存?

  一級緩存
  一級緩存的作用域是一個sqlsession內;二級緩存作用域是針對mapper進行緩存.
    一級緩存時執行commit,close,增刪改等操作,就會清空當前的一級緩存;當對SqlSession執行更新操作(update、delete、insert)后並執行commit時,
  不僅清空其自身的一級緩存(執行更新操作的效果),也清空二級緩存(執行commit()的效果)

  二級緩存

  開啟了二級緩存后,還需要將要緩存的pojo實現Serializable接口,為了將緩存數據取出執行反序列化操作,
  因為二級緩存數據存儲介質多種多樣,不一定只存在內存中,有可能存在硬盤中
44、集合的體系
  單列集合
    collection
      list集合:有序 可重復(有下標)
        ArrayList(底層是數組 查詢快 增刪改慢)
        linkedList(底層是鏈表式 查詢慢 增刪改快)
      Set集合:無序 不可重復
        HashSet:底層重寫了hashcode()和equals() 所以不能重復
  雙列集合
    map:以鍵值對的形式存在 鍵是唯一的不可重復,鍵可以為null
      HashMap
45、怎么進行SQL優化?
  ①對查詢進行優化,應盡量避免全表掃描
  ②應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描
  ③應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描
  ④應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描
  ⑤盡量避免大事務操作,提高系統並發能力
  ⑥盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理
  ⑦如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除
  ⑧避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。
  ⑨盡量使用數字型字段,若只含數值信息的字段盡量不要設計為字符型,這會降低查詢和連接的性能,並會增加存儲開銷。
  ⑩在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,
   否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致
46、throw與throws區別?
  throw是語句拋出一個異常。
  throws是方法可能拋出異常的聲明
  throw語句用在方法體內(表示拋出異常,由方法體內的語句處理)
  throws語句用在方法聲明后面(表示再拋出異常,由該方法的調用者來處理)。
47、IO流的四大基類
  Reader writer inputStream outputStream
48、序列化與反序列化的區別?
  序列化:把應用層的對象轉換成一段連續的二進制串
  反序列化:把二進制串轉換成應用層的對象
49、mybatis中#{}與${}的區別?

  #{}相當於占位符,建議使用,安全。
  ${}sql拼接,不建議使用,容易發生sql注入,不安全

50、你是怎么理解閉包的?
  閉包能夠將一個方法作為一個變量去存儲,這個方法有能力去訪問所在類的自由變量。

51、springboot啟動的時候怎么排除加載某些bean?

  @ComponentScan注解用來掃描加排除,不加ComponentScan注解,springboot是默認掃描springboot啟動類所在的包及其子包,

  我們現在自己掃描,然后使用@ComponentScan注解的excludeFilters屬性用來排除不想掃描的bean。

52、springboot aop的動態代理?
  JDK動態代理。如果是有接口聲明的類進行AOP,spring調用的是java.lang.reflection.Proxy類來做處理
  CGLib動態代理。適合沒有接口聲明的類。
53、索引的類型?
  普通索引:僅加速查詢
  唯一索引:加速查詢 + 列值唯一(可以有null)
  主鍵索引:加速查詢 + 列值唯一(不可以有null)+ 表中只有一個
  組合索引:多列值組成一個索引,專門用於組合搜索,其效率大於索引合並
  全文索引:對文本的內容進行分詞,進行搜索
  ps.索引合並,使用多個單列索引組合搜索
  覆蓋索引,select的數據列只用從索引中就能夠取得,不必讀取數據行,換句話說查詢列要被所建的索引覆蓋
54、springmvc工作流程
  (1) 用戶向服務端發送一次請求,這個請求會先到前端控制器DispatcherServlet(也叫中央控制器)。
  (2)DispatcherServlet接收到請求后會調用HandlerMapping處理器映射器。由此得知,該請求該由哪個Controller來處理(並未調用Controller,只是得知)
  (3)DispatcherServlet調用HandlerAdapter處理器適配器,告訴處理器適配器應該要去執行哪個Controller
  (4)HandlerAdapter處理器適配器去執行Controller並得到ModelAndView(數據和視圖),並層層返回給DispatcherServlet
  (5)DispatcherServlet將ModelAndView交給ViewReslover視圖解析器解析,然后返回真正的視圖。
  (6)DispatcherServlet將模型數據填充到視圖中
  (7)DispatcherServlet將結果響應給用戶

  DispatcherServlet:前端控制器,也稱為中央控制器,它是整個請求響應的控制中心,組件的調用由它統一調度。
  HandlerMapping:處理器映射器,它根據用戶訪問的 URL 映射到對應的后端處理器 Handler。也就是說它知道處理用戶請求的后端處理器,但是它並不執行后端處理器,而是將處理器告訴給中央處理器。
  HandlerAdapter:處理器適配器,它調用后端處理器中的方法,返回邏輯視圖 ModelAndView 對象。
  ViewResolver:視圖解析器,將 ModelAndView 邏輯視圖解析為具體的視圖(如 JSP)。
  Handler:后端處理器,對用戶具體請求進行處理,也就是我們編寫的 Controller 類。
55、多線程的五種狀態?
  被創建
  運行
  凍結
  臨時阻塞
  消亡
56、Java回收機制(GC)判斷一個對象是否應該被回收?
  引用計數法;(無法解決對象循環引用的問題,導致對象無法被回收)
  可達性分析;
57、如何決定使用 HashMap 還是 TreeMap?
  對於在Map中插入、刪除和定位元素這類操作,HashMap是最好的選擇。然而,假如你需要對一個有序的key集合進行遍歷,TreeMap是更好的選擇。
  基於你的collection的大小,也許向HashMap中添加元素會更快,將map換為TreeMap進行有序key的遍歷。

58、Mybatis動態標簽有哪些?

  if、foreach、choose、where、set 等

59、session共享問題怎么解決?

  使用spring session+redis的方法解決session共享問題

面試題持續更新中...

 

歡迎加入互聯網技術交流群共同學習共同進步

  

-----------------------------------------------------------------------------------------------------------------------------------

版權聲明:本文為博客園博主「LENGXUAN」的原創文章,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://www.cnblogs.com/lengxuanwl/p/12699602.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM