目錄
最近趁著金三銀四面了五六家公司吧,也整理了一些問題供大家參考一下(適合經驗三年左右的)。
面試問題(答案是我自己總結的,不一定正確):
總結:
最近趁著金三銀四面了五六家公司吧,也整理了一些問題供大家參考一下(適合經驗三四年左右的)。
面試問題(答案是我自己總結的,不一定正確):
1.自我介紹簡單一點吧,把自己的情況說清楚,一兩分鐘即可。
2.微服務的組件
答:微服務是把一個類似單體項目根據某種維度進行拆分,比如根據功能模塊進行拆分。
拆分之后,具備了更好的抗壓性/擴展性,還可以更好的解耦,但是維護相比之前會更麻煩了
常用的組件有Spring Cloud。其中里面有:
Nacos:用來做注冊中心/配置中心
Gateway:用來做網關
Hystrx:做限流、熔斷、降級
Dubbo:做服務間的調用
Feign:也是服務間的調用
3.mq的運用
答:本項目中是用作削峰和解耦。
4.項目的并發量
5.機器搭建
6.團隊的規模
7.查詢優化
答:索引
8.spring的知識點
9.@resource/@Autowired區別
答:(1)來源不一樣:@Autowired 是 Spring 定義的注解,而 @Resource 是 Java 定義的注解
(2)依賴查找的順序不同:依賴注入的功能,是通過先在 Spring IoC 容器中查找對象,再將對象注入引入到當前類中,
@Autowired 是先根據類型(byType)查找,如果存在多個 Bean 再根據名稱(byName)進行查找
@Resource 是先根據名稱查找,如果(根據名稱)查找不到,再根據類型進行查找
(3)支持的參數不同:@Autowired 和 @Resource 在使用時都可以設置參數,其中 @Autowired 只支持設置一個 required 的參數,而 @Resource 支持 7 個參數
(4)依賴注入的用法不同:@Autowired 支持屬性注入、構造方法注入和 Setter 注入,而 @Resource 只支持屬性注入和 Setter 注入
(5)編譯器 IDEA 的提示不同:@Autowired 編譯器會提示報錯信息
10.設計模式
答:單例模式、設配器模式、工廠模式、代理模式
11.單例模式如何避免線程安全以及應用場景
答:
單例模式在多線程的,應用場合下必須小心使用。如果當唯一實例尚未創建時,有兩個線程同時調用創建方法,
那么它們同時沒有檢測到唯一實例的存在,從而同時各自創建了一個實例,這樣就有兩個實例被構造出來,從而違反了單例模式中實例唯一的原則。解決這個問題的辦法是為指示類是否已經實例化的變量提供一個互斥鎖(雖然這樣會降低效率)。
應用場景:對象需要被公用的場合適合使用,如多個模塊使用同一個數據源連接對象等等
12.設計模式里面的工程模式?
答:(1)簡單工廠模式:建立一個工廠類,對實現了同一接口的一些類進行實例的創建。優點是比較好理解,簡單易操作。
缺點是類的創建依賴工廠類,如果想要拓展程序,必須對工廠類進行修改
(2) 工廠方法模式:對簡單工廠模式的改進,使用一個工廠接口,創建多個工廠類,每個工廠創建對應的對象。
創建一個工廠接口和創建多個工廠實現類,一旦需要增加新的功能,直接增加新的工廠類就可以了,
不需要修改之前的代碼。有利于代碼的維護和擴展。
(3) 抽象工廠模式:
MyBatis中使用的比較多,事務模塊和數據源模塊都使用了工廠方法模式。
13.代碼review工作的重點
答:(1)代碼規范:命名、格式、內容、位置(包結構)
(2)耦合、性能、內存
13.sql xml語句(實體字段和數據庫怎么對應?)
14.修改表結構語句(mysql中change和modify 的區別)
答:ALTER TABLE `ry-cloud`.sys_user_role CHANGE role_id role_id1 bigint(20) NOT NULL COMMENT ‘角色ID’;
(1)change 可以更改列名 和 列類型 (每次都要把新列名和舊列名寫上, 即使兩個列名沒有更改,只是改了類型)
(2)modify 只能更改列屬性 只需要寫一次列名, 比change 省事點15.數據庫mvcc(多版本解決的是讀寫并發沖突)
答:是數據庫的多版本并發控制,在讀取數據不用加鎖也可以提高讀取效率和并發性的手段。
實現原理:一種讀取操作, 使用數據在某個時間點的快照顯示查詢結果, 而不考慮同時運行的其他事務所執行的更改.
如果查詢的數據已被另一個事務更改, 則會根據undo log的內容重建原始數據. 該技術避免了一些鎖定問題,這些問題可以通過強制事務等待其他事務完成來減少并發性.
隱含字段:一個事務最新id,回滾的指針16.不用or,會導致索引失效,如何改造?
答:(1)代碼層面查兩次
(2)或者用UNION來代替17.數據庫視圖、序列化、存儲過程
答:(1)數據庫視圖:數據庫一個或多個表導出的虛擬表,方便用戶對數據進行操作。視圖的數據依賴原數據,二者會互相影響。
(2)數據庫序列化:是將數據結構或者對象轉換成字節流、json等方便去存儲或者是傳輸。
(3)18.數據庫的事務
19.分庫分表
答:關系型數據庫容易成為系統瓶頸,鏈接數量,存儲容量都是有限的,超過1千萬之后因其查詢維度的較多,性能會下降嚴重。
(1)垂直切分:分庫:根據業務不同拆成不同庫;分表:把不常用的字段或者長度比較大的字段拆到另一張表(主鍵跟著走)。缺點:只能在代碼里面去聚合,增加了其復雜度
(2)水平切分:庫內分表、分庫分表。將按照不同的條件分散到多個數據庫或者多個表中,使單表數據量變小。缺點:維護難度加大、跨分片的事務不好保證20.事務不生效的原因
答:(1)方法不是public;(2)異常被方法吞掉了;(3)拋出異常類型大于@Transactional 默認回滾的是 RuntimeException 和 Error;(4)非同一個線程
21.jdk 1.8的新特性
答:Lambda表達式、Stream API、map數據結構優化
22.java8函數式接口,Functional Interface
答:函數式接口(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。為lambda表達式和方法引用(用冒號::來進行方法的調用)提供目標類型
23.spring的知識點
24.aop底層
答:面向切面的編程,通過預編譯和運行期間動態代理實現程序功能統一的技術。實現invocationHandle類則是JDK動態代理,否則是CGLib動態代理。
25.SpringCloud會出現那些安全問題
26…SpringBoot監聽器
27.SpringBoot的優勢以及創建方式
答:(1)主要是簡化新spring應用的初始搭建和開發過程(使用IntelliJ IDEA,可以利用創建Spring Initializr的方式創建Spring Boot項目、
使用官方文檔創建項目,在Spring官方文檔上面提供了一種在線生成Spring Boot項目的方式、
使用Spring Tool Suite,可以直接新建Spring Starter Project項目)
(2)嵌入式Web容器、自動化配置、可執行Jar部署28.SpringCloud的配置文件
答:nacos或者阿波羅都可以。
29.springMVC(Model(模型)、View(視圖)、Controller(控制器))
答:是一種軟件設計規范,將業務邏輯、數據、顯示分離的方法來組織代碼,降低了視圖和業務邏輯之間的耦合。
瀏覽器把請求放到試圖層=控制器收到請求模型處理數據=返回視圖=響應給瀏覽器
30.map的實現類
答:HashMap、TreeMap、
31.流的并行和串行
答:串行:Stream,并行:parallelStream(其底層使用Fork/Join框架實現,通過Fork把任務拆開,Join把結果進行合并)
32.環境切換(idea的設置)
答:spring.profiles.active====》VM options兩處改動33.Java中的值傳遞和引用傳遞
答:(1)值傳遞(pass by value):在調用函數時,將實際參數復制一份傳遞到函數中,這樣在函數中對參數進行修改,就不會影響到原來的實際參數;
(2)引用傳遞(pass by reference):在調用函數時,將實際參數的地址直接傳遞到函數中。這樣在函數中對參數進行的修改,就會影響到實際參數;
個人認為:在一個類中調用其他方法,這個方法中如果是直接復制對象則是值傳遞,如果是在參數基礎上改則是引用傳遞34.反射應用場景
答:(1)可以動態的加載類,并創建其實例。String className = “com.example.MyClass”;
Class<> clazz = Class.forName(className);
Object obj = clazz.newInstance();
(2)通過反射,我們可以在運行時動態地獲取類的信息。這樣就可以獲取類的構造方法、字段、方法等信息,并進行相應的操作。35.異常處理,finaly里面的執行
答:(1)不管try中是否出現異常,finally塊中的代碼都會執行;
(2)當try和catch中有return時,finally依然會執行;
(3)finally中如果包含return,那么程序將在這里返回,而不是try或catch中的return返回,返回值就不是try或catch中保存的返回值了36.dubbo一次性數據量太大出現的情況
答:會出現Dubbo報錯Data length too large;首先看這種大數據是不是符合雙方約定的,如果是的話就去修改生產者xml payload參數,否則可以加一些限制。
37.throw 和 throws 的區別
答:throw代表動作,表示拋出一個異常的動作;
throws代表一種狀態,代表方法可能有異常拋出throw用在方法實現中,而throws用在方法聲明中;
throw只能用于拋出一種異常,而throws可以拋出多個異常
38.多線程鎖
39.分布式鎖原理
答:在多進程環境里面,通過外部的工具來達到加鎖功能
40.redis的看門狗(在沒有自定義釋放時間才會生效)
答:是redission提供的自動延期機制,使得分布式鎖可以自動延期,默認30秒。
41.分布式鎖遇到的問題
答:(1)可能忘記了釋放鎖;(2)釋放了別人的鎖;(3)鎖超時等問題
42.分布式鎖的方式
答:redission、zk、數據庫
43.線程池參數的設定
答:(1) IO 密集型任務:2*核心數+1
(2) CPU密集型任務:核心數+1
即使當計算(CPU)密集型的線程偶爾由于頁缺失故障或者其他原因而暫停時,這個“額外”的線程也能確保 CPU 的時鐘周期不會被浪費。
44.網絡狀態的含義:401等等
答:(1)401 Unauthorized:請求要求身份驗證。客戶端需要進行身份驗證才能獲取請求的內容。如果請求未包含有效的身份驗證憑據,服務器可能返回此狀態碼。
(2)400 Bad Request:客戶端發送的請求有錯誤。服務器不理解或無法處理客戶端發送的請求。這可能是由于參數錯誤、缺少必要的信息或語法錯誤等引起的。
(3)403 Forbidden:服務器拒絕了客戶端的請求。客戶端沒有訪問請求的權限,無法獲取請求的資源。
(4)404 Not Found:請求的資源不存在。服務器未能找到請求的資源。這可能是由于資源被刪除或請求的 URL 錯誤等引起的。
(5)502 Bad Gateway:服務器作為網關或代理,從上游服務器接收到無效的響應。通常表示上游服務器發生了故障或響應超時。45.如何快速找到nginx目錄
答:(1)在默認安裝位置下查看,大多數一般會安裝在默認位置下(/usr/local/openresty/nginx 或/usr/local/nginx)
(2)查看nginx進程(ps -aux|grep nginx)
(3)nginx運行進程,執行ls -l /proc/進程號/exe ,然后會打印出安裝/運行位置46.docker
答:docker是一個開源的應用容器引擎,開發者可以把程序及其依賴項打包到一個可移值的鏡像中,可以在任意的linux/Windows系統上運行
這些鏡像。47.主從復制
48.jvm調優
49.Linux命令
50.消息中間件的原理(Kafka、Pulsar等等)以及項目運用情況
51.數據庫死鎖(互斥條件、請求與保持條件、不剝奪條件、循環等待條件)
答:兩個或多個事務競爭資源導致互相等待稱為死鎖52.如何查看死鎖
答:查看錯誤日志、使用命令:SHOW ENGINE INNODB STATUS53.死鎖解決方法:
答:手動解決:回滾其中一個事務
設置鎖等待超時時間讓其自動解除54.如何避免死鎖:
答:(1)避免大事務
(2)合理設計索引減少表掃描
(3)減少鎖粒度55.vue的生命周期
答:(1)創建階段:beforeCreate(進行數據偵聽和事件/偵聽器的配置之前同步調用),created(可以訪問數據了)
(2)掛載階段:beforeMount(dom馬上被渲染),mounted(dom被渲染出來了)
(3)更新階段:beforeUpdate(數據發送了變化,dom還沒更新),updated(數據更改導致dom被更改)
(4)銷毀階段:beforeDestroy(實例銷毀前的調用),destroyed(實例被銷毀,vue指令被解除)56.vue如何防抖:
答:多次輸入,只提交最后一次,主要思想就是定時器57.前端vue如何節流:
答:多次點擊,只執行一次函數58.SpringBoot的自動裝配
答:SpringBoot主要解決了Spring傳統重量級xml配置bean
啟動類里面有@SpringBootApplication注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan。
其中@SpringBootConfiguration注解標記啟動類為配置類
@ComponentScan注解會去掃描啟動類所在包及子包下面所標記的bean類由IOC去注冊為bean
@EnableAutoConfiguration通過 @Import 注解導入 AutoConfigurationImportSelector類,然后通過AutoConfigurationImportSelector 類的 selectImports 方法去讀取需要被自動裝配的組件依賴下的spring.factories文件配置的組件的類全名,并按照一定的規則過濾掉不符合要求的組件的類全名,將剩余讀取到的各個組件的類全名集合返回給IOC容器并將這些組件注冊為bean59.nacos
答:用來做動態服務發現、配置管理、服務管理平臺
優點:可以動態的添加、刪除服務實例,無須重啟服務或者改代碼
可以提供不同環境、角色的配置
支持流量管理,可以進行控制、限流和熔斷
易于操作的管理界面
社區活躍60.線程池隊列類型:
LinkedBlockingDeque:鏈表同步阻塞隊列
ArrayBlockingQueue:數組同步阻塞隊列
SynchronousQueue:同步阻塞隊列61.如何引用bean,除了Resource和Autowired,出現了null什么原因,靜態類不會依賴管理
答:靜態方法獲取bean實例,采用Resource和Autowired會導致空指針。
首先說說場景:我有一個工具類,這個工具類要去調數據庫mapper做一些處理,靜態方法里面要使用mapper,這個mapper必須有static。
分析原因:靜態方法屬于類本身,不依賴類的實例狀態,無法直接訪問。
解決辦法:在某個類持有ApplicationContext 引用,通過他的上下文獲取62.hashmap如果沖突了,自身如何解決沖突
答:采用拉鏈法:類似hashmap在數組內添加一個鏈表63.有一個Kafka配置頁面,頁面有信息錄入和是否消費開關按鈕,如何去設計(如果用多線程,如果管理)
答:64.創建對象5種方式
答:省略65.if/else 和swatch case
答:swith/case使用跳轉表來提高效率,如果case數量較多,性能優于if/else
if/else是去遍歷每個條件
如果分支少且條件復雜,選擇if/else更合適66.kafka分區和gourp
答:Kafka為了提高并發性,生產者會把數據分發到多個分區,多個消費者可以組成一個消費組,一個分區數據只會被消費組的一個消費。
建議消費組中的消費者數量和分區partition保持一致67.Kafka消息堆積處理
答:分析是消費數量不夠還是消費處理時間較長68.同一個類,一個方法調用帶@Transctional的方法,會導致事務不生效?
答:調用實際上是在當前類的實例內部發生的。因此,它不會觸發 Spring AOP 代理的攔截,也就意味著不會觸發事務管理器的攔截器69.冒泡算法:
答:冒泡排序就是對待排序的的序列從前往后兩兩比較,如果發現逆序則交換,最終得到從小到大的順序70.修改文件權限、查看系統端口Linux命令
答:(1)修改文件權限:chmod 644 test.php #只有擁有者可以修改, 其他人只能看文件內容.,chmod o+w test.php
文件所有者可以用字母 u (user)表示. 用戶所在的組可以用字母 g (group)來表示. 其他人可以用字母 o (other)來表示. 所有人可以用字母 a (all)來表示.
(2)查看系統端口:netstat -ntlp//查看當前所有tcp端口·,查看一臺服務器上面哪些服務及端口:netstat -lanp71.gateway斷言、過濾器類型
答:斷言功能可以決定http請求應該由那個Route來做路由。就是我們nacos的predicates匹配規則
過濾器類型:
答:(1)網關過濾器(GatewayFilter):一般放在配置文件里面,比如nacos(spring.cloud.routes.filters),作用在所有路由上面
(2)全局過濾器(GlobalFilter):不用在配置文件中,比如全局日志過濾器,打印日志72.AQS?
答:用于構建鎖和同步器的基礎框架,用于并發編程,基于FIFO(First In, First Out)等待隊列的阻塞鎖和同步器73.maven命令
答:mvn -v、mvn package(依據項目生成 jar 文件 )、mvn install(在本地 Repository 中安裝 jar )、mvn clean(清除目標目錄中的生成結果)74.Kafka的Broker、Partition
答:(1)Broker是Kafka的實例,
(2)Topic是消息的主題,可以理解為消息的分類,數據就保存在里面,每個Broker可以建立多個Topic
(3)Partition是Topic的分區,分區的作用就是負載,提高Kafka的吞吐量75.java數據類型幾種
答:八種基本數據類型:byte、short、int、long;float、double;char;boolean
四種引用類型:數組、接口、類、(枚舉、注解、字符串、)76.docker
答:77.sa-token登錄考慮
答:78.xml模糊查詢的寫法
答:select * form user where name like concat(‘%’,#{name},‘%’)79.用mybatis的插件,需要實現什么
答:實現Interceptor80.redis list數據寫入命令
答:lpush key value(將元素添加到列表左邊),Rpush key value(將元素添加到列表右邊)81.ConcurrentHashMap的鎖粒度
答:ConcurrentHashMap在jdk1.8采用CAS+synchronized實現更加細粒度的鎖
鎖的粒度指的是鎖定共享資源的范圍大小
在jdk1.7鎖粒度是每個段(Segment),1.8是每個鏈表或紅黑樹的根節點82.java內存
答:指的就是jvm內存模型83.多線程包(JUC包):
答:JUC是java.util.concurrent包的簡稱84.并發
答:85.多線程
86.mysql批量插入
答:mybatis-plus實現批量插入:開啟insertBatchSomeColumn();
自定義sql注入器,繼承DefaultSqlInjector
將自定義sql注入器注冊為bean
新建mapper繼承BaseMapper,配置insertBatchSomeColumn()方法;87.springboot的缺點
答:(1)升級困難,每次升級變更較大
(2)依賴大量第三方庫,管理復雜且容易沖突
(3)資源占用較多88.SpringBoot讀取配置的6種方式
(1)使用@Value注解
(2)使用Environment接口
(3)使用@ConfigurationProperties注解
(4)使用PropertySource注解89.對于一個大文件,如何分批讀取來減輕內存壓力呢
答:采用OpenCsv來讀取,設置一個每次讀取的行數,如果集合size大于了這個行數,就去處理數據并清空集合。90.dubbo如何熔斷
答:使用mock機制:@Reference(mock = “return 666”)
配置熔斷參數:配置超時時間和重試次數來,停止調用服務91.Kafka和RabbitMQ的區別
答:應用場景方面:mq用于實時方面,可靠性要求比較高
Kafka用于活躍的流式數據,適合處理大數據量
消費模型:92.mysql的@符號
答:主要用于定義和使用用戶變量,93.vue3路由類型
答:(1)基本路由:只包含一個路由對象參數
(2)命名路由:包含了多個路由參數94.v-for為什么要用key
答:key的作用可以通過diff算法提高頁面的渲染效率95.left join 有大表和小表,誰放在前面?
答:讓小表作為驅動表效率更高,他的掃描rows會更少96.學生表,姓名、科目、成績,找出全部科目都及格的學生
答:select name ,count(*) from student s
where grades >=60 group by name having count(*)>=3 ;
這里我限定三門了97.領域驅動DDD(Domain-Driven Design,簡稱 DDD)
答:他是一種面向對象的設計方法,強調業務邏輯和領域模型置于軟件設計中心。
總結:
首先就是把自己的項目講清楚,特別是自己項目涉及的技術盡量把底層也弄懂,現在的面試占比可能項目占70%,八股文也就30%。如果有涉及筆試的話,建議多看看表結構設計,sql要能手寫出來比較好。還有就是自己的簡歷可以多優化一下,不要太簡單了,多找厲害的朋友參考參考。
其次感覺整個行情變差了,工資也壓得厲害。對于中小型自研公司他們需要比較全能的人吧,對于我這種底層碼農感覺橫向的學習挺重要的,比如前端開發、Python這種可以多學學。
對于社招感覺面比較窄,比如零售的行業你必須要有零售開發項目,制造業你可能得會ERP之類的。
感覺現在五年經驗還挺受歡迎的,隨便瞎寫的,大家將就看。
外包慎重,加油!