java初中级面试题汇总
java面試題目匯總
- 一:java初級篇
- 1:== 和equal的區(qū)別底層原理:
- 2:String和StringBuffer StringBuilder 的區(qū)別底層原理和各自使用場景:
- 3:cookie的和session的聯(lián)系:禁用cookie之后有有什么后果可以實(shí)現(xiàn)session嗎?
- 4:freemarker的模板后綴是什么:
- 5:單例模式是線程安全的嗎?如何修改為多例
- 6:編碼格式之間的區(qū)別(UTF-8 和UTF-16):
- 7:鎖有哪些:Synchronized和lock哪些區(qū)別;解釋CAS
- 8:hashmap的底層原理;詳細(xì)解釋紅黑樹的原理**
- 9:ArrayList和Linklist的區(qū)別
- 10:接口和抽象類的區(qū)別:
- 11:Hashmap和Hashtable和ConcurrentHashMap的區(qū)別和聯(lián)系
- 13:聊一下maven加載jar包的順序:
- 14:手機(jī)電話號等怎樣做前后端交互的;如果要實(shí)現(xiàn)一個需求對外界所有的敏感信息都進(jìn)行加密改如何設(shè)計;
- 15:object有哪些方法
- 16:Array和ArrayList的區(qū)別
- 17:類加載順序
- 18:start和run的區(qū)別
- 19:java創(chuàng)建對象的方法
- 20:實(shí)例化加載順序
- 21:get和post的區(qū)別
- 22:跨域的解決辦法
- 23:樂觀鎖和悲觀鎖
- 24:死鎖的解決辦法和產(chǎn)生原因
- 25:講一講NIO BIO AIO
- 26:深copy和淺copy的區(qū)別
- 二:Spring&SpringMVC篇
- 1:怎樣聲明一個bean
- 2:怎樣修改bean的作用域
- 3:怎末注入Bean:有哪些方式
- 4:怎樣定義一個切面:有哪些標(biāo)簽;有哪些代理
- 5:線程池原理:如何啟動一個線程;幾種方式;線程池有哪些參數(shù)
- 6:bean和beanFactory和FactoryBean和ApplicationContext;那些關(guān)系 那些聯(lián)系
- 7:bean是如何注入到后臺的:
- 8:什么是SpringDateJPA
- 9:spring事務(wù)傳播方式
- 10:SpringMVC的啟動原理
- 三:SpringBoot篇
- 1:SpringBoot的啟動過程原理
- 2:SpringBoot優(yōu)點(diǎn)
- 四:redis篇
- 1:如何保證原子性:
- 2:redis的管道技術(shù):
- 3:聊一下redis的集群模式
- 4:聊一下 set和zset的區(qū)別
- 4:如何做到數(shù)據(jù)不丟失:RDB 和AOP 線上是這樣操作的嗎?
- 5:聊一下雪崩和緩存穿透問題解決方案
- 6:redis的模式有哪些?redis的主節(jié)點(diǎn)掛掉如何解決
- 五:nginx篇
- 1:配置文件怎樣配置;做到請求輪訓(xùn)的
- 2:nginx還有那些用處
- 六:mybatis&&hibernate篇
- 1:Btree和B+tree的區(qū)別:
- 2:索引的級別:
- 3:索引的種類:
- 4:如何選擇索引:
- 5:sql如何調(diào)優(yōu):
- 6:如何設(shè)計表結(jié)構(gòu);需要注意哪些點(diǎn);數(shù)據(jù)庫三范式:
- 7:一級緩存;二級緩存理解
- 8:JPA和hibernate的關(guān)系:
- 9:mybatis和hibernate的區(qū)別:
- 七:命令篇
- 1:查看那個端口被禁用**
- 2:查看端口使用情況
- 3:查看命令前幾行
- 八:消息篇
- 1:activemq的消息消費(fèi)形式那些
- 2:如何保證數(shù)據(jù)不丟失 詳細(xì)解釋ack原理
- 3:如何保證順序消費(fèi):
- 4:如何保證冪等性問題
- 5:rabbit有幾種廣播方式
- 九:git篇
- 1:怎樣拉去一個分支;
- 十:JVM篇
- 1:jvm的參數(shù)有哪些
- 2:jvm有哪些區(qū)
- 3:JVM加載class的順序
- 3:年輕代與年老代的區(qū)別聯(lián)系;8:1:1的理解
- 十一:focker篇
- 1:如何拉取一個鏡像
- 2:如何創(chuàng)建一個鏡像
- 3:如何啟動一個鏡像;需要哪些參數(shù)
以下是本人面試被問到的問題,我自己總結(jié)的答案。如有問題請評論我,鄙人仔細(xì)改正。如果幫到您,請收藏喲,本人博客永久更新。
一:java初級篇
1:== 和equal的區(qū)別底層原理:
答:==當(dāng)為基本數(shù)據(jù)類型時比較的是對象的值是否一樣,當(dāng)作為引用數(shù)據(jù)類型時,則比較的是內(nèi)存地址
equals方法不能作用于基本數(shù)據(jù)類型的變量,equals繼承Object類,比較的是是否是同一個對象。如果沒有對equals方法進(jìn)行重寫,則比較的是引用類型的變量所指向的對象的地址;
舉例子:
String a="a"; String b=new String("a"); String d=new String("a"); System.out.println(a==b);//false System.out.println(a.equals(b));//true System.out.println(a==d);//false System.out.println(a.equals(d));//true2:String和StringBuffer StringBuilder 的區(qū)別底層原理和各自使用場景:
String字符串屬于對象,每次就行修改都會在堆內(nèi)存開辟新的對象非常,因此非常耗費(fèi)性能
StringBuffer和StringBuilder 可以對對象進(jìn)行多次修改,不會產(chǎn)生心的對象,兩者的區(qū)別就是,StringBuilder 是線程不安全的,但是StringBuilder 有速度的優(yōu)勢。
3:cookie的和session的聯(lián)系:禁用cookie之后有有什么后果可以實(shí)現(xiàn)session嗎?
cookie是保存在瀏覽器端不安全的。
session是儲存在服務(wù)器端但是訪問量增多話會損耗服務(wù)器的性能。單個cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個站點(diǎn)最多保存20個cookie。
4:freemarker的模板后綴是什么:
ftl
5:單例模式是線程安全的嗎?如何修改為多例
不安全的,修改作用域
6:編碼格式之間的區(qū)別(UTF-8 和UTF-16):
7:鎖有哪些:Synchronized和lock哪些區(qū)別;解釋CAS
前者是鎖住的方法和代碼塊 ,是托管給JVM來進(jìn)行管理,解鎖上鎖都是內(nèi)部控制的。
后者是需要指定開始位置和結(jié)束位置,lock的代碼塊來進(jìn)行處理的,lock的解鎖必須手動在fianlly中釋放,避免引起死鎖。
8:hashmap的底層原理;詳細(xì)解釋紅黑樹的原理**
9:ArrayList和Linklist的區(qū)別
arraylist底層是數(shù)組結(jié)構(gòu):對get和set的調(diào)用花費(fèi)較小,缺點(diǎn)是新項(xiàng)的插入和現(xiàn)有項(xiàng)的刪除代價昂貴
linklist底層是雙鏈結(jié)構(gòu):新項(xiàng)的插入和現(xiàn)有項(xiàng)的刪除均開銷很小,這里假設(shè)變動項(xiàng)的位置是已知的。
10:接口和抽象類的區(qū)別:
1.抽象類與接口定義不同:抽象類abstract class ,接口 interface
2.接口里只能包含抽象方法,不包含已經(jīng)實(shí)現(xiàn)的方法;抽象類則完全可以包含普通的方法。
3.接口里不能定義靜態(tài)方法;抽象類可以定義靜態(tài)方法
4.接口里只能定義靜態(tài)常量屬性,不能定義普通屬性;抽象類里既可以定義普通屬性,也可以定義靜態(tài)常量
5.接口不包含構(gòu)造函數(shù);抽象類可以包含構(gòu)造函數(shù),抽象類里的構(gòu)造函數(shù)并不是用于創(chuàng)建對象,而是讓其子類調(diào)用這些構(gòu)造函數(shù)來完成屬于抽象類的初始化操作。
6.接口不包含初始化塊,但抽象類可以包含初始化塊
7.一個類最多只能有一個直接父類,包括抽象類;但一個類可以直接實(shí)現(xiàn)多個接口,通過實(shí)現(xiàn)多個接口可以彌補(bǔ)Java的單繼承不足
11:Hashmap和Hashtable和ConcurrentHashMap的區(qū)別和聯(lián)系
hashmap不是線程安全的,地層是node數(shù)組,key可以為null;jdk1.8之前底層結(jié)構(gòu)是數(shù)組+鏈表,jdk1.8之后使用了數(shù)組+鏈表/紅黑樹
hashtable是線程安全的,key不能為null;默認(rèn)的初始大小為11,之后每次擴(kuò)充,容量變?yōu)樵瓉淼?n+1
底層采用分段的數(shù)組+鏈表實(shí)現(xiàn),線程安全
通過把整個Map分為N個Segment,可以提供相同的線程安全,但是效率提升N倍,默認(rèn)提升16倍。(讀操作不加鎖,由于HashEntry的value變量是 volatile的,也能保證讀取到最新的值。)
13:聊一下maven加載jar包的順序:
14:手機(jī)電話號等怎樣做前后端交互的;如果要實(shí)現(xiàn)一個需求對外界所有的敏感信息都進(jìn)行加密改如何設(shè)計;
15:object有哪些方法
16:Array和ArrayList的區(qū)別
ArrayList可以存儲異構(gòu)對象,而Array只能存儲相同數(shù)據(jù)類型的數(shù)據(jù)。
Array的長度實(shí)際上是不可變的,ArrayList的長度既可以指定(即使指定了長度,也會自動2倍擴(kuò)容)也可以不指定,是變長的。
17:類加載順序
加載–>驗(yàn)證–>準(zhǔn)備–>解析–>初始化
18:start和run的區(qū)別
使用start()方法具有異步執(zhí)行的效果,而使用run()方法是同步執(zhí)行的效果,運(yùn)行結(jié)果中規(guī)中矩。
使用start()方法,是真的啟動了相應(yīng)的線程,而使用run()方法并沒有真的啟動線程,而是由一個叫main的主線程去調(diào)用的run()方法。
所以,正確啟動線程的方式是使用start()方法。
19:java創(chuàng)建對象的方法
new創(chuàng)建對象
反射的機(jī)制創(chuàng)建對象
采用clone
序列化機(jī)制
20:實(shí)例化加載順序
當(dāng)創(chuàng)建類對象時,先初始化靜態(tài)變量和靜態(tài)塊,然后是非靜態(tài)變量和非靜態(tài)代碼塊,然后是構(gòu)造器。由于靜態(tài)成員只會被初始化一次,所以如果靜態(tài)成員已經(jīng)被初始化過,將不會被再次初始化
21:get和post的區(qū)別
get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器傳送數(shù)據(jù)。
get傳送的數(shù)據(jù)量較小,不能大于2KB,post傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制。
get安全性非常低,post安全性較高。
22:跨域的解決辦法
23:樂觀鎖和悲觀鎖
原子性
一致性
持久性
隔離性
24:死鎖的解決辦法和產(chǎn)生原因
25:講一講NIO BIO AIO
https://blog.csdn.net/ty497122758/article/details/78979302
26:深copy和淺copy的區(qū)別
二:Spring&SpringMVC篇
1:怎樣聲明一個bean
@Component 沒有明確角色的組件
@Service 在業(yè)務(wù)邏輯層(Service層)使用
@Repositpry 在數(shù)據(jù)訪問層(dao層)使用
@Controller 用于標(biāo)注控制層組件
@RestController
2:怎樣修改bean的作用域
@Scope標(biāo)簽
有五個作用域
singleton單例模式:Spring 容器中有且只有一個Bean實(shí)例,只要Spring容器不銷毀或退出,該Bean實(shí)例就會一直存活
prototype原型模式:每次獲取Bean的時候會有一個新的實(shí)例,Spring容器不能對返回Bean實(shí)例的整個生命周期負(fù)責(zé)
request:request只適用于Web程序,每一次HTTP請求都會產(chǎn)生一個新的bean,同時該bean僅在當(dāng)前HTTP request內(nèi)有效,當(dāng)請求結(jié)束后,該對象的生命周期即告結(jié)束
session:session只適用于Web程序,session作用域表示該針對每一次HTTP請求都會產(chǎn)生一個新的bean,同時該bean僅在當(dāng)前HTTP session內(nèi)有效
application:application只適用于Web程序,全局作用域
3:怎末注入Bean:有哪些方式
1:屬性注入:屬性注入要求bean提供一個默認(rèn)的構(gòu)造函數(shù),并且得為需要注入的屬性提供set方法。
2:構(gòu)造函數(shù)注入:bean必須提供帶參的構(gòu)造函數(shù)。
3:使用Filed注入(用于注解方式).@Resource或者@Autowired、
4:怎樣定義一個切面:有哪些標(biāo)簽;有哪些代理
@Aspect定義切點(diǎn)類
@Pointcut定義切點(diǎn)
5:線程池原理:如何啟動一個線程;幾種方式;線程池有哪些參數(shù)
繼承Thread;
實(shí)現(xiàn)Runnable接口;
使用線程池創(chuàng)建
避免使用Executors創(chuàng)建線程池,主要是避免使用其中的默認(rèn)實(shí)現(xiàn),那么我們可以自己直接調(diào)用ThreadPoolExecutor的構(gòu)造函數(shù)來自己創(chuàng)建線程池。在創(chuàng)建的同時,給BlockQueue指定容量就可以了。
public class ExecutorsDemo {private static ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();private static ExecutorService pool = new ThreadPoolExecutor(5, 200,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());public static void main(String[] args) {for (int i = 0; i < Integer.MAX_VALUE; i++) {pool.execute(new SubThread());}} }6:bean和beanFactory和FactoryBean和ApplicationContext;那些關(guān)系 那些聯(lián)系
BeanFactory 以Factory結(jié)尾,表示它是一個工廠類,用于管理Bean的一個工廠 在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)來進(jìn)行管理的。
但對FactoryBean而言,這個Bean不是簡單的Bean,而是一個能生產(chǎn)或者修飾對象生成的工廠Bean,
它的實(shí)現(xiàn)與設(shè)計模式中的工廠模式和修飾器模式類似。
ApplicationContext:
應(yīng)用上下文,繼承BeanFactory接口,它是Spring的一各更高級的容器,提供了更多的有用的功能;
BeanFactory在啟動的時候不會去實(shí)例化Bean,中有從容器中拿Bean的時候才會去實(shí)例化;
ApplicationContext在啟動的時候就把所有的Bean全部實(shí)例化了。它還可以為Bean配置lazy-init=true來讓Bean延遲實(shí)例化;
7:bean是如何注入到后臺的:
后要是默認(rèn)hashmap形式儲存到后臺的,key=bean的name value為bean的對象
8:什么是SpringDateJPA
操作數(shù)據(jù)庫的規(guī)范
9:spring事務(wù)傳播方式
Propagation.required:如果當(dāng)前存在事務(wù),則加入該事務(wù),如果當(dāng)前不存在事務(wù),則創(chuàng)建一個新的事務(wù)。
Propagation.supports:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
Propagation.mandatory
如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則拋出異常。
Propagation.requires_new
重新創(chuàng)建一個新的事務(wù),如果當(dāng)前存在事務(wù),延緩當(dāng)前的事務(wù)。
Propagation.not_supported
以非事務(wù)的方式運(yùn)行,如果當(dāng)前存在事務(wù),暫停當(dāng)前的事務(wù)。
Propagation.never
以非事務(wù)的方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。
Propagation.nested
如果沒有,就新建一個事務(wù);如果有,就在當(dāng)前事務(wù)中嵌套其他事務(wù)。
10:SpringMVC的啟動原理
三:SpringBoot篇
1:SpringBoot的啟動過程原理
2:SpringBoot優(yōu)點(diǎn)
1:內(nèi)嵌servlet容器
2:提供starter簡化Maven配置
3:自動裝配Spring
4:SpringBoot提供基于http ssh telnet對運(yùn)行時的項(xiàng)目進(jìn)行監(jiān)控。
5:無代碼生產(chǎn)和xml配置
四:redis篇
1:如何保證原子性:
調(diào)用SETNX命令對某個鍵進(jìn)行加鎖
2:redis的管道技術(shù):
3:聊一下redis的集群模式
4:聊一下 set和zset的區(qū)別
4:如何做到數(shù)據(jù)不丟失:RDB 和AOP 線上是這樣操作的嗎?
5:聊一下雪崩和緩存穿透問題解決方案
讀庫之后回寫數(shù)據(jù),添加超時時間方式緩存穿透問題,雪崩問題
6:redis的模式有哪些?redis的主節(jié)點(diǎn)掛掉如何解決
主從模式:
1、每個客戶端連接redis實(shí)例的時候都是指定了ip和端口號的,如果所連接的redis實(shí)例因?yàn)楣收舷戮€了,而主從模式也沒有提供一定的手段通知客戶端另外可連接的客戶端地址,因而需要手動更改客戶端配置重新連接
2、主從模式下,如果主節(jié)點(diǎn)由于故障下線了,那么從節(jié)點(diǎn)因?yàn)闆]有主節(jié)點(diǎn)而同步中斷,因而需要人工進(jìn)行故障轉(zhuǎn)移工作
3、無法實(shí)現(xiàn)動態(tài)擴(kuò)容
哨兵模式:
被監(jiān)視的主服務(wù)器進(jìn)入下線狀態(tài)時,自動將下線主服務(wù)器屬下的某個從服務(wù)器升級為新的主服務(wù)器
redis cluster模式
五:nginx篇
1:配置文件怎樣配置;做到請求輪訓(xùn)的
2:nginx還有那些用處
六:mybatis&&hibernate篇
1:Btree和B+tree的區(qū)別:
Btree:
(1)所有鍵值分布在整個樹中
(2)任何關(guān)鍵字出現(xiàn)且只出現(xiàn)在一個節(jié)點(diǎn)中
(3)搜索有可能在非葉子節(jié)點(diǎn)結(jié)束
(4)在關(guān)鍵字全集內(nèi)做一次查找,性能逼近二分查找算法
B+tree
(1)所有關(guān)鍵字存儲在葉子節(jié)點(diǎn),非葉子節(jié)點(diǎn)不存儲真正的data
(2)為所有葉子節(jié)點(diǎn)增加了一個鏈指針
2:索引的級別:
system > const > eq_ref > ref > range > index > All
3:索引的種類:
全文索引;唯一索引;主鍵索引;組合索引;普通索引
4:如何選擇索引:
5:sql如何調(diào)優(yōu):
6:如何設(shè)計表結(jié)構(gòu);需要注意哪些點(diǎn);數(shù)據(jù)庫三范式:
1:單個字段不能拆分
2:確保表中的每列都和主鍵相關(guān)
3:確保每列都和主鍵列直接相關(guān),而不是間接相關(guān)
7:一級緩存;二級緩存理解
8:JPA和hibernate的關(guān)系:
JPA就是一個接口;hibernate是他的實(shí)現(xiàn)
9:mybatis和hibernate的區(qū)別:
1:hibernate是全自動,而mybatis是半自動。
2. hibernate數(shù)據(jù)庫移植性遠(yuǎn)大于mybatis。
3. sql直接優(yōu)化上,mybatis要比hibernate方便很多
mybatis:小巧、方便、高效、簡單、直接、半自動
hibernate:強(qiáng)大、方便、高效、復(fù)雜、繞彎子、全自動
七:命令篇
1:查看那個端口被禁用**
netstat -anp |grep 端口
2:查看端口使用情況
netstat -nultp
3:查看命令前幾行
grep -A 10 ‘123’ test.log //打印匹配行的后10行
grep -B 10 ‘123’ test.log//打印匹配行的前10行
八:消息篇
1:activemq的消息消費(fèi)形式那些
集群消費(fèi)
廣播消費(fèi)
2:如何保證數(shù)據(jù)不丟失 詳細(xì)解釋ack原理
3:如何保證順序消費(fèi):
1.Producer端保證發(fā)送消息有序,且發(fā)送到同一個隊列。
2.consumer端保證消費(fèi)同一個隊列。
4:如何保證冪等性問題
5:rabbit有幾種廣播方式
九:git篇
1:怎樣拉去一個分支;
十:JVM篇
1:jvm的參數(shù)有哪些
https://www.cnblogs.com/sxdcgaq8080/p/7156227.html
2:jvm有哪些區(qū)
JAVA棧
本機(jī)方法棧
程序計數(shù)器
堆
方法區(qū)
3:JVM加載class的順序
3:年輕代與年老代的區(qū)別聯(lián)系;8:1:1的理解
Edon:S0:S1比例為8:1:1當(dāng)S0或者S1區(qū)滿時候進(jìn)行一次minGC這時到年老帶,當(dāng)年老帶滿時進(jìn)行fullGC
常用的計數(shù)器算法為:
標(biāo)記清楚算法
標(biāo)記整理算法
分帶垃圾回收算法
復(fù)制算法
十一:focker篇
1:如何拉取一個鏡像
2:如何創(chuàng)建一個鏡像
3:如何啟動一個鏡像;需要哪些參數(shù)
總結(jié)
以上是生活随笔為你收集整理的java初中级面试题汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 30s入门Kotlin数组
- 下一篇: 地铁媒体广告的特点