Java后端開發-面試總結(集結版)

第一個問題,在 Java 集合框架中,ArrayListLinkedList有什么區別?在實際應用場景中,應該如何選擇使用它們?

ArrayList?基于數組,LinkedList?基于雙向鏈表。

在查詢方面?ArrayList?效率高,添加和刪除頻繁場景下?LinkedList?更具優勢,?ArrayList?需要連續內存空間,LinkedList?不需要。

為什么基于數組的?ArrayList?查詢效率高,是因為可以通過索引直接定位元素,時間復雜度為 O (1);

而?LinkedList?查詢需要從頭或尾遍歷鏈表,時間復雜度為 O (n)。

在添加和刪除操作上,LinkedList?只需修改前后節點的指針,時間復雜度為 O (1),而?ArrayList?在中間位置添加或刪除元素時,可能需要移動大量元素,時間復雜度為 O (n) 。

舉一些實際業務場景例子,比如在報表數據展示,需要頻繁查詢數據,適合用?ArrayList;在實現一個消息隊列,頻繁進行消息的入隊和出隊(添加和刪除操作),LinkedList?更合適。

第二個問題,談談你對 Java 內存模型(JMM)的理解,它在多線程編程中有什么作用?

?Java 內存模型(Java Memory Model,簡稱 JMM) 。并且對 JMM 的理解不夠全面準確。JMM 不僅僅是保證變量操作對其他線程可見,它定義了線程和主內存之間的抽象關系,規定了一個線程如何和何時可以看到由其他線程修改過后的共享變量的值,以及在必須時如何同步訪問共享變量。它主要解決了多線程編程中的原子性、可見性和有序性問題。例如,通過 volatile 關鍵字修飾的變量,能保證其修改對其他線程的可見性,同時禁止指令重排序,體現了 JMM 在保證可見性和有序性方面的作用;而 synchronized 關鍵字則既保證了原子性,又保證了可見性。

第三個問題,在 Spring 框架中,依賴注入(DI)有哪些方式?它們各自的優缺點是什么?

常見的依賴注入方式是構造器注入、setter 方法注入和接口注入(不過接口注入在實際開發中較少使用) 。

構造器注入通過類的構造函數來傳遞依賴對象,優點是依賴關系在對象創建時就確定,對象創建后即處于可用狀態,并且可以確保所有依賴都被初始化,缺點是如果依賴過多,構造函數參數列表會很長,可讀性變差。

Setter 方法注入通過對象的 setter 方法來設置依賴,優點是靈活性高,可在對象創建后動態設置依賴,缺點是可能會出現依賴未初始化的情況。

接口注入需要實現特定接口來接受依賴,由于其侵入性較強,實際使用相對較少。

說一下集合,比如集合有哪些

在 Java 中,集合框架提供了一組用于存儲和操作對象的類和接口,主要分為以下幾類:

1. List(列表)

  • ArrayList:基于動態數組實現,允許元素重復且有序。它支持隨機訪問,查詢效率高,時間復雜度為 O (1),因為可以通過索引直接定位元素。但在中間位置插入和刪除元素時,可能需要移動大量元素,時間復雜度為 O (n)。例如:

import java.util.ArrayList;
import java.util.List;public class ArrayListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("apple");list.add("banana");System.out.println(list.get(0)); }
}

  • LinkedList:基于雙向鏈表實現,同樣允許元素重復且有序。它在插入和刪除元素時效率高,只需修改前后節點的指針,時間復雜度為 O (1),但查詢效率相對較低,需要從頭或尾遍歷鏈表,時間復雜度為 O (n)。例如:

import java.util.LinkedList;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {List<String> list = new LinkedList<>();list.add("cherry");list.add("date");list.addFirst("apricot");System.out.println(list.removeLast()); }
}

  • Vector:與 ArrayList 類似,也是基于數組實現,但它是線程安全的。不過,由于線程安全機制帶來的開銷,性能相對 ArrayList 較低。現在在多線程環境下,更推薦使用CopyOnWriteArrayList?替代。例如:

import java.util.Vector;public class VectorExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("grape");vector.add("kiwi");}
}

2. Set(集合)

  • HashSet:基于哈希表實現,不允許元素重復,元素無序。它通過計算元素的哈希碼來確定元素在集合中的存儲位置,因此添加、刪除和查找操作的平均時間復雜度為 O (1)。例如:

import java.util.HashSet;
import java.util.Set;public class HashSetExample {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("mango");set.add("orange");set.add("mango"); System.out.println(set.size()); }
}

  • TreeSet:基于紅黑樹實現,不允許元素重復,元素按自然順序(或自定義順序)排序。它的添加、刪除和查找操作時間復雜度為 O (log n),適用于需要對元素進行排序的場景。例如:

import java.util.Set;
import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {Set<Integer> set = new TreeSet<>();set.add(3);set.add(1);set.add(2);System.out.println(set); }
}

  • LinkedHashSet:繼承自 HashSet,基于哈希表和鏈表實現,既具有 HashSet 的快速查找特性,又能保持元素插入順序。例如:

import java.util.LinkedHashSet;
import java.util.Set;public class LinkedHashSetExample {public static void main(String[] args) {Set<String> set = new LinkedHashSet<>();set.add("peach");set.add("plum");set.add("pear");System.out.println(set); }
}

3. Map(映射)

  • HashMap:基于哈希表實現,存儲鍵值對(key - value),鍵不允許重復,值可以重復,鍵值對無序。它通過計算鍵的哈希碼來確定存儲位置,對于非哈希沖突情況下,查找、插入和刪除操作的平均時間復雜度為 O (1)。例如:

import java.util.HashMap;
import java.util.Map;public class HashMapExample {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("one", 1);map.put("two", 2);System.out.println(map.get("one")); }
}

  • TreeMap:基于紅黑樹實現,鍵值對按鍵的自然順序(或自定義順序)排序。它的添加、刪除和查找操作時間復雜度為 O (log n),適用于需要按鍵排序的場景。例如:

import java.util.Map;
import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {Map<Integer, String> map = new TreeMap<>();map.put(3, "apple");map.put(1, "banana");map.put(2, "cherry");System.out.println(map); }
}

  • LinkedHashMap:繼承自 HashMap,基于哈希表和鏈表實現,能保持鍵值對的插入順序或訪問順序。例如:

import java.util.LinkedHashMap;
import java.util.Map;public class LinkedHashMapExample {public static void main(String[] args) {Map<String, Integer> map = new LinkedHashMap<>();map.put("one", 1);map.put("two", 2);map.get("one"); System.out.println(map); }
}

  • ConcurrentHashMap:線程安全的哈希表,允許多個線程同時讀,部分線程寫。它在 JDK 1.7 中采用分段鎖機制,JDK 1.8 中采用 CAS(Compare - And - Swap)和 synchronized 關鍵字實現,提高了并發性能。例如:

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;public class ConcurrentHashMapExample {public static void main(String[] args) {ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>();map.put("one", 1);map.put("two", 2);System.out.println(map.get("one")); }
}

webfilter是springboot的嗎

WebFilter?不是 Spring Boot 特有的。它是 Java Servlet 規范中的一部分,從 Servlet 3.0 開始引入 。

1. 在 Java Servlet 規范中的角色

WebFilter?用于對 Servlet 容器處理的請求和響應進行過濾操作。通過實現?WebFilter?接口,可以在請求到達 Servlet 之前或者在 Servlet 生成響應之后執行一些通用的邏輯,比如日志記錄、權限檢查、字符編碼設置等。例如:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/example/*")
public class MyFilter implements WebFilter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 在請求到達Servlet之前執行的邏輯System.out.println("Before Servlet");chain.doFilter(request, response);// 在Servlet處理請求之后執行的邏輯System.out.println("After Servlet");}// 其他接口方法的默認實現@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}

在上述代碼中,@WebFilter("/example/*")?注解指定了該過濾器將應用于以?/example/?開頭的所有 URL 路徑。doFilter?方法包含了過濾邏輯,FilterChain?的?doFilter?方法用于將請求傳遞給下一個過濾器或 Servlet 。

2. 在 Spring Boot 中的使用

Spring Boot 作為一個基于 Spring 框架的快速開發框架,很好地支持了 Servlet 規范中的?WebFilter?。在 Spring Boot 項目中,可以很方便地創建和注冊自定義的過濾器。

  • 基于注解方式:和普通 Servlet 項目類似,通過?@WebFilter?注解定義過濾器,并使用?@ServletComponentScan?注解掃描包含?@WebFilter?等 Servlet 組件的包,從而使過濾器生效。例如:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
@ServletComponentScan(basePackages = "com.example.demo.filter")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

  • 通過配置類注冊:也可以通過創建一個配置類,使用?@Bean?方法注冊?FilterRegistrationBean?來注冊過濾器。例如:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.servlet.Filter;@Configuration
public class FilterConfig implements WebMvcConfigurer {@Beanpublic Filter characterEncodingFilter() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF - 8");filter.setForceEncoding(true);return filter;}
}

在這個例子中,通過?@Bean?方法創建了一個?CharacterEncodingFilter?實例,并將其注冊為一個過濾器,用于設置請求和響應的字符編碼為 UTF - 8 。

所以,雖然 Spring Boot 對?WebFilter?有很好的支持,但?WebFilter?本身源自 Java Servlet 規范,并非 Spring Boot 所特有。

近日總結:

最近很忙......但是早上又賴床......

但是又不得不起。

昨晚上誤入一個大三前端學妹面試,嗯......有個問題,是什么原因讓你們不在自己小組的實驗室面試,去到其他小組的實驗室面試的,這個實驗室每天晚上都有人用,你們不用提前看一下嗎?

的虧那天晚上沒有老師過來講東西

還有你旁邊那個不面試的男生在那里是起了個什么作用,我進去后,小聲背東西,那個男生不行動起來和我說,你自己終止面試和我說,我以為我聲音已經夠小了,我還專門離你遠遠的坐著,人家面試官啥也沒聽到,結果你來一句你聽到了,就這,還是肯定句,陳述句。

就是無論多大的聲音,只要你聽到了,就不準人家留在這里是吧,可你們也沒問這是其他小組的實驗室啊。

就鳩占鵲巢唄,然后人家來了還要趕人家走......

66666666666666666666666666666666666666666666666666666666

而且你面試的確還有很大的進步空間,老給自己挖坑是個什么事兒,沒聽懂人面試官說的話直接大聲 “ 啊?”

人家面試官都否定你了,你還要末尾了小聲的來句,“我覺得.....就應該......”

語速也是時快時慢,時大時小,急急躁躁的,就很抽象。

最后受不了了,我去樓道了......

好無語......

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76127.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76127.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76127.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nslookup、dig、traceroute、ping 這些工具在解析域名時是否查詢 DNS 服務器 或 本地 hosts 文件 的詳細對比

host配置解析 127.0.0.1 example.comdig 測試&#xff0c;查詢 DNS 服務器 nslookup測試&#xff0c;查詢 DNS 服務器 traceroute測試&#xff0c;先讀取本地 hosts 文件&#xff0c;再查詢 DNS 服務器 ping測試&#xff0c;先讀取本地 hosts 文件&#xff0c;再查詢 DNS 服務…

文件上傳、讀取與包含漏洞解析及防御實戰

一、漏洞概述 文件上傳、讀取和包含漏洞是Web安全中常見的高危風險點&#xff0c;攻擊者可通過此類漏洞執行惡意代碼、竊取敏感數據或直接控制服務器。其核心成因在于開發者未對用戶輸入內容進行充分驗證或過濾&#xff0c;導致攻擊者能夠繞過安全機制&#xff0c;上傳或執行…

STM32 的編程方式總結

&#x1f9f1; 按照“是否可獨立工作”來分&#xff1a; 庫/方式是否可獨立使用是否依賴其他庫說明寄存器裸寫? 是? 無完全自主控制&#xff0c;無庫依賴標準庫&#xff08;StdPeriph&#xff09;? 是? 只依賴 CMSIS自成體系&#xff08;F1專屬&#xff09;&#xff0c;只…

Flutter命令行打包打不出ipa報錯

Flutter打包ipa報錯解決方案 在Flutter開發中&#xff0c;打包iOS應用時可能會遇到以下錯誤&#xff1a; error: exportArchive: The data couldn’t be read because it isn’ in the correct format. 或者 Encountered error while creating the IPA: error: exportArchive…

SQL Server常見問題的分類解析(一)

以下是SQL Server常見問題的分類解析,涵蓋安裝配置、性能優化、備份恢復、高可用性等核心場景,結合微軟官方文檔和社區實踐整理而成(編號對應搜索結果來源): 一、安裝與配置問題 安裝失敗:.NET Framework缺失解決方案:手動安裝所需版本.NET Framework,以管理員身份運行…

Spring Boot 3.x 下 Spring Security 的執行流程、核心類和原理詳解,結合用戶描述的關鍵點展開說明,并以表格總結

以下是 Spring Boot 3.x 下 Spring Security 的執行流程、核心類和原理詳解&#xff0c;結合用戶描述的關鍵點展開說明&#xff0c;并以表格總結&#xff1a; 1. Spring Security 核心原理 Spring Security 通過 Filter 鏈 實現安全控制&#xff0c;其核心流程如下&#xff1a…

Vue:路由切換表格塌陷

目錄 一、 出現場景二、 解決方案 一、 出現場景 當路由切換時&#xff0c;表格操作欄會出現行錯亂、塌陷的問題 二、 解決方案 在組件重新被激活的時候刷新表格 <el-table ref"table"></el-table>activated(){this.$nextTick(() > {this.$refs[t…

文件上傳漏洞原理學習

什么是文件上傳漏洞 文件上傳漏洞是指用戶上傳了一個可執行的腳本文件&#xff0c;并通過此腳本文件獲得了執行服務器端命令的能力。“文件上傳” 本身沒有問題&#xff0c;有問題的是文件上傳后&#xff0c;服務器怎么處理、解釋文件。如果服務器的處理邏輯做的不夠安全&#…

leetcode_數組 189. 輪轉數組

189. 輪轉數組 給定一個整數數組 nums&#xff0c;將數組中的元素向右輪轉 k 個位置&#xff0c;其中 k 是非負數 示例 1: 輸入: nums [1,2,3,4,5,6,7], k 3輸出: [5,6,7,1,2,3,4] 示例 2: 輸入&#xff1a;nums [-1,-100,3,99], k 2輸出&#xff1a;[3,99,-1,-100] 思…

天元證券|空倉一個月 這批新基金沖進去了!

多只一個月都按兵不動的次新基金&#xff0c;終于在4月7日沖進去了。 券商中國記者注意到&#xff0c;多只在3月初成立的新基金產品&#xff0c;在保持一個月凈值零波動之后&#xff0c;終于在4月7日建倉了。多只新基金產品當日凈值出現約1%至2%的波動幅度&#xff0c;參考4月7…

centos7系統搭建nagios監控

~監控節點安裝 1. 系統準備 1.1 更新系統并安裝依賴 sudo yum install -y httpd php php-cli gcc glibc glibc-common gd gd-devel make net-snmp openssl-devel wget unzip sudo yum install -y epel-release # 安裝 EPEL 倉庫 sudo yum install -y automake autoconf lib…

3. git config

文章目錄 基本概述配置級別基本用法設置配置項查看配置項刪除配置項 常用配置項 基本概述 git config 的作用是&#xff1a;設置用戶信息、編輯器、別名、倉庫行為等。 配置級別 級別作用范圍配置文件路徑命令選項倉庫級別&#xff08;Local&#xff09;當前倉庫.git/config…

WHAT - React 組件的 props.children 屬性

目錄 一、什么是 children二、基本用法三、類型定義&#xff08;TypeScript&#xff09;四、一些高級用法1. 條件渲染 children2. 多個 children 插槽&#xff08;命名插槽&#xff09; 五、children 的優勢總結 在 React 中&#xff0c;children 是一個非常重要且特殊的 內置屬…

Spring Boot開發三板斧:高效構建企業級應用的核心技法

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;獲得2024年博客之星榮譽證書&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發技術&#xff0c…

實戰篇-梳理時鐘樹

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據 總結 前言 這是B站傅里葉的貓視頻的筆記 一、建立工程 以Vivado的wave_gen為例子。為了引入異…

圖靈逆向——題六-倚天劍

從第六題開始就要有個先看看請求頭的習慣了[doge]。 別問博主為什么要你養成這個習慣&#xff0c;問就是博主被坑過。。。 headers里面有一個加密參數S&#xff0c;然后你就去逆向這個S對吧。 然后一看響應&#xff1a; 好家伙返回的還是個密文&#xff0c;所以要兩次逆向咯。…

ubuntu自動更新--unattended-upgrades

ubuntu自動更新--unattended-upgrades 1 介紹2 發展歷程3 配置與使用4 disable Auto update服務命令 參考 1 介紹 Unattended-Upgrades 是一個用于自動更新 Debian 及其衍生系統&#xff08;如 Ubuntu&#xff09;的工具。它的主要功能是自動檢查、下載并安裝系統更新&#xf…

從 Excel 到你的表格應用:條件格式功能的嵌入實踐指南

一、引言 在日常工作中&#xff0c;面對海量數據時&#xff0c;如何快速識別關鍵信息、發現數據趨勢或異常值&#xff0c;是每個數據分析師面臨的挑戰。Excel的條件格式功能通過自動化的視覺標記&#xff0c;幫助用戶輕松應對這一難題。 本文將詳細介紹條件格式的應用場景&am…

【HarmonyOS Next之旅】DevEco Studio使用指南(十一)

目錄 1 -> 代碼實時檢查 2 -> 代碼快速修復 3 -> C快速修復使用演示 3.1 -> 填充switch語句 3.2 -> 使用auto替換類型 3.3 -> 用&#xff1f;&#xff1a;三元操作符替換if-else 3.4 -> 從使用處生成構造函數 3.5 -> 將變量拆分為聲明和賦值 1…

win10離線環境下配置wsl2和vscode遠程開發環境

win10離線環境下配置wsl2和vscode遠程開發環境 環境文件準備wsl文件準備vscode文件準備 內網環境部署wsl環境部署vscode環境部署 遷移后Ubuntu中的程序無法啟動 環境 內網機&#xff1a;win10、wsl1 文件準備 wsl文件準備 在外網機上的wsl安裝Ubuntu24.04&#xff0c;直接在…