兩年菜鳥,Java開發面試題總結
Java基礎
1,Object類中常用方法
equals,getClass,notify,notifyAll,wait,toString,hashCode
執行緒執行wait方法 會釋放鎖 讓出CPU,進入等待狀態,只有當notify 或 notifyAll被執行時,才會被喚醒,notifyAll會喚醒所有等待的執行緒。
2,String類中常用方法
indexOf,charAt,trim,split,replace,subString,length,equals,toLowerCase,toUpperCase
3,= = 和equals的區別
==基本型別比較值相同,引用型別比較記憶體地址
Object中equals底層採用==,String中重寫equals 比較的是值相同
4,String、StringBuffer、StringBuilder的區別及使用場景
String使用final修飾,每次變化產生新的物件。StringBuffer執行緒安全。
應用場景:首先使用效能較高的StringBuilder,如果是在多執行緒共享變數的情況下則使用執行緒安全的StringBuffer。
過載 發生在同一個類中 方法名相同引數列表不同;重寫發生在父子類中,方法名和引數列表必須相同。
6,基本型別 和 包裝型別的區別
包裝類是物件,擁有方法和屬性,是引用的傳遞;基本型別是值傳遞。
List:有序列表,允許重複和null,先進先出。
Set:無序列表,不允許重複一個null
Map:散列表,允許任意個null值,但最多允許一個key為null
使用場景
如果需要容器中的元素按照插入順序儲存,需要List;
如果想要保證插入元素的唯一性,則可以選擇Set;
如果想以鍵值對的形式儲存,則使用Map
常用的ArrayList、LinkedList、HashMap基本資料結構
1,ArrayList底層是動態陣列(初始長度10,每次擴容為原來的1.5倍),連續的記憶體儲存適合查詢操作;
//迭代器
Iterator iterator = arrayList.iterator();
while(iterator.hasNext()){
iterator.next();
}
//增強for迴圈
for(String str:arrayList){
str;
}
//普通for迴圈
for(int i=0;i<arrayList.size();i++){
list.get(i);
}
2,LinkedList底層是雙向連結串列,分散儲存,適合做插入刪除操作;
3,HashMap底層是陣列+連結串列 或 紅黑樹(初始長度為16,負載因子0.75也就是陣列長度達到75%就會進行擴容,每次擴容為原來的2倍),陣列長度 超出64並且連結串列長度超出8,連結串列會進行樹化。
//forEach迴圈
for(Map.Entry<> entry : map.entrySet()){
entry.getKey();entry.getValue();
}
//forEach迭代鍵值
for(Object key : map.keySet()){
key;
map.get(key);
}
Java多執行緒
建立多執行緒
1,繼承Thread類重寫run方法,方法中定義需要執行的任務
2,實現Runnable介面重寫run方法
3,實現Callable介面 並實現call方法
synchronized
synchronized可作用於 方法 和 程式碼塊,保證被修飾的程式碼在同一時間只能被一個執行緒訪問。
Java流
java.io流 分類
java.io中的流
深色為節點流,淺色為處理流:
java.io中常用的流
1,對檔案操作的流:FileReader、FileWriter、FileInputStream、FileOutputStream
2,位元組緩衝流:BufferedInputStream、BufferedOutputStream
3,字元緩衝流:BufferedReader、BufferedWrite (讀取和寫入一行的方法ReadLine和NewLine),輸出緩衝流,回先寫到記憶體中,再使用flush方法將記憶體中的資料刷到磁碟中。所以在使用字元緩衝流,要先flush 然後再close,避免資料丟失。
Spring框架
對Spring IOC 和 AOP的理解
ioc 控制反轉 依賴注入,將原本在程式中手動建立物件的控制權交給spring容器管理,簡化了開發 增加可維護性。
aop 面向切面程式設計,在不修改原始碼情況下,給程式擴充套件功能,減少系統中重複程式碼,降低模組之間的耦合度,易擴充套件易維護。
aop是基於動態代理實現的,如果要代理的物件實現了某個介面 就會使用JDK動態代理建立代理物件,否則 轉而使用CGlib動態代理生成一個被代理物件的子類來作為代理。
spring事務的特性
原子性,一致性、隔離性、永續性
spring事務的配置方式
spring支援 程式設計式事務 和 宣告式事務 兩種。
事務的隔離級別
1,髒讀:讀取到回滾的資料
2,幻讀:兩次讀取的資料記錄條數不一致
3,不可重複讀:兩次讀取到的資料不一致
SpringMVC框架
springmvc是spring提供的一個基於MVC設計模式的web框架,通過分層將web層進行職責解耦。
SpringMVC 的執行原理
1,客戶端傳送請求到 前端控制器(DispatcherServlet),DispatcherServle通過處理對映器(HandlerMapping)找到處理請求的控制器(handler)
2,然後DispatcherServlet將請求提交到handler,handler呼叫業務邏輯處理後返回ModelAndView物件
3,DispatcherServlet通過檢視解析器(ViewResolver)找到指定的檢視,然後渲染資料最後返回給前端。
重定向 和 轉發
重定向:返回值前加 redirect ;轉發:返回值前加 forward
springmvc 和 struts2的區別
1,springmvc入口是一個servlet前端控制器,而struts2入口是一個filter過濾器
2,springmvc基於方法開發,而struts2是基於類開發 傳遞引數通過類的屬性
MyBatis框架和Hibernate框架
#{} 和 ${}的區別
#會把傳入的引數加上引號 會對sql進行預處理,底層採用PreparedStatement可以有效預防sql注入
$會把傳入的引數當作一個物件,底層採用Statement
Dao介面的工作原理
mybatis執行時會使用JDK動態代理,為Dao介面生成代理的proxy物件,這個代理物件會攔截介面方法,然後執行MappedStatement所代表的sql,然後將執行結果返回。
mybatis 和 hibernate區別
mybatis是半自動的orm框架,resultType自動對映,resultMap手動對映;
hibernate全自動的orm框架,xxx.hbm.xml配置檔案用來描述類與資料庫中表的對映關係,hibernate.cfg.xml是此框架的核心配置檔案,hibernate裡操作實體類就是操作表。
SpringBoot框架
springboot 是用來簡化spring應用初始搭建 以及 開發過程的框架
springboot自動配置原理
首先springboot入口類有一個核心註解@SpringBootApplication,這個複合註解裡有一個@EnableAutoConfiguration開啟自動配置。而這個註解裡使用@import註解,@import會呼叫方法掃描一個spring .factories的檔案,它裡面都是key value形式,然後篩選出以EnableAutoConfiguration為key的資料,而它的value是一些以AutoConfiguration結尾的類名的列表,最後會載入到容器中,完成環境的自動配置
springboot中常用註解
@Component,@Bean,@Configuration,@Value,@RestController,@Controller,@Service,@Mapper
@Resource 根據名稱注入,@Autowired 根據型別注入
@SpringBootApplication
@ExceptionHandler(value = Exception.class) // 捕獲全域性異常
@ExceptionHandler(value = LoginException.class) //捕獲登入時異常
@Transaction(rollbackFor={Exception.class})
@Configuration
@EnableScheduling // 開啟定時任務
public class SaticScheduleTask {
//3.新增定時任務
@Scheduled(cron = "0/5 * * * * ?")
private void configureTasks() {
System.err.println("執行靜態定時任務時間: " + LocalDateTime.now());
}
}
springboot中關閉自動配置
// exclude(排除)datasource和redis的自動裝配
SpringCloud框架
Eureka:EnableEurekaServer、EnableEurekaClient
Zookeeer/Consul:EnableDiscoveryClient
OpenFiegn:EnableFeignCliens、FeignClien
Hystrix:FeignClien(value="server_name" , fallback="FallbackService.class")
RPC (遠端過程呼叫) 框架,springcloud是基於springboot的一整套實現微服務的框架
註冊中心 | Nacos / Eureka |
服務遠端呼叫 | feign (http restful風格) |
配置中心 | nacos |
服務閘道器 | Gateway |
服務監控和保護 | hystrix / sentinel |
Eureka搭建
建立專案 引入spring-cloud-starter-netflix-eureka-server依賴
編寫啟動類,並加上@EnableEurekaServer註解
application.yml 中配置eureka地址
其他client服務引入eureka-client依賴 並 配置eureka的地址
Ribbon負載均衡
請求進入ribbon後會被LoadBalanceIterceptor負載均衡器攔截,之後會通過IRule基於它自己的負載均衡規則,最後得到一個真實的請求地址。IRule預設是輪詢
Feign搭建
引入依賴 spring-cloud-starter-openfeign
啟動類加上@EnableFeignClients
最後編寫feign客戶端,類上面加@FeignClient("xxx") 註解
Gateway搭建
引入SpringCloudGateway和nacos服務發現依賴:
spring-cloud-starter-gateway
spring-cloud-starter-alibaba-nacos-discovery
編寫路由配置 及 nacos地址
spring:
cloud:
gateway:
routes:
-id: user-service
uri: lb://userservice
padicates:
-path = /user/** #路由斷言
Nacos 和 Eureka 的區別
共同點:
都支援服務註冊 和 服務拉取
都支援服務提供者心跳模式做健康檢測
不同點:
nacos支援服務端主動檢測提供者的狀態,臨時例項採用心跳模式,非臨時例項採用主動檢測模式;
臨時例項心跳不正常會被剔除,非臨時例項不會
nacos支援服務列表變更的訊息推送模式,服務列表更新及時
redis支援的資料型別
sting list set zset hash
expire //設定redis過期時間
expire key_name 60 //60秒過期時間
// string
set key value
get key
exists key //判斷key是否存在
del key
mset k1 v1 k2 v2 //插入多個
//hash
hset user name 'xx' age 25 sex '男'
hget user name
hdel user name
//list
lpush user a b c //左插入
rpush user a b c //右插入
lpop user //從左邊開始彈出元素
rpop user //從右邊開始彈出元素
ltrim user 0 //刪除
redis持久化機制
持久化 就是把記憶體的資料寫入到磁碟中,防止伺服器宕機記憶體資料丟失
redis 提供兩種持久化機制,RDB預設的 AOF機制
RDB每隔一段時間將資料以快照方式儲存到磁碟中,只產生一個dump.rdb檔案,方便持久化;
AOF將redis執行的每次寫命令記錄到日誌檔案中,重啟redis會將持久化日誌中檔案資料恢復。
redis過期鍵刪除策略
定時過期 惰性過期 定期過期
redis 快取雪崩 快取穿透 快取擊穿
快取雪崩 指的是同一時間大量key過期,請求都會落在資料庫上,給資料庫造成壓力
解決:設定過期時間時 加上隨機數,防止大量key同時過期;
快取穿透 指的是快取和資料庫中都沒有要查詢的資料,但是如果這種請求過多,所有的請求都落在資料庫上,造成資料庫壓力 快取失去意義
解決:
快取和資料庫中都沒有,如果使用者反覆請求這可能是一個惡意攻擊,可以將這個資料儲存為key-null設定一個短的過期時間,或者採用布隆過濾器 將所有可能存在的資料放到一個足夠大的bitmap中,如果使用者請求一個一定不存在的資料會被這個bitmap攔截。
快取擊穿 指的是快取中沒有 資料庫中有的資料,一般是快取過期並且訪問的這個key併發數特別多 造成資料庫壓力(與快取雪崩不同,快取擊穿是併發查同一條資料)
解決:
設定熱點key永不過期;加互斥鎖。
MySQL資料庫
mysql索引失效問題
like以%開頭;
or前後有不是索引的欄位時;
組合索引不是使用第一列索引;
IS NULL,IS NOT NULL,NOT,< >,!=
欄位上使用函式時
mysql優化
使用join 代替子查詢
避免使用函式索引
可以用in 替換 or
不要用select *
mysql索引資料結構
mysql索引的資料結構是B+樹。
Dubbo框架
dubbo和springcloud區別
dubbo使用RPC通訊,而springcloud使用的是http restful方式
Nginx中介軟體
nginx是一個web伺服器 和 反向代理伺服器
正向代理 和 反向代理
正向代理 代理伺服器為客戶端的代理人,客戶端明確訪問的目標伺服器,而目標伺服器不清楚來自的客戶端;
反向代理 代理伺服器為伺服器的代理人,客戶端不知道來自哪臺伺服器,對外遮蔽了伺服器的資訊。
Tomcat容器
tomcat預設埠修改
在conf資料夾下找到server.xml檔案,修改裡面connector標籤裡的port資訊
Maven基礎
maven的作用
主要用於 專案構建 和 依賴管理
mvn compile //編譯原始碼
mvn deploy //釋出專案
mvn clean //清除專案目錄
mvn package //打包
mvn install //安裝jar
【全文檢索】框架使用
Lucene實現流程概述
首先獲取需要建立索引的原始文件,然後利用Lucene構建文件物件,最後分析文件進行相應的分詞,然後會在磁碟中創建出索引庫。使用者根據關鍵字搜尋,lucene會建立一個查詢,併為關鍵字進行分詞,最後執行查詢,從索引庫中返回結果。
shiro安全框架基礎使用
shiro介紹
是一個易用的java專案安全框架,提供了認證、授權、加密、會話管理
shiro的核心
Authentication:身份認證登入,驗證使用者是否擁有相應的身份
Authorization:授權,驗證某個已認證的使用者是否擁有某個許可權
Session Manager:會話管理,使用者登入後即一次對話,沒有退出前所有資訊都在會話中。
Cryptography:加密 保護資料的安全性,如密碼
Remember Me:記住我,即登入一次之後 下一次不用登入
springboot 整合 shiro框架
1,首先新增shiro的依賴到專案中
2,然後需要建立基礎的使用者 角色 許可權實體類
3,然後建立一個用於認證 和 為使用者新增許可權的類
這個類繼承AuthorizingRealm,重寫新增許可權
doGetAuthorizationInfo方法,和使用者認證的
doGetAuthenticationInfo方法。
4,最後建立一個過濾配置類,用@Bean註解將上面自己建立的驗證使用者的
方式 和 許可權管理 加入容器,還可以配置一些過濾器和跳轉條件
Linux常用命令
shutdown -h now 立即關機
shutdown -h 5 5分鐘後關機
poweroff 立即關機
shutdown -r now 立即重啟
shutdown -r 5 5分鐘後重啟
reboot 立即重啟
ifconfig --help 檢視網絡卡資訊
cd / 切換到根目錄
cd /usr 切換到根目錄下的usr目錄
cd .. 切換到上一級目錄
cd ~ 切換到home目錄
cd - 切換到上次訪問的目錄
ls 檢視當前目錄下所有
ls -a 檢視當前目錄下所有 包括隱藏檔案
ls -l 檢視當前目錄所有 更多資訊
ls /dir 檢視指定目錄下所有
mkdir aaa 新建aaa目錄
mkdir /usr/aaa 在指定目錄下新建aaa
-r遞迴 -f詢問
rm 檔案 刪除檔案
rm -r aaa 遞迴刪除aaa目錄
rm -rf * 刪除當前目錄下所有
rm -rf /* 從根目錄刪除所有
mv aaa bbb 目錄aaa修改為bbb
mv /usr/tmp/aaa /usr 將aaa目錄剪下到usr下
cp -r /usr/tmp/aaa /usr 將aaa目錄複製到usr下
find /usr -name 'a*' 查詢usr目錄下所有以a開頭的目錄或檔案
touch aa.txt 新建檔案
:wq 儲存並退出
vi 檔名 vi編輯器開啟後,點選鍵盤i/a/o進入編輯模式
ESC 退出命令列模式
q! 撤銷本次修改並退出編輯
tar -zcvf 打包後文件名 要打包的檔案
tar -zxvf aa.tar 解壓檔案到當前目錄
tar -zxvf aa.tar -C /usr/ 解壓檔案到指定位置
java -jar aaa.jar 啟動jar,ctrl+c打斷程式執行,視窗關閉程式終止執行
java -jar aaa.jar & 表示在後臺執行,視窗關閉程式終止執行
nohup java -jar aaa.jar & 不掛斷執行,視窗關閉程式仍然執行
ps -ef | grep java 檢視java應用
kill -9 java程序序號 停止特定java程序