1.計算機網絡傳輸層有哪些協議?分別適用于什么場景?
? ?TCP:面向連接、可靠傳輸(重傳機制),適用于對數據完整性要求高的場景,如文件傳輸? ?(FTP)、HTTP 通信、郵件發送(SMTP)。
? ?UDP:無連接、不可靠傳輸,適用于實時性要求高的場景,如視頻流、語音通話、DNS 查詢
2.多線程的使用場景有哪些?線程開啟多少個合適?判斷標準有哪些?
使用場景:并發任務處理(如服務器多客戶端請求)、耗時操作異步執行(如文件 IO、網絡請求)、后臺定時任務(如日志清理)。
線程數量:無固定值,需結合任務類型判斷。
判斷標準:CPU 密集型任務(線程數≈CPU 核心數)、IO 密集型任務(線程數可適當增加,如 CPU 核心數 ×2);避免線程過多導致上下文切換開銷過大。
3.線程池的提交方式有哪幾種?
execute(Runnable)
:無返回值,提交 Runnable 任務。
submit(Runnable)
:返回 Future 對象,可判斷任務是否完成。
submit(Callable<T>)
:返回 Future<T>,可獲取任務執行結果。
4.鎖的實現原理介紹一下?
鎖通過控制多線程對共享資源的訪問順序實現同步。
底層依賴 CPU 指令(如 CAS 原子操作)和操作系統互斥機制(如 pthread_mutex)。
Java 中:synchronized 基于對象頭的監視器鎖(monitor)實現;ReentrantLock 基于 AQS(抽象隊列同步器)的 state 狀態控制。
5.TCP 協議中擁塞控制的主要作用是什么?
防止網絡因數據量過大導致擁塞崩潰,通過動態調整發送窗口大小,避免數據包丟失和網絡過載。
6.String 類的常用函數有哪些?列舉十種。?
length()
、charAt(int)
、substring(int, int)
、equals(Object)
、equalsIgnoreCase(String)
、indexOf(String)
、lastIndexOf(String)
、trim()
、replace(char, char)
、split(String)
、startsWith(String)
、endsWith(String)
7.String 和 StringBuffer、StringBuilder 的區別有哪些?所有類名包含 Buffer 的類的內部實現原理是什么?有什么優勢?
- 區別:
- String:不可變,每次修改創建新對象。
- StringBuffer:可變,線程安全(方法加 synchronized)。
- StringBuilder:可變,線程不安全,效率高于 StringBuffer。
- Buffer 類(如 ByteBuffer)原理:基于內部字節數組存儲數據,通過 position、limit、capacity 指針控制數據讀寫,減少內存復制,提升 IO 操作效率。
- 優勢:適合頻繁修改數據場景,減少內存開銷。
8.String 字符串的不可變是指哪里不可變?
指字符串底層的字符數組(char[]
)不可變,一旦創建,數組長度和內容無法修改;任何修改操作(如?substring
、concat
)都會創建新的 String 對象。
9.HTTP 協議有哪些字段,列舉 3 個就可以
請求頭字段:Host
(服務器域名)、User-Agent
(客戶端信息)、Content-Type
(數據類型);
響應頭字段:Status
(狀態碼)、Content-Length
(數據長度)
10.Java 異常類有哪些?分別管理什么異常?
Throwable
:所有異常的父類,分兩類:Error
:嚴重錯誤(如?OutOfMemoryError
),程序無法處理。
Exception
:可處理的異常,分:非受檢異常(如?NullPointerException
):運行時異常,繼承自?RuntimeException
,可不必顯式處理。
受檢異常(如?IOException
):編譯期檢查,必須捕獲或聲明拋出。
11.Java 反射獲取類信息的方式有哪幾種?分別是什么?
三種方式:
? Class.forName("全類名")
:通過類路徑加載類。
? 類名.class
:通過類字面量獲取。
? ? ?對象.getClass()
:通過實例對象獲取。
12.Java 代理的主要方法有哪幾種?列舉代理的使用場景 2 個。
主要方法:靜態代理、動態代理(JDK 動態代理、CGLIB 代理)。
使用場景:日志記錄(代理方法前后打印日志)、權限控制(代理方法執行前校驗權限)。
13.equals () 方法的作用是什么?重寫 equals 需要注意哪些事項?為什么?
作用:判斷兩個對象的內容是否相等(默認與?==
?一致,比較地址)。
注意事項:
自反性:x.equals(x)
?必須為 true。
對稱性:x.equals(y)
?與?y.equals(x)
?結果一致。
傳遞性:若?x.equals(y)
?和?y.equals(z)
?為 true,則?x.equals(z)
?必為 true。
一致性:多次調用結果一致。非空性:x.equals(null)
?必為 false。
原因:違反上述規則可能導致集合(如 HashMap)中對象查找異常(如?contains
?方法失效)。
14.Java 是按值傳遞還是按引用傳遞?什么是引用傳遞,什么是值傳遞,哪些語言支持引用傳遞??
Java 只有按值傳遞。
值傳遞:傳遞參數的副本(基本類型傳遞值的副本,引用類型傳遞地址的副本)。
引用傳遞:傳遞參數的內存地址,修改形參會影響實參(如 C++ 的引用 &)。
支持引用傳遞的語言:C++(通過引用符 &)、Python(部分場景)。
15.描述 java 的類初始化順序?如果存在繼承,初始化順序會如何?
類初始化(靜態資源)順序:靜態變量 → 靜態代碼塊。
實例初始化順序:非靜態變量 → 非靜態代碼塊 → 構造方法。
繼承場景:先初始化父類靜態資源 → 子類靜態資源 → 父類實例資源 → 父類構造方法 → 子類實例資源 → 子類構造方法。
16.本地方法棧有什么作用??
用于執行 native 方法(Java 調用非 Java 代碼,如 C/C++ 方法),存儲本地方法的局部變量、操作數棧等。
17.描述 Java 的雙親委派機制,為什么要用到雙親委派機制?
機制:類加載時,先委托父類加載器加載,父類無法加載時再由子類加載器加載(Bootstrap → Extension → Application)。
作用:防止類重復加載,保證核心類(如?java.lang.String
)的安全性(避免自定義類篡改核心類)。
18.重寫和重載的區別是什么?
區別 | 重寫(Override) | 重載(Overload) |
---|---|---|
范圍 | 父子類之間 | 同一類中 |
方法名 | 相同 | 相同 |
參數列表 | 必須相同 | 必須不同(個數 / 類型 / 順序) |
返回值 | 子類返回值需與父類兼容(更小范圍) | 無限制 |
訪問修飾符 | 子類不能比父類更嚴格 | 無限制 |
19.子類構造方法調用父類構造方法的注意事項有哪些??
子類構造方法默認調用父類無參構造(通過?super()
),若父類無無參構造,子類必須顯式調用父類有參構造(super(參數)
),且需放在子類構造方法第一行。
20.子類實例初始化是否觸發父類實例初始化?
是。子類實例化時,需先初始化父類實例(執行父類非靜態代碼塊和構造方法)。
21.instanceof 關鍵字的作用是什么??
判斷對象是否為某個類(或接口)的實例,返回 boolean 值(如?obj instanceof String
)
22.基本類型的強制類型轉換是否會丟失精度?引用類型的強制類型轉換需要注意什么??
基本類型:可能丟失精度(如?double → int
?會截斷小數)。
引用類型:需確保對象實際類型與目標類型兼容,否則拋?ClassCastException
;建議轉換前用?instanceof
?判斷。
23.重入鎖有哪些?為什么要有重入鎖??
重入鎖:synchronized
、ReentrantLock
。
作用:允許同一線程多次獲取同一把鎖(如遞歸調用同步方法時,避免死鎖)。
24.指令重排序的優點是什么?由什么原因導致的?
?優點:提高 CPU 執行效率(調整指令順序,充分利用 CPU 資源)。
原因:CPU 流水線優化、編譯器優化、內存系統重排序。
25.Arrays.sort () 的內部原理介紹一下?
針對不同數據類型采用不同算法:
基本類型(如 int):雙軸快速排序(Dual-Pivot QuickSort)。
對象類型:TimSort(歸并排序與插入排序結合,穩定性好)。
26.堆排序的時間復雜度是多少,空間復雜度是多少??
時間復雜度:O (n log n)(最好 / 最壞 / 平均一致)。
空間復雜度:O (1)(原地排序)。
27.字符串 “asdasjkfkasgfgshaahsfaf” 經過哈夫曼編碼之后存儲比特數是多少?
字符串 “asdasjkfkasgfgshaahsfaf” 經過哈夫曼編碼之后存儲比特數是多少?-CSDN博客
28.CPU 高速緩存的優點和缺點有哪些??
優點:減少 CPU 訪問內存的時間,提高處理速度(緩存速度遠快于內存)。
缺點:存在緩存一致性問題(多核心緩存數據不一致);緩存容量小,可能出現緩存未命中(需訪問內存,增加延遲)。
29.線程安全的類有哪些?列舉 2 個以上就可以。?
Vector
、Hashtable
、ConcurrentHashMap
、AtomicInteger
。
30.什么是 LRU 算法?
最近最少使用算法(Least Recently Used),用于緩存淘汰:當緩存滿時,移除最久未使用的數據,保留最近常用數據。
31.何為 Spring Bean 容器?Spring Bean 容器與 Spring IOC 容器有什么不同嗎?
Spring Bean 容器:管理 Spring Bean 的創建、配置、生命周期的容器,負責 Bean 的實例化和依賴管理。
區別:Spring IOC 容器是更寬泛的概念,Bean 容器是 IOC 容器的核心實現。IOC 容器通過依賴注入(DI)實現控制反轉,而 Bean 容器是 IOC 容器中具體管理 Bean 的組件,二者本質上是包含關系(IOC 容器包含 Bean 容器的功能)。
32.Spring IOC 如何理解?
?IOC(控制反轉)是一種設計思想:將對象的創建、依賴注入的控制權從代碼中轉移到 Spring 容器,由容器統一管理。開發者無需手動new
對象,而是通過配置(XML / 注解)聲明對象依賴,容器自動組裝,降低代碼耦合度。
?33.Spring DI 如何理解?
DI(依賴注入)是 IOC 的具體實現方式:容器在創建 Bean 時,自動將其依賴的其他 Bean 注入到當前 Bean 中(如通過構造方法、setter 方法)。例如,Service 依賴 Dao,容器會自動將 Dao 實例注入到 Service 中。
?34.Spring 中基于注解如何配置對象作用域?以及如何配置延遲加載機制?
作用域配置:用@Scope
注解,如@Scope("singleton")
(默認,單例)、@Scope("prototype")
(多例)、@Scope("request")
(請求域)等。
延遲加載:單例 Bean 默認預加載,添加@Lazy
注解可實現延遲加載(首次使用時才實例化)。
?35.Spring 工廠底層構建 Bean 對象借助什么機制?當對象不使用了要釋放資源,目的是什么?何為內存泄漏?
?構建機制:反射機制(通過Class.forName()
加載類,newInstance()
實例化對象)。
釋放資源目的:避免資源占用(如數據庫連接、文件流),防止內存泄漏。
內存泄漏:不再使用的對象因被引用而未被 GC 回收,導致內存占用持續增加。
?36.描述 Spring MVC 處理流程及應用優勢?
流程:
客戶端請求被DispatcherServlet
(前端控制器)接收;
調用HandlerMapping
找到對應Controller
;
Controller
處理請求,返回ModelAndView
;ViewResolver
解析視圖,渲染后響應客戶端。
優勢:分層清晰(MVC 架構)、靈活易擴展、與 Spring 無縫集成、支持 RESTful 風格。
37.Spring 中的事務處理方式及優缺點?
編程式事務:通過TransactionTemplate
手動控制事務(如begin()
、commit()
、rollback()
)。優點:細粒度控制;缺點:代碼侵入性強,冗余。
聲明式事務:通過@Transactional
注解或 XML 配置聲明事務,無需手動編碼。優點:無代碼侵入,配置簡單;缺點:粒度較粗(基于方法 / 類)。
38.MyBatis 應用中 #與 $ 有什么異同點?
相同點:均用于在 SQL 中插入參數
不同點:
#
:參數占位符,會預編譯為?
,自動處理 SQL 注入(安全),如WHERE id = #{id}
。
$
:字符串拼接,直接替換參數(不安全,可能 SQL 注入),適用于動態表名 / 排序字段,如ORDER BY ${column}
。
39.MyBatis 應用動態 SQL 解決了什么問題?
解決 SQL 語句中因條件變化導致的拼接繁瑣問題。通過<if>
、<where>
、<foreach>
等標簽,動態生成 SQL(如多條件查詢時自動拼接AND
),避免手動拼接字符串的錯誤(如多余逗號、WHERE
后無條件)。
?40.Shiro 框架權限管理時的認證和授權流程描述?
認證(登錄):
1.用戶提交賬號密碼;
2.Shiro 通過Subject.login(token)
驗證;
3.調用Realm
的doGetAuthenticationInfo
方法比對用戶信息,驗證通過則登錄成功。
授權(權限校驗):
1.認證通過后,Shiro 調用Realm
的doGetAuthorizationInfo
獲取用戶角色 / 權限;
2.通過Subject.hasRole()
或@RequiresPermissions
注解校驗權限,無權限則拋出異常。
41.BeanFactory 和 ApplicationContext 有什么區別?
對比項 | BeanFactory | ApplicationContext |
---|---|---|
加載時機 | 懶加載(getBean 時才實例化) | 預加載(啟動時實例化單例 Bean) |
功能 | 基礎 Bean 管理 | 繼承 BeanFactory,新增國際化、事件機制等 |
常用實現類 | DefaultListableBeanFactory | ClassPathXmlApplicationContext |
42.請解釋 Spring Bean 的生命周期?
- 實例化(通過構造方法創建對象);
- 屬性注入(通過 setter 方法注入依賴);
- 初始化前(調用
BeanNameAware
、BeanFactoryAware
等接口方法); - 初始化(執行
@PostConstruct
注解方法或<init-method>
配置的方法); - 就緒(Bean 可被使用);
- 銷毀前(調用
@PreDestroy
注解方法或<destroy-method>
配置的方法); - 銷毀(容器關閉時回收資源)。
43.??Spring Bean 的作用域之間有什么區別?
singleton:默認,單例,容器中只有一個實例,所有請求共享。
prototype:多例,每次getBean()
創建新實例。
request:每個 HTTP 請求創建一個實例,僅在當前請求有效。
session:每個會話創建一個實例,會話內共享。
globalSession:用于 Portlet 環境,全局會話共享。
44.?使用 Spring 框架的好處是什么?
降低耦合:IOC 容器管理對象依賴,減少硬編碼;
簡化開發:AOP 封裝橫切邏輯(如事務、日志);
事務管理:聲明式事務簡化配置;
集成性:無縫整合 MyBatis、Hibernate 等框架;
可擴展性:支持自定義 Bean、工廠等。
45.Spring 中用到了哪些設計模式?
工廠模式(BeanFactory 創建 Bean);
單例模式(默認 Bean 為單例);
代理模式(AOP 的動態代理);
模板方法模式(JdbcTemplate);
觀察者模式(事件監聽機制)。
46.Spring 如何保證 Controller 并發的安全?
Controller 默認單例,若存在成員變量,多線程并發可能不安全。
解決方案:
避免在 Controller 中定義成員變量(推薦);
若需共享數據,使用ThreadLocal
隔離線程;
將 Controller 作用域設為prototype
(多例,消耗略高)。
47.在 Spring 中如何注入一個 java 集合?
通過 XML 配置或注解注入,例如:
<bean id="myBean" class="com.example.MyBean"><property name="list"><list><value>1</value><value>2</value></list></property><property name="map"><map><entry key="name" value="test"/></map></property>
</bean>
48.Spring 支持的事務管理類型?
編程式事務:通過TransactionTemplate
手動控制事務;
聲明式事務:通過@Transactional
注解或 XML 配置,無需代碼侵入,更常用。
49.Spring 框架的事務管理有哪些優點?
- 簡化配置:聲明式事務無需手動編寫
begin/commit/rollback
; - 一致性:統一管理事務邊界,避免遺漏;
- 靈活性:支持不同隔離級別(如 READ_COMMITTED)和傳播行為(如 REQUIRED);
- 集成性:兼容 JDBC、Hibernate 等持久層框架。
50. Spring MVC 的主要組件?
DispatcherServlet
:前端控制器,接收所有請求并分發;HandlerMapping
:映射請求到對應的 Controller;Controller
:處理請求的業務邏輯;ModelAndView
:封裝處理結果和視圖名;ViewResolver
:解析視圖名,生成 View 對象;HandlerAdapter
:適配不同 Controller 方法(如注解式、接口式)。
51.SpringMvc 怎么和 AJAX 相互調用的?
Controller 方法返回 JSON 數據(用@ResponseBody
注解);
前端 AJAX 通過$.ajax()
發送請求,指定dataType: "json"
;
52.mybatis 的緩存機制,一級、二級介紹一下?
一級緩存:默認開啟,作用于SqlSession
級別,緩存當前會話中查詢的結果,會話關閉后失效。
二級緩存:作用于namespace
(Mapper 接口)級別,多個SqlSession
共享,需在 Mapper.xml 中配置<cache/>
開啟。查詢時先查二級緩存,再查一級緩存,最后查數據庫。
53.SpringMVC 與 Struts2 的區別?
對比項 | SpringMVC | Struts2 |
---|---|---|
核心控制器 | DispatcherServlet | FilterDispatcher |
線程安全 | 單例(無成員變量則安全) | 多例(每次請求創建 Action) |
靈活性 | 注解驅動,配置簡潔 | 依賴 XML 配置較多 |
集成性 | 與 Spring 無縫集成 |
54.?mybatis 的基本工作流程??
- 加載 MyBatis 配置文件(mybatis-config.xml)和 Mapper 映射文件;
- 創建
SqlSessionFactory
(通過SqlSessionFactoryBuilder
); - 由
SqlSessionFactory
創建SqlSession
; - 通過
SqlSession
獲取 Mapper 接口代理對象; - 調用 Mapper 方法執行 SQL,底層通過
Executor
和StatementHandler
操作數據庫; - 提交事務(
sqlSession.commit()
),關閉SqlSession
。
55.什么是 MyBatis 的接口綁定,有什么好處?
接口綁定:將 Mapper 接口與 Mapper.xml 文件綁定,通過接口方法名匹配 XML 中的id
,無需實現類即可調用 SQL。
好處:簡化代碼(無需手動實現接口),類型安全(編譯期校驗方法名),便于維護。
56.MyBatis 的編程步驟?
- 編寫實體類(POJO);
- 編寫 Mapper 接口(定義方法);
- 編寫 Mapper.xml(配置 SQL,與接口方法綁定);
- 配置 mybatis-config.xml(數據源、Mapper 掃描);
- 通過
SqlSession
獲取 Mapper 接口,調用方法執行 SQL。
57. JDBC 編程有哪些不足之處,MyBatis 是如何解決這些問題的?
JDBC 不足:頻繁創建 / 關閉連接,資源浪費;
SQL 與 Java 代碼耦合,維護困難;
手動處理結果集映射,代碼繁瑣。
MyBatis 解決:
集成連接池(如 Druid)管理連接;
SQL 寫在 XML 中,與代碼分離;
自動映射結果集到 POJO(通過resultType
/resultMap
)。
58.Mybatis的優缺點
優點:
(1)基于SQL語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便于統一管理;提供XML標簽,支持編寫動態SQL語句,并可重用。
(2)與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗余的代碼,不需要手動開關連接;
(3)很好的與各種數據庫兼容(因為MyBatis使用JDBC來連接數據庫,所以只要JDBC支持的數據庫MyBatis都支持)。
(4)能夠與Spring很好的集成;
(5)提供映射標簽,支持對象與數據庫的ORM字段關系映射;提供對象關系映射標簽,支持對象關系組件維護。
缺點:
(1)SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求。
(2)SQL語句依賴于數據庫,導致數據庫移植性差,不能隨意更換數據庫。
?