1.== 和 equals的區(qū)別?
== 比較的是兩個變量的值是否相等,也就是用于比較變量所對應的內(nèi)存中
所存儲的數(shù)值是否相等. 要比較兩個基本類型的數(shù)據(jù)或兩個引用變量是否
相等,只能用==操作符。
equals方法是用于比較兩個獨立對象的內(nèi)容是否相同,就好比去比較兩個
人的長相是否相同,它比較的兩個對象是獨立的。
2.Array和ArrayList之間的區(qū)別?
1. Array類型的變量在聲明的同時必須進行實例化(至少得初始化數(shù)組的
大小)恋脚,而ArrayList可以只是先聲明。
2. Array只能存儲同構(gòu)的對象钙态,而ArrayList可以存儲異構(gòu)的對象慧起。
同構(gòu)的對象是指類型相同的對象.而ArrayList可以存放任何不同類型的數(shù)據(jù)
3 在CLR托管對中的存放方式:Array是始終是連續(xù)存放的,而ArrayList的
存放不一定連續(xù)册倒。
4 初始化大小
Array對象的初始化必須只定指定大小蚓挤,且創(chuàng)建后的數(shù)組大小是固定的,
而ArrayList的大小可以動態(tài)指定,其大小可以在初始化時指定灿意,也可以不指
定估灿,也就是說該對象的空間可以任意增加。
Array和ArrayList的相似點
1 都具有索引(index),即可以通過index來直接獲取和修改任意項缤剧。
2 他們所創(chuàng)建的對象都放在托管堆中馅袁。
3 都能夠?qū)ψ陨磉M行枚舉(因為都實現(xiàn)了IEnumerable接口)。
ArrayList的一些特性
3. Redis 常見的性能問題和解決方法
性能問題:
1.Master寫內(nèi)存快照荒辕,save命令調(diào)度rdbSave函數(shù)汗销,會阻塞主線程的工作,
當快照比較大時對性能影響是非常大的抵窒,會間斷性暫停服務弛针,所以Master最
好不要寫內(nèi)存快照。
2.Master AOF持久化李皇,如果不重寫AOF文件削茁,這個持久化方式對性能的影響
是最小的,但是AOF文件會不斷增大掉房,AOF文件過大會影響Master重啟的恢復
速度
3.Master調(diào)用BGREWRITEAOF重寫AOF文件茧跋,AOF在重寫的時候會占大量的C
PU和內(nèi)存資源,導致服務load過高卓囚,出現(xiàn)短暫服務暫婉迹現(xiàn)象。
4.Redis主從復制的性能問題哪亿,Redis的主從復制是建立在內(nèi)存快照的持久化
基礎上富寿,只要有Slave就一定會有內(nèi)存快照發(fā)生。雖然Redis宣稱主從復制無
阻塞锣夹,但由于磁盤io的限制,如果Master快照文件比較大苏潜,那么dump會耗費
比較長的時間银萍,這個過程中Master可能無法響應請求,也就是說服務會中斷恤左,
對于關鍵服務贴唇,這個后果也是很可怕的。
5.單點故障問題飞袋,由于目前Redis的主從復制還不夠成熟戳气,所以存在明顯的單
點故障問題,這個目前只能自己做方案解決巧鸭,如:主動復制
解決方法:
1.Master最好不要做任何持久化工作瓶您,包括內(nèi)存快照和AOF日志文件,特別是
不要啟用內(nèi)存快照做持久化。
2.如果數(shù)據(jù)比較關鍵呀袱,某個Slave開啟AOF備份數(shù)據(jù)贸毕,策略為每秒同步一次。
3.為了主從復制的速度和連接的穩(wěn)定性夜赵,Slave和Master最好在同一個局域網(wǎng)
內(nèi)明棍。
4.盡量避免在壓力較大的主庫上增加從庫
5.為了Master的穩(wěn)定性,主從復制不要用圖狀結(jié)構(gòu)寇僧,用單向鏈表結(jié)構(gòu)更穩(wěn)定摊腋,
即主從關系為:Master<--Slave1<--Slave2<--Slave3.......,這樣的
結(jié)構(gòu)也方便解決單點故障問題嘁傀,實現(xiàn)Slave
4.GC是什么兴蒸,為什么會有GC?顯示調(diào)用GC會立即進行垃圾回收嗎?為什么?
- GC: GC是垃圾收集的意思.特指java中jvm的垃圾回收機制.
- GC存在的原因:及時的清理內(nèi)存,讓程序執(zhí)行更流暢,避免內(nèi)存泄漏和浪費資源.
java的垃圾回收不需要程序員手動去處理,而是jvm自動的進行.讓程序員更注重
業(yè)務開發(fā).
- 但是gc本身是一個單獨的線程,而且是一個優(yōu)先級很低的線程.不可預知的情況
下對內(nèi)存堆中已經(jīng)死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能
實時的調(diào)用垃圾回收器對某個對象或所有對象進行垃圾回收心包。
- 垃圾回收主要是對jvm的堆進行操作.
- 顯示調(diào)用GC不會立即進行垃圾回收,因為他是一個優(yōu)先級比較低的線程,所以當
時如果有其他線程在運行就不會立即執(zhí)行垃圾回收.
5.Java 中會存在內(nèi)存泄漏嗎类咧,請簡單描述。
理論上Java因為有垃圾回收機制(GC)不會存在內(nèi)存泄露問題(這也是Java被廣泛使用于服務
器端編程的一個重要原因)蟹腾;然而在實際開發(fā)中痕惋,可能會存在無用但可達的對象,這些對象不能
被GC回收也會發(fā)生內(nèi)存泄露娃殖。一個例子就是Hibernate的Session(一級緩存)中的對象屬于持
久態(tài)值戳,垃圾回收器是不會回收這些對象的,然而這些對象中可能存在無用的垃圾對象炉爆。
6.MQ(消息隊列)是什么堕虹,應用場景有哪些?
MQ是系統(tǒng)之間進行通信。使用Activemq的話可以對系統(tǒng)之間的調(diào)用進行解耦芬首,實現(xiàn)系統(tǒng)間的異
步通信赴捞。原理就是生產(chǎn)者生產(chǎn)消息,把消息發(fā)送給activemq郁稍。Activemq接收到消息赦政,然后查
看有多少個消費者,然后把消息轉(zhuǎn)發(fā)給消費者耀怜,此過程中生產(chǎn)者無需參與恢着。消費者接收到消息后
做相應的處理和生產(chǎn)者沒有任何關系。
應用場景:在項目中主要是完成系統(tǒng)之間通信财破,并且將系統(tǒng)之間的調(diào)用進行解耦掰派。例如在添加、
修改商品信息后左痢,需要將商品信息同步到索引庫靡羡、同步緩存中的數(shù)據(jù)以及生成靜態(tài)頁面一系列
操作系洛。在此場景下就可以使用activemq。一旦后臺對商品信息進行修改后亿眠,就向activemq發(fā)
送一條消息碎罚,然后通過activemq將消息發(fā)送給消息的消費端,消費端接收到消息可以進行相
應的業(yè)務處理
Activemq有兩種通信方式纳像,點到點形式和發(fā)布訂閱模式荆烈。如果是點到點模式的話,如果消息發(fā)
送不成功此消息默認會保存到activemq服務端知道有消費者將其消費竟趾,所以此時消息是不會丟
失的
如果是發(fā)布訂閱模式的通信方式憔购,默認情況下只通知一次,如果接收不到此消息就沒有了岔帽。這種場
景只適用于對消息送達率要求不高的情況玫鸟。如果要求消息必須送達不可以丟失的話,需要配置持
久訂閱犀勒。每個訂閱端定義一個id屎飘,在訂閱是向activemq注冊。發(fā)布消息和接收消息時需要配置
發(fā)送模式為持久化贾费。此時如果客戶端接收不到消息钦购,消息會持久化到服務端,直到客戶端正常接
收后為止
7.抽象類和接口的區(qū)別褂萧?
含有abstract修飾符的class即為抽象類
1.抽象類可以有構(gòu)造方法押桃,接口中不能有構(gòu)造方法。
2.抽象類中可以有普通成員變量导犹,接口中沒有普通成員變量
3.抽象類中可以包含非抽象的普通方法唱凯,接口中的所有方法必須都是抽象的,不能有非抽
象的普通方法 谎痢。
4. 抽象類中的抽象方法的訪問類型可以是public磕昼,protected和default,但接口中的
抽象方法只能是 public類型的节猿,并且默認即為public abstract類型掰烟。
5. 抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法
6. 抽象類和接口中都可以包含靜態(tài)成員變量沐批,抽象類中的靜態(tài)成員變量的訪問類型可以任意,
但接口 中定義的變量只能是public static final類型蝎亚,并且默認即為public static
final類型九孩。
7. 一個類可以實現(xiàn)多個接口,但只能繼承一個抽象類发框。
8.遞歸與迭代的區(qū)別?
遞歸的基本概念:程序調(diào)用自身的編程技巧稱為遞歸,是函數(shù)自己調(diào)用自己.
使用遞歸要注意的有兩點:
1)遞歸就是在過程或函數(shù)里面調(diào)用自身;
2)在使用遞歸時,必須有一個明確的遞歸結(jié)束條件,稱為遞歸出口.
遞歸分為兩個階段:
1)遞推:把復雜的問題的求解推到比原問題簡單一些的問題的求解;
2)回歸:當獲得最簡單的情況后,逐步返回,依次得到復雜的解.
迭代:利用變量的原值推算出變量的一個新值.如果遞歸是自己調(diào)用自己的話,迭代就是A不
停的調(diào)用B.
遞歸中一定有迭代,但是迭代中不一定有遞歸,大部分可以相互轉(zhuǎn)換.能用迭代的不用遞歸,
遞歸調(diào)用函數(shù),浪費空間,并且遞歸太深容易造成堆棧的溢出.