這份Java面試題整整花了三個月的時間來整理,都是自己再工作中總結出來,記住多少就寫多少,希望這份資料可以幫助你們,文末有其余部分資料的領取方式.

Redis12道面試題
1.什么是Redis?
答:Remote Dictionary Server(Redis)是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。它通常被稱為數據結構服務器
2. Redis有哪些數據結構?
字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。如果你是Redis中高級用戶,還需要加上下面幾種數據結構HyperLogLog、Geo、Pub/Sub。如果你說還玩過Redis Module,像BloomFilter,RedisSearch,Redis-ML
3.Redis的特點什么是?
(1). 支持多種數據結構,如 string(字符串)、 list(雙向鏈表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基數估算)
(2). 支持持久化操作,可以進行aof及rdb數據持久化到磁盤,從而進行數據備份或數據恢復等操作,較好的防止數據丟失的手段。
(3). 支持通過Replication進行數據復制,通過master-slave機制,可以實時進行數據的同步復制,支持多級復制和增量復制,master-slave機制是Redis進行HA的重要手段。單進程請求,所有命令串行執行,并發情況下不需要考慮數據一致性問題。
4.Redis的操作是原子性的,怎么保證原子性的?
對于Redis而言,命令的原子性指的是:一個操作的不可以再分,操作要么執行,要么不執行。Redis的操作之所以是原子性的,是因為Redis是單線程的。Redis本身提供的所有API都是原子操作,Redis中的事務其實是要保證批量操作的原子性。多個命令在并發中也是原子性的嗎?不一定, 將get和set改成單命令操作,incr 。使用Redis的事務,或者使用Redis+Lua==的方式實現.
5.Redis 內部結構
(1).dict 本質上是為了解決算法中的查找問題(Searching)是一個用于維護key和value映射關系的數據結構,與很多語言中的Map或dictionary類似。 本質上是為了解決算法中的查找問題(Searching)
(2).sds sds就等同于char * 它可以存儲任意二進制數據,不能像C語言字符串那樣以字符’0’來標識字符串的結 束,因此它必然有個長度字段。
(3).skiplist (跳躍表) 跳表是一種實現起來很簡單,單層多指針的鏈表,它查找效率很高,堪比優化過的二叉平衡樹,且比平衡樹的實現,
(4).quicklist(5).ziplist 壓縮表 ziplist是一個編碼后的列表,是由一系列特殊編碼的連續內存塊組成的順序型數據結構,
6.Redis的配置以及持久化方案有幾種?
以下兩種
RDB方式
AOF方式
什么是RDB方式?
是RDB是對內存中數據庫狀態進行快照RDB方式:將Redis在內存中的數據庫狀態保存到磁盤里面,RDB文件是一個經過壓縮的二進制文件,通過該文件可以還原生成RDB文件時的數據庫狀態(默認下,持久化到dump.rdb文件,并且在redis重啟后,自動讀取其中文件,據悉,通常情況下一千萬的字符串類型鍵,1GB的快照文件,同步到內存中的 時間是20-30秒)
RDB的生成方式:
1、執行命令手動生成有兩個Redis命令可以用于生成RDB文件,一個是SAVE,另一個是BGSAVE SAVE命令會阻塞Redis服務器進程,直到RDB文件創建完畢為止,在服務器進程阻塞期間,服務器不能處理任何命令請求,BGSAVE命令會派生出一個子進程,然后由子進程負責創建RDB文件,服務器進程(父進程)繼續處理命令請求,創建RDB文件結束之前,客戶端發送的BGSAVE和SAVE命令會被服務器拒絕
2、通過配置自動生成可以設置服務器配置的save選項,讓服務器每隔一段時間自動執行一次BGSAVE命令,可以通過save選項設置多個保存條件,但只要其中任意一個條件被滿足,服務器就會執行BGSAVE命令
7. 使用過Redis分布式鎖么,它是什么回事?
先拿setnx來爭搶鎖,搶到之后,再用expire給鎖加一個過期時間防止鎖忘記了釋放。
這時候對方會告訴你說你回答得不錯,然后接著問如果在setnx之后執行expire之前進程意外crash或者要重啟維護了,那會怎么樣?
這時候你要給予驚訝的反饋:唉,是喔,這個鎖就永遠得不到釋放了。緊接著你需要抓一抓自己的腦袋,故作思考片刻,好像接下來的結果是你主動思考出來的,然后回答:我記得set指令有非常復雜的參數,這個應該是可以同時把setnx和expire合成一條指令來用的!對方這時會顯露笑容,心里開始默念:嗯,這小子還不錯。
8. Redis里面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的,如何將它們全部找出來?
使用keys指令可以掃出指定模式的key列表。對方接著追問:如果這個redis正在給線上的業務提供服務,那使用keys指令會有什么問題?這個時候你要回答redis關鍵的一個特性:redis的單線程的。keys指令會導致線程阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。這個時候可以使用scan指令,scan指令可以無阻塞的提取出指定模式的key列表,但是會有一定的重復概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用keys指令長。
9.如果有大量的key需要設置同一時間過期,一般需要注意什么?
如果大量的key過期時間設置的過于集中,到過期的那個時間點,redis可能會出現短暫的卡頓現象。一般需要在時間上加一個隨機值,使得過期時間分散一些
10. Redis的同步機制了解么?
從同步。第一次同步時,主節點做一次bgsave,并同時將后續修改操作記錄到內存buffer,待完成后將rdb文件全量同步到復制節點,復制節點接受完成后將rdb鏡像加載到內存。加載完成后,再通知主節點將期間修改的操作記錄同步到復制節點進行重放就完成了同步過程。
11. 是否使用過Redis集群,集群的原理是什么?
Redis Sentinal著眼于高可用,在master宕機時會自動將slave提升為master,繼續提供服務。Redis Cluster著眼于擴展性,在單個redis內存不足時,使用Cluster進行分片存儲。
12. 如果有大量的key需要設置同一時間過期,一般需要注意什么?
如果大量的key過期時間設置的過于集中,到過期的那個時間點,redis可能會出現短暫的卡頓現象。一般需要在時間上加一個隨機值,使得過期時間分散一些。
Java基礎十道題:
1、面向對象的特征有哪些方面?
1.封裝:定義與自己相關的屬性和方法,隱藏實現的細節,只向外界提供最簡單的編程接口。
2.繼承:繼承是從已有類得到繼承信息創建新類的過程。繼承可以提高代碼的重用性,JAVA中只允許單一繼承。
3.多態性:不同子類型的對象對同一消息作出不同的響應。方法重載(overload)實現的是編譯時的多態性(也稱為靜態多態),而方法重寫(override)實現的是運行時的多態性(也稱為動態多態)。一般多態通過方法重寫來實現。
2、訪問修飾符public,private,protected,以及不寫(默認)時的區別?
修飾符 當前類 同 包 子 類 其他包
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
類的成員不寫訪問修飾時默認為default。默認對于同一個包中的其他類相當于公開(public),對于不是同一個包中的其他類相當于私有(private)。受保護(protected)對子類相當于公開,對不是同一包中的沒有父子關系的類相當于私有。Java中,外部類的修飾符只能是public或默認,類的成員(包括內部類)的修飾符可以是以上四種。
3、String 是最基本的數據類型嗎?
答:不是。Java中的基本數據類型只有8個:byte、short、int、long、float、double、char、boolean;除了基本類型(primitive type)和枚舉類型(enumeration type),剩下的都是引用類型(reference type)。
4、int和Integer有什么區別?
http://1.int是基本數據類型, Integer是int的包裝類,包裝類提供了很多操作方法,如各種類型直接轉換等
http://2.int默認值為0,integer的默認值為null
3.integer的取值范圍-128到127之間4.保存方式不同:Integer實際是對象的引用,當new一個Integer時,實際上是生成一個指針指向此對象;而int則是直接存儲數據值
5、&和&&的區別?
&運算符有兩種用法:
(1)按位與;
(2)邏輯與。
&&運算符是短路與運算。邏輯與跟短路與的差別是非常巨大的,雖然二者都要求運算符左右兩端的布爾值都是true整個表達式的值才是true。&&之所以稱為短路運算是因為,如果&&左邊的表達式的值是false,右邊的表達式會被直接短路掉,不會進行運算。
6、解釋內存中的棧(stack)、堆(heap)和靜態區(static area)的用法。
基本數據類型的變量,一個對象的引用,還有就是函數調用的現場保存都使用內存中的棧空間;
通過new關鍵字和構造器創建的對象放在堆空間;
直接書寫的100、"hello"和常量都是放在靜態區中。
棧空間操作起來最快但是棧很小,通常大量的對象都是放在堆空間,理論上整個內存沒有被其他進程使用的空間甚至硬盤上的虛擬內存都可以被當成堆空間來使用。
7.數組有沒有length()方法?String有沒有length()方法?
數組沒有length()方法,有length 的屬性。
String 有length()方法。JavaScript中,獲得字符串的長度是通過length屬性得到的,這一點容易和Java混淆。
8.在Java中,如何跳出當前的多重嵌套循環?
答:用break ;可以跳出多重循環。
直接結束所有的循環continue結束本次循環
9構造方法(constructor)是否可被重寫(override)?
答:構造器不能被繼承,因此不能被重寫,但可以被重載。
10.兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
答:不對,如果兩個對象x和y滿足x.equals(y) == true,它們的哈希碼(hash code)應當相同。Java對于eqauls方法和hashCode方法是這樣規定的:
(1)如果兩個對象相同(equals方法返回true),那么它們的hashCode值一定要相同;
(2)如果兩個對象的hashCode相同,它們并不一定相同。
MySQL十五道面試題:
1.數據庫三范式:
第一范式:對屬性的原子性約束,要求字段具有原子性,不可再分解;
第二范式:在滿足第一范式的前提下,非主鍵字段不能出現部分依賴主鍵;
解決:消除復合主鍵就可避免出現部分以來,可增加單列關鍵字。
第三范式:在滿足第二范式的前提下,非主鍵字段不能出現傳遞依賴,比如某個字段a依賴于主鍵,而一些字段依賴字段a,這就是傳遞依賴。
解決:將一個實體信息的數據放在一個表內實現。
2.事務四大特性
(1).原子性:不可分割的操作單元,事務中所有操作,要么全部成功;要么撤回到執行事務之前的狀態
(2).一致性:如果在執行事務之前數據庫是一致的,那么在執行事務之后數據庫也還是一致的;
(3).隔離性:事務操作之間彼此獨立和透明互不影響。事務獨立運行。這通常使用鎖來實現。一個事務處理后的結果,影響了其他事務,那么其他事務會撤回。事務的100%隔離,需要犧牲速度。(4).持久性:事務一旦提交,其結果就是永久的。即便發生系統故障,也能恢復
3.MySQL的事務隔離級別
(1).未提交讀(Read Uncommitted):允許臟讀,其他事務只要修改了數據,即使未提交,本事務也能看到修改后的數據值。也就是可能讀取到其他會話中未提交事務修改的數據
(2).提交讀(Read Committed):只能讀取到已經提交的數據。Oracle等多數數據庫默認都是該級別 (不重復讀)。
(3).可重復讀(Repeated Read):可重復讀。無論其他事務是否修改并提交了數據,在這個事務中看到的數據值始終不受其他事務影響。
(4).串行讀(Serializable):完全串行化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞MySQL數據庫(InnoDB引擎)默認使用可重復讀( Repeatable read)
4.MySQL數據庫的四類索引:
(1)index ---- 普通索引,數據可以重復,沒有任何限制。(即針對數據庫表創建索引)
(2)unique ---- 唯一索引,要求索引列的值必須唯一,但允許有空值;如果是組合索引,那么列值的組合必須唯一。
(3)primary key ---- 主鍵索引,是一種特殊的唯一索引,一個表只能有一個主鍵,不允許有空值,一般是在創建表的同時創建主鍵索引。
(4)組合索引 ---- 在多個字段上創建的索引,只有在查詢條件中使用了創建索引時的第一個字段,索引才會被使用。
(5)fulltext ---- 全文索引(基本不使用),是對于大表的文本域:char,varchar,text列才能創建全文索引,主要用于查找文本中的關鍵字,并不是直接與索引中的值進行比較。fulltext更像是一個搜索引擎,配合match against操作使用,而不是一般的where語句加like。
注:全文索引目前只有MyISAM存儲引擎支持全文索引,InnoDB引擎5.6以下版本還不支持全文索引
索引可以提高查詢的速度,但是創建和維護索引需要耗費時間,同時也會影響插入的速度,如果需要插入大量的數據時,最好是先刪除索引,插入數據后再建立索引。
索引生效條件
假設index(a,b,c)
最左前綴匹配:模糊查詢時,使用%匹配時:’a%‘會使用索引,’%a‘不會使用索引
條件中有or,索引不會生效
a and c,a生效,c不生效
b and c,都不生效
a and b > 5 and c,a和b生效,c不生效。
5.delete、drop、truncate區別truncate 和 delete只刪除數據,不刪除表結構 ,drop刪除表結構,并且釋放所占的空間。刪除數據的速度,drop> truncate > deletedelete屬于DML語言,需要事務管理,commit之后才能生效。drop和truncate屬于DDL語言,操作立刻生效,不可回滾。使用場合:當你不再需要該表時, 用 drop;當你仍要保留該表,但要刪除所有記錄時, 用 truncate;當你要刪除部分記錄時(always with a where clause), 用 delete.
6.sql語句分類:
DDL:數據定義語言(create drop)
DML:數據操作語句(insert update delete)
DQL:數據查詢語句(select )
DCL:數據控制語句,進行授權和權限回收(grant revoke)
TPL:數據事務語句(commit collback savapoint)
7.有哪些數據庫優化方面的經驗?定位:
查找、定位慢查詢在項目自驗項目轉測試之前,在啟動mysal數據庫時開啟慢查詢,并且把執行慢的語句寫到日志中,在運行一定時間后,通過查看日志找到慢查詢語句.使用explain慢查詢語句,來詳細分析語句的問題.
優化手段:
創建索引:創建合適的索引,我們就可以現在索引中查詢,查詢到以后直接找對應的記錄.分表:當一張表的數據比較多或者一張表的某些字段的值比較多并且很少使用時,采用水平分表和垂直分表來t化讀寫分高:當一臺服務器不能滿足需求時,采用讀寫分離的方式進行集群緩存:使用redis來進行緩存一些常用優化技巧
8.mysql中varchar與char的區別以及varchar(50)中的50代表的涵義?
(1).varchar與char的區別: char是一種固定長度的類型,varchar則是一種可變長度的類型.
(2).varchar(50)中50的含義 : 最多存放50個字節
(3).int(20)中20的含義: int(M)中的M indicates the maximum display width (最大顯示寬度)for integer types. The maximum legal display width is 255.
11.為什么要盡量設定一個主鍵?
主鍵是數據庫確保數據行在整張表唯一性的保障,即使業務上本張表沒有主鍵,也建議添加一個自增長的ID列作為主鍵.設定了主鍵之后,在后續的刪改查的時候可能更加快速以及確保操作數據范圍安全.
13.如果要存儲用戶的密碼散列,應該使用什么字段進行存儲?
密碼散列,鹽,用戶身份證號等固定長度的字符串應該使用char而不是varchar來存儲,這樣可以節省空間且提高檢索效率.個ID ;
(2).選擇正確的存儲引擎 ;
(3).使用可存下數據的最小的數據類型,整型 < date,time < char,varchar < blob;
(4).使用簡單的數據類型,整型比字符處理開銷更小,因為字符串的比較更復雜。如,int類型存儲時間類型,bigint類型轉ip函數;
(5).使用合理的字段屬性長度,固定長度的表會更快。使用enum、char而不是varchar;
(6).盡可能使用not null定義字段(給空字段設置默認值);
(7).盡量少用text;
(8).給頻繁使用和查詢的字段建立合適的索引;
最后:
為了不影響觀看只選取了其中的兩個部分,其余的可以私信我電子書來獲取。