1. 程式人生 > 其它 >兩年菜鳥,Java開發面試題總結

兩年菜鳥,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。

5,過載和重寫的區別

過載 發生在同一個類中 方法名相同引數列表不同;重寫發生在父子類中,方法名和引數列表必須相同。

6,基本型別 和 包裝型別的區別

包裝類是物件,擁有方法和屬性,是引用的傳遞;基本型別是值傳遞。

Java中的資料結構

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的自動裝配
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,RedisAutoConfiguration.class})

 

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快取

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程序