1.jdk和jre有什麼區別?css
JRE: Java Runtime Environmenthtml
JDK:Java Development Kitjava
JRE顧名思義是java運行時環境,包含了java虛擬機,java基礎類庫。是使用java語言編寫的程序運行所須要的軟件環境,是提供給想運行java程序的用戶使用的。mysql
JDK顧名思義是java開發工具包,是程序員使用java語言編寫java程序所需的開發工具包,是提供給程序員使用的。JDK包含了JRE,同時還包含了編譯java源碼的編譯器javac,還包含了不少java程序調試和分析的工具:jconsole,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序。linux
若是你須要運行java程序,只需安裝JRE就能夠了。若是你須要編寫java程序,須要安裝JDK。程序員
JRE根據不一樣操做系統(如:windows,linux等)和不一樣JRE提供商(IBM,ORACLE等)有不少版本,最經常使用的是Oracle公司收購SUN公司的JRE版本。web
2. ==和equals的區別是什麼?ajax
== :比較正則表達式
. 基本數據類型比較的是值;redis
. 引用類型比較的是地址值。
equals(Object o):
1)不能比較基本數據類型,基本數據類型不是類類型;
2)a.比較引用類型時(該方法繼承自Object,在object中比較的是地址值)等同於」==」;
Object類中的方法,因此,在每個java類中,都會有這個方法,由於每個java類都是直接或者間接的Object類的子類,會繼承到這個方法。
2)b.若是本身所寫的類中已經重寫了equals方法,那麼就安裝用戶自定義的方式來比較倆個對象是否相等,若是沒有重寫過equal方法,那麼會調用父類(Object)中的equals方法進行比較,也就是比較地址值。
注:有的實現類中(JDK中),重寫了equals方法,這時候比較內容(java.lang.String)
在自定義類中,若是比較對象,本身能夠重寫equals方法定義比較規則。
注意:equals(Object o)方法只能是一個對象來調用,而後參數也是要傳一個對象的。
1)若是是基本數據類型那麼就用==比較
2)若是是引用類型的話,想按照本身的方式去比較,就要重寫這個類中的equals方法,
若是沒有重寫,那麼equals和==比較的效果是同樣的,都是比較引用的地址值。
3)若是是比較字符串,那麼直接用equals就能夠了,由於String類裏面已經重寫了equals方法,
比較的時候字符串的內容,而不是引用的地址值了。
※ toString(): Object類中的方法,因此,在每個java類中,都會有這個方法,由於每個java類都是直接或者間接的Object類的子類,會繼承到這個方法。
3.兩個對象的hashCode()相同,則equals()也必定爲true,對嗎?
equls返回爲true,則二者的hashcode必定相等,意即相等的對象必須具備相等的哈希碼。每當equals方法被覆寫,一般須要重寫hashCode方法從而
保持對象行爲的一致性。而具備相等的hashcode的兩個對象equals不必定成立。你能夠這樣認爲也行,hashcode是做爲一個對象存儲的參考,hash表自己是一種散列表,在數據存儲這塊,功效比較大,而equals是至關於兩對象之間的屬性(成員變量)「相等」,意即具備相同的行爲(方法)。或許這樣講起來理解比較的費勁。舉個例子,好比你定義class A有兩個屬性,int aA,aB,在定義一個class B也有兩個屬性,int bA,bB,而後覆寫hashcode方法,A類爲return aA*aB;B類爲return bA*bB.如今狀況已經很顯然了,各自實例化一個對象:a,b,假如:a.aA=b.bA,a.aB=b.bB,相等,或者a.aA=b.bB,a.aB=b.bA兩個對象a,b的hashcode必定相等,當時你能說兩個對象相等嗎?顯然不能吧,a與b都是不一樣類的實例。連equals最基本的obj instance of A或是obj instance of B都不成立。若是是同一個類的不一樣對象,當二者擁有相同hashcode的時候,則必定相等,或者equals成立的時候則hashcode必定爲真,這也就是所謂的相等的對象具備行爲一致性。
4.final在Java中有什麼做用?
(1).被final關鍵字修飾的類不能被繼承,被final關鍵字修飾的類屬性和類方法不能被覆蓋(重寫);
(2).對於被final關鍵字修飾的類屬性而言,子類就不能給他從新賦值了,若是從新賦值,會報錯:
(3). 與類屬性相似,父類方法若是用final關鍵字進行修飾,那麼不能被覆蓋,但要說明一點的是,不能被重寫是指不能同時和和父類方法同名,同參數,換句話講,只要子類中的方法與父類中的方法同名,同參數列表,即便返回值不一樣,仍然是屬於重寫的範疇:
5.java中Math.round(-1.5)等於多少?
Math.round(1.5)的返回值是2,Math.round(-1.5)的返回值是-1。四捨五入的原理是在參數上加0.5而後作向下取整。
6.String屬於基礎的數據類型嗎?
String不是基本的數據類型,是final修飾的java類,java中的基本類型一共有8個,它們分別爲:
1 字符類型:byte,char
2 基本整型:short,int,long
3 浮點型:float,double
4 布爾類型:boolean
7.java中操做字符串的都有哪些類?他們之間有什麼區別?
String、StringBuffer、StringBuilder
String : final修飾,String類的方法都是返回new String。即對String對象的任何改變都不影響到原對象,對字符串的修改操做都會生成新的對象。
StringBuffer : 對字符串的操做的方法都加了synchronized,保證線程安全。
StringBuilder : 不保證線程安全,在方法體內須要進行字符串的修改操做,能夠new StringBuilder對象,調用StringBuilder對象的append、replace、delete等方法修改字符串。
1)String是不可變類型的 每聲明一個字符就會建立一個對象 而後將指針指向新的對象
2)StringBuffer 和StringBuilder都是可變的。
3)String StringBuffer是線程安全的 多線程環境下推薦使用StringBuffer
4)StringBuilder是非線程安全的因此效率要高於StringBuffer因此通常單線程狀況下推薦使用StringBuilder
8.String str = 「i」和 String str = new String(「i」)同樣嗎?
答案 :不同 他們兩個在內存的分配上不同
String str = 「i」 java虛擬機會將其分配到常量池中
String str = new String(「i」) 則是將其分配到堆內存中
9.如何將字符串反轉?
StringBuilder 和 StringBuffer的reverse()方法.
http://www.javashuo.com/article/p-aedcblzh-bn.html
10.String類的經常使用方法都有哪些?
http://www.javashuo.com/article/p-ezdawwxs-bv.html
https://blog.csdn.net/qq_25406669/article/details/79021911
11.抽象類必需要有抽象方法嗎?
抽象類能夠沒有抽象方法,可是若是你的一個類已經聲明成了抽象類,即便這個類中沒有抽象方法,它也不能再實例化,即不能直接構造一個該類的對象。若是一個類中有了一個抽象方法,那麼這個類必須聲明爲抽象類,不然編譯通不過。
12.普通類和抽象類有哪些區別?
* 抽象類不能直接產生對象,抽象方法沒有方法體,因此不能被實例化。
* 抽象類必須有子類,必須被繼承,抽象類的子類不是抽象類,但必須所有覆寫抽象類方法
* 抽象類的實例化須要藉助子類來實現,採用向上轉型的方式處理。
* 抽象類的構造方法是先調用父類的,再調用子類的。
* 抽象方法不能使用final定義,由於抽象類必須有子類。
* 外部的抽象類不容許使用static申明,內部類能夠使用static修飾
* 抽象類的子類只能繼承一個父類
13.抽象類能使用final修飾嗎?
抽象類須要被繼承才能使用,而被final修飾的類沒法被繼承,因此abstract和final是不能共存的。
Java抽象類是內部類時,能夠被private修飾
Java抽象類不是內部類時,不能夠被private修飾
14.接口和抽象類有什麼區別?
一、抽象類和接口都不能直接實例化,若是要實例化,抽象類變量必須指向實現全部抽象方法的子類對象,接口變量必須指向實現全部接口方法的類對象。
二、抽象類要被子類繼承,接口要被類實現。
三、接口只能作方法申明,抽象類中能夠作方法申明,也能夠作方法實現
四、接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通量。
五、抽象類裏的抽象方法必須所有被子類所實現,若是子類不能所有實現父類抽象方法,那麼該子類只能是抽象類。一樣,一個實現接口的時候,如不能所有實現接口方法,那麼該類也只能爲抽象類。
六、抽象方法只能申明,不能實現,接口是設計的結果 ,抽象類是重構的結果
七、抽象類裏能夠沒有抽象方法
八、若是一個類裏有抽象方法,那麼這個類只能是抽象類
九、抽象方法要被實現,因此不能是靜態的,也不能是私有的。
十、接口可繼承接口,並可多繼承接口,但類只能單根繼承。
1.抽象類 和 接口 都是用來抽象具體對象的. 可是接口的抽象級別最高
2.抽象類能夠有具體的方法 和屬性, 接口只能有抽象方法和不可變常量
3.抽象類主要用來抽象類別,接口主要用來抽象功能.
四、抽象類中,且不包含任何實現,派生類必須覆蓋它們。接口中全部方法都必須是未實現的。
15.Java中的IO流分爲幾種?
按流向分(站在程序角度考慮)
輸入流(input)
輸出流(output)
按類型分:
l 字節流(InputStream/OutputStream)
u 任何文件均可以經過字節流進行傳輸。
l 字符流(Reader/Writer)
u 非純文本文件,不能用字符流,會致使文件格式破壞,不能正常執行。
l 節點流(低級流:直接跟輸入輸出源對接)
FileInputStream/FileOutputStream/FileReader/FileWriter/PrintStream/PrintWriter.
l 處理流(高級流:創建在低級流的基礎上)
u 轉換流:InputStreamReader/OutputStreamWriter,字節流轉字符流/字符流轉字節流
u 緩衝流:BufferedInputStream/BufferedOutputStream BufferedReader/BufferedReader可對節點流經行包裝,使讀寫更快
16.BIO,NIO,AIO有什麼區別?
ü Java BIO : 同步並阻塞,服務器實現模式爲一個鏈接一個線程,即客戶端有鏈接請求時服務器端就須要啓動一個線程進行處理,若是這個鏈接不作任何事情會形成沒必要要的線程開銷,固然能夠經過線程池機制改善。
ü Java NIO : 同步非阻塞,服務器實現模式爲一個請求一個線程,即客戶端發送的鏈接請求都會註冊到多路複用器上,多路複用器輪詢到鏈接有I/O請求時才啓動一個線程進行處理。
ü Java AIO(NIO.2) : 異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啓動線程進行處理.
l BIO方式適用於鏈接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4之前的惟一選擇,但程序直觀簡單易理解。
l NIO方式適用於鏈接數目多且鏈接比較短(輕操做)的架構,好比聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持。
l AIO方式使用於鏈接數目多且鏈接比較長(重操做)的架構,好比相冊服務器,充分調用OS參與併發操做,編程比較複雜,JDK7開始支持。
17.Files的經常使用方法有哪些?
建立:
createNewFile()在指定位置建立一個空文件,成功就返回true,若是已存在就不建立,而後返回false。
mkdir() 在指定位置建立一個單級文件夾。
mkdirs() 在指定位置建立一個多級文件夾。
renameTo(File dest)若是目標文件與源文件是在同一個路徑下,那麼renameTo的做用是重命名, 若是目標文件與源文件不是在同一個路徑下,那麼renameTo的做用就是剪切,並且還不能操做文件夾。
刪除:
delete() 刪除文件或者一個空文件夾,不能刪除非空文件夾,立刻刪除文件,返回一個布爾值。
deleteOnExit()jvm退出時刪除文件或者文件夾,用於刪除臨時文件,無返回值。
判斷:
exists() 文件或文件夾是否存在。
isFile() 是不是一個文件,若是不存在,則始終爲false。
isDirectory() 是不是一個目錄,若是不存在,則始終爲false。
isHidden() 是不是一個隱藏的文件或是不是隱藏的目錄。
isAbsolute() 測試此抽象路徑名是否爲絕對路徑名。
獲取:
getName() 獲取文件或文件夾的名稱,不包含上級路徑。
getAbsolutePath()獲取文件的絕對路徑,與文件是否存在不要緊
length() 獲取文件的大小(字節數),若是文件不存在則返回0L,若是是文件夾也返回0L。
getParent() 返回此抽象路徑名父目錄的路徑名字符串;若是此路徑名沒有指定父目錄,則返回null。
lastModified()獲取最後一次被修改的時間。
文件夾相關:
static File[] listRoots()列出全部的根目錄(Window中就是全部系統的盤符)
list() 返回目錄下的文件或者目錄名,包含隱藏文件。對於文件這樣操做會返回null。
listFiles() 返回目錄下的文件或者目錄對象(File類實例),包含隱藏文件。對於文件這樣操做會返回null。
list(FilenameFilter filter)返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操做會返回null。
listFiles(FilenameFilter filter)返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操做會返回null。
http://www.javashuo.com/article/p-kgiurvpu-ch.html
18.Java容器都有哪些?
http://www.javashuo.com/article/p-nihqhepn-bn.html
List:存放有序,列表存儲,元素可重複
Set:無序,元素不可重複
Map:無序,元素可重複
Set底層HashMap實現
HashMap底層用數組+鏈表實現
LinkedHashMap,TreeHashMap底層用額外的鏈表和樹進行維護
HashMap的線程安全包:ConcurrentHashMap
19.Collection和collections有什麼區別?
java.util.Collection 是一個集合接口(集合類的一個頂級接口)。它提供了對集合對象進行基本操做的通用接口方法。Collection接口在Java 類庫中有不少具體的實現。Collection接口的意義是爲各類具體的集合提供了最大化的統一操做方式,其直接繼承接口有List與Set。
Collections則是集合類的一個工具類/幫助類,其中提供了一系列靜態方法,用於對集合中元素進行排序、搜索以及線程安全等各類操做。
1) 排序(Sort)
List<Integer> list = new ArrayList<Integer>();
int array[] = {112, 111, 23, 456, 231 };
for (int i = 0; i < array.length; i++) {
list.add(array[i]);
}
Collections.sort(list);
for (int i = 0; i < array.length; i++) {
System.out.println(list.get(i));
}
2) 反轉(Reverse)
3) 替換因此的元素(Fill)
4) 拷貝(Copy)
用兩個參數,一個目標 List 和一個源 List, 將源的元素拷貝到目標,並覆蓋它的內容。目標 List 至少與源同樣長。若是它更長,則在目標 List 中的剩餘元素不受影響。
Collections.copy(list,li): 前面一個參數是目標列表 ,後一個是源列表。
6) 返回Collections中最小元素(min)
根據指定比較器產生的順序,返回給定 collection 的最小元素。collection 中的全部元素都必須是經過指定比較器可相互比
(7)Collections.min(list)
返回Collections中最大元素(max)
根據指定比較器產生的順序,返回給定 collection 的最大元素。collection 中的全部元素都必須是經過指定比較器可相互比較的。
Collections.max(list)
http://www.javashuo.com/article/p-nlqdavya-cv.html
20.List,Set,Map之間的區別是什麼?
聯繫:
Collection與Map屬於同等關係,但Map依賴與Collection。
Coolection接口的子類包含List(ArrayList、LinkedList等)、Set(HashSet、TreeSet等)
區別:
List及實現類是可變大小的列表,適用於按數組索引訪問元素。
Set接口繼承了Collection接口,可是它不容許集合中存在重複項。
Map中以鍵-值對形式存儲數據。
21.HashMap與HashTable有什麼區別?
HashMap和Hashtable都實現了Map接口,但決定用哪個以前先要弄清楚它們之間的分別。主要的區別有:線程安全性,同步(synchronization),以及速度。
l HashMap幾乎能夠等價於Hashtable,除了HashMap是非synchronized的,並能夠接受null(HashMap能夠接受爲null的鍵值(key)和值(value),而Hashtable則不行)。
l HashMap是非synchronized,而Hashtable是synchronized,這意味着Hashtable是線程安全的,多個線程能夠共享一個Hashtable;而若是沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
l 另外一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。因此當有其它線程改變了HashMap的結構(增長或者移除元素),將會拋出ConcurrentModificationException,但迭代器自己的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並非一個必定發生的行爲,要看JVM。這條一樣也是Enumeration和Iterator的區別。
l 因爲Hashtable是線程安全的也是synchronized,因此在單線程環境下它比HashMap要慢。若是你不須要同步,只須要單一線程,那麼使用HashMap性能要好過Hashtable。
l HashMap不能保證隨着時間的推移Map中的元素次序是不變的。
22.如何決定使用HashMap仍是TreeMap?
(1)HashMap:適用於在Map中插入、刪除和定位元素。
(2)Treemap:適用於按天然順序或自定義順序遍歷鍵(key)。
(3)HashMap一般比TreeMap快一點(樹和哈希表的數據結構使然),建議多使用HashMap,在須要排序的Map時候才用TreeMap.
(4)HashMap 非線程安全 TreeMap 非線程安全
(5)HashMap的結果是沒有排序的,而TreeMap輸出的結果是排好序的。
23.說一下HashMap的實現原理
HashMap是基於哈希表的Map接口的非同步實現。此實現提供全部可選的映射操做,並容許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恆久不變。
在java編程語言中,最基本的結構就是兩種,一個是數組,另一個是模擬指針(引用),全部的數據結構均可以用這兩個基本結構來構造的,HashMap也不例外。HashMap其實是一個「鏈表散列」的數據結構,即數組和鏈表的結合體。
HashMap的實現原理:
http://www.javashuo.com/article/p-bbqtkbbn-dg.html
24.hashSet實現原理
HashSet的實現原理:
往HashSet添加元素的時候,HashSet會先調用元素的hashCode方法獲得元素的哈希值 ,而後經過元素的哈希值通過移位等運算,就能夠算出該元素在哈希表中的存儲位置。
狀況1: 若是算出元素存儲的位置目前沒有任何元素存儲,那麼該元素能夠直接存儲到該位置上。
狀況2: 若是算出該元素的存儲位置目前已經存在有其餘的元素了,那麼會調用該元素的equals方法與該位置的元素再比較一次,若是equals返回的是true,那麼該元素與這個位置上的元素就視爲重複元素,不容許添加,若是equals方法返回的是false,那麼該元素運行添加。
25.ArrayList和Linkedlist的區別?
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。
3.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據。
26.如何實現數組和list之間的轉換?
List轉數組:toArray(arraylist.size()方法
數組轉List:Arrays的asList(a)方法
List<String> arrayList = new ArrayList<String>();
arrayList.add("s");
arrayList.add("e");
arrayList.add("n");
/**
* ArrayList轉數組
*/
int size=arrayList.size();
String[] a = arrayList.toArray(new String[size]);
//輸出第二個元素
System.out.println(a[1]);//結果:e
//輸出整個數組
System.out.println(Arrays.toString(a));//結果:[s, e, n]
/**
* 數組轉list
*/
List<String> list=Arrays.asList(a);
* list轉Arraylist
*/
List<String> arrayList2 = new ArrayList<String>();
arrayList2.addAll(list);
System.out.println(list);
27.在 Queue 中 poll()和 remove()有什麼區別?
1. queue的增長元素方法add和offer的區別在於,add方法在隊列滿的狀況下將選擇拋異常的方法來表示隊列已經滿了,而offer方法經過返回false表示隊列已經滿了;在有限隊列的狀況,使用offer方法優於add方法;
2. remove方法和poll方法都是刪除隊列的頭元素,remove方法在隊列爲空的狀況下將拋異常,而poll方法將返回null;
3. element和peek方法都是返回隊列的頭元素,可是不刪除頭元素,區別在與element方法在隊列爲空的狀況下,將拋異常,而peek方法將返回null.
Vector是同步的,而ArrayList不是。然而,若是你尋求在迭代的時候對列表進行改變,你應該使用CopyOnWriteArrayList。
ArrayList比Vector快,它由於有同步,不會過載。
ArrayList更加通用,由於咱們能夠使用Collections工具類輕易地獲取同步列表和只讀列表。
l Array能夠容納基本類型和對象,而ArrayList只能容納對象。
l Array是指定大小的,而ArrayList大小是固定的。
l Array沒有提供ArrayList那麼多功能,好比addAll、removeAll和iterator等
30. 哪些集合類是線程安全的?
vector:就比arraylist多了個同步化機制(線程安全),由於效率較低,如今已經不太建議使用。在web應用中,特別是前臺頁面,每每效率(頁面響應速度)是優先考慮的。
statck:堆棧類,先進後出
hashtable:就比hashmap多了個線程安全
enumeration:枚舉,至關於迭代器
除了這些以外,其餘的都是非線程安全的類和接口。
31. 迭代器 Iterator 是什麼?
迭代器是一種設計模式,它是一個對象,它能夠遍歷並選擇序列中的對象,而開發人員不須要了解該序列的底層結構。迭代器一般被稱爲「輕量級」對象,由於建立它的代價小。
Java中的Iterator功能比較簡單,而且只能單向移動:
(1) 使用方法iterator()要求容器返回一個Iterator。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
(2) 使用next()得到序列中的下一個元素。
(3) 使用hasNext()檢查序列中是否還有元素。
(4) 使用remove()將迭代器新返回的元素刪除。
Iterator是Java迭代器最簡單的實現,爲List設計的ListIterator具備更多的功能,它能夠從兩個方向遍歷List,也能夠從List中插入和刪除元素。
Iterator it = l.iterator();
String lll = "";
while (it.hasNext()) {
String kk = (String) it.next();
lll = lll + kk;
}
System.out.println(lll);
32. Iterator 怎麼使用?有什麼特色?
33. Iterator 和 ListIterator 有什麼區別?
都是迭代器,當須要對集合中元素進行遍歷不須要干涉其遍歷過程時,這兩種迭代器均可以使用。
1.使用範圍不一樣,Iterator能夠應用於全部的集合,Set、List和Map和這些集合的子類型。而ListIterator只能用於List及其子類型。
2.ListIterator有add方法,能夠向List中添加對象,而Iterator不能。
3.ListIterator和Iterator都有hasNext()和next()方法,能夠實現順序向後遍歷,可是ListIterator有hasPrevious()和previous()方法,能夠實現逆向(順序向前)遍歷。Iterator不能夠。
4.ListIterator能夠定位當前索引的位置,nextIndex()和previousIndex()能夠實現。Iterator沒有此功能。
5.均可實現刪除操做,可是ListIterator能夠實現對象的修改,set()方法能夠實現。Iterator僅能遍歷,不能修改。
34. 怎麼確保一個集合不能被修改?
Collections.unmodifiableList(List)
Collections.unmodifiableMap(Map)
Collections.unmodifiableSet(Set)
以上返回的集合對象都是不可修改的,調用修改方法會拋出異常UnsupportedOperationException
35. 並行和併發有什麼區別?
l 併發在單核和多核均可存在,就是同一時間有多個能夠執行的進程。可是在單核中同一時刻只有一個進程得到CPU,雖然宏觀上你認爲多個進程都在進行
l 並行是指同一時間多個進程在微觀上都在真正的執行,這就只有在多核的狀況下了
36. 線程和進程的區別?
l 線程:是程序執行流的最小單元,是系統獨立調度和分配CPU(獨立運行)的基本單位
l 進程:是資源分配的基本單位。一個進程包括多個線程
區別:地址空間、資源擁有
37.守護線程是什麼?
守護線程是個服務線程,服務於其餘線程
典型案例:垃圾回收線程
38.建立線程有哪幾種方式?
39.說一下 runnable 和 callable 有什麼區別?
runnable 沒有返回值,callable 能夠拿到有返回值,callable 能夠看做是 runnable 的補充。
二者都是接口;(廢話)
二者均可用來編寫多線程程序;
二者都須要調用Thread.start()啓動線程;
不一樣點:
注意點:
40.線程有哪些狀態?
建立、就緒、運行、阻塞、死亡
41.sleep() 和 wait() 有什麼區別?
42.notify()和 notifyAll()有什麼區別?
43.線程的 run()和 start()有什麼區別?
44.建立線程池有哪幾種方式?
線程池建立有七種方式,最核心的是最後一種:
45.線程池都有哪些狀態?
46.線程池中 submit()和 execute()方法有什麼區別?
Callable 類型的任務能夠獲取執行的返回值,而 Runnable 執行無返回值。
47.在 java 程序中怎麼保證多線程的運行安全?
手動鎖Java示例代碼以下:
Lock lock = new ReentrantLock();
lock.lock();
try {
System. out. println("得到鎖");
} catch (Exception e) {
// TODO: handle exception
} finally {
System. out. println("釋放鎖");
lock. unlock();
}
48.多線程鎖的升級原理是什麼?
synchronized 鎖升級原理:在鎖對象的對象頭裏面有一個 threadid 字段,在第一次訪問的時候 threadid 爲空,jvm 讓其持有偏向鎖,並將 threadid 設置爲其線程 id,再次進入的時候會先判斷 threadid 是否與其線程 id 一致,若是一致則能夠直接使用此對象,若是不一致,則升級偏向鎖爲輕量級鎖,經過自旋循環必定次數來獲取鎖,執行必定次數以後,若是尚未正常獲取到要使用的對象,此時就會把鎖從輕量級升級爲重量級鎖,此過程就構成了 synchronized 鎖的升級。
鎖的升級的目的:鎖升級是爲了減低了鎖帶來的性能消耗。在 Java 6 以後優化 synchronized 的實現方式,使用了偏向鎖升級爲輕量級鎖再升級到重量級鎖的方式,從而減低了鎖帶來的性能消耗。
49.什麼是死鎖?
當線程 A 持有獨佔鎖a,並嘗試去獲取獨佔鎖 b 的同時,線程 B 持有獨佔鎖 b,並嘗試獲取獨佔鎖 a 的狀況下,就會發生 AB 兩個線程因爲互相持有對方須要的鎖,而發生的阻塞現象,咱們稱爲死鎖。
50.怎麼防止死鎖?
51.ThreadLocal 是什麼?有哪些使用場景?
ThreadLocal用於保存某個線程共享變量。使用場景:解決數據庫鏈接,Session管理
52.說一下 synchronized 底層實現原理?
synchronized 是由一對 monitorenter/monitorexit 指令實現的,monitor 對象是同步的基本實現單元。在 Java 6 以前,monitor 的實現徹底是依靠操做系統內部的互斥鎖,由於須要進行用戶態到內核態的切換,因此同步操做是一個無差異的重量級操做,性能也很低。但在 Java 6 的時候,Java 虛擬機 對此進行了大刀闊斧地改進,提供了三種不一樣的 monitor 實現,也就是常說的三種不一樣的鎖:偏向鎖(Biased Locking)、輕量級鎖和重量級鎖,大大改進了其性能。
53.synchronized 和 volatile 的區別是什麼?
54.synchronized 和 Lock 有什麼區別?
55.synchronized 和 ReentrantLock 區別是什麼?
synchronized 早期的實現比較低效,對比 ReentrantLock,大多數場景性能都相差較大,可是在 Java 6 中對 synchronized 進行了很是多的改進。
主要區別以下:
56.說一下 atomic 的原理?
atomic 主要利用 CAS (Compare And Wwap) 和 volatile 和 native 方法來保證原子操做,從而避免 synchronized 的高開銷,執行效率大爲提高。
4、反射
57.什麼是反射?
能夠將一個程序(類)在運行的時候得到該程序(類)的信息的機制,也就是得到在編譯期不可能得到的類的信息,由於這些信息是保存在Class對象中的,而這個Class對象是在程序運行時動態加載的
58.什麼是 java 序列化?什麼狀況下須要序列化?
系列化就是把java對象轉換爲字節序列的方法。
59.動態代理是什麼?有哪些應用?
動態代理是運行時動態生成代理類。
u 原本應該本身作的事情,由於沒有某種緣由不能直接作,只能請別人代理作。被請的人就是代理
u 好比春節買票回家,因爲沒有時間,只能找票務中介來買,這就是代理模式
60.怎麼實現動態代理?
5、對象拷貝
61.爲何要使用克隆?
克隆的對象可能包含一些已經修改過的屬性,而 new 出來的對象的屬性都仍是初始化時候的值,因此當須要一個新的對象來保存當前對象的「狀態」就靠克隆方法了。
62.如何實現對象克隆?
63.深拷貝和淺拷貝區別是什麼?
64.jsp 和 servlet 有什麼區別?
l jsp經編譯後就成了Servlet(Jsp的本質就是Servlet,JVM只能識別Java類,不能識別Jsp代碼,Web容器將Jsp的代碼編譯成JVM可以識別的java類)
l jsp更擅長表現於頁面顯示,servlet更擅長於邏輯控制
l Servlet中沒有內置對象,Jsp中的內置對象都是必須經過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象獲得
65.jsp 有哪些內置對象?做用分別是什麼?
66.說一下 jsp 的 4 種做用域?
67.session 和 cookie 有什麼區別?
l 存儲位置不一樣:session 存儲在服務器端;cookie 存儲在瀏覽器端。
l 安全性不一樣:cookie 安全性通常,在瀏覽器存儲,能夠被僞造和修改。
l 容量和個數限制:cookie 有容量限制,每一個站點下的 cookie 也有個數限制。
l 存儲的多樣性:session 能夠存儲在 Redis 中、數據庫中、應用程序中;而 cookie 只能存儲在瀏覽器中
68.說一下 session 的工做原理?
session 的工做原理是客戶端登陸完成以後,服務器會建立對應的 session,session 建立完以後,會把 session 的 id 發送給客戶端,客戶端再存儲到瀏覽器中。這樣客戶端每次訪問服務器時,都會帶着 sessionid,服務器拿到 sessionid 以後,在內存找到與之對應的 session 這樣就能夠正常工做了
69.若是客戶端禁止 cookie 能實現 session 還能用嗎?
能夠用,session 只是依賴 cookie 存儲 sessionid,若是 cookie 被禁用了,能夠使用 url 中添加 sessionid 的方式保證 session 能正常使用
70.spring mvc 和 struts 的區別是什麼?
l 攔截級別:struts2 是類級別的攔截;spring mvc 是方法級別的攔截。
l 數據獨立性:spring mvc 的方法之間基本上獨立的,獨享 request 和 response 數據,請求數據經過參數獲取,處理結果經過 ModelMap 交回給框架,方法之間不共享變量;而 struts2 雖然方法之間也是獨立的,但其全部 action 變量是共享的,這不會影響程序運行,卻給咱們編碼和讀程序時帶來了必定的麻煩。
l 攔截機制:struts2 有以本身的 interceptor 機制,spring mvc 用的是獨立的 aop 方式,這樣致使struts2 的配置文件量比 spring mvc 大。
l 對 ajax 的支持:spring mvc 集成了ajax,全部 ajax 使用很方便,只須要一個註解 @ResponseBody 就能夠實現了;而 struts2 通常須要安裝插件或者本身寫代碼才行。
71.如何避免 sql 注入?
l 使用預處理 PreparedStatement。
l 使用正則表達式過濾掉字符中的特殊字符。
72.什麼是 XSS 攻擊,如何避免?
XSS 攻擊:即跨站腳本攻擊,它是 Web 程序中常見的漏洞。原理是攻擊者往 Web 頁面裏插入惡意的腳本代碼(css 代碼、Javascript 代碼等),當用戶瀏覽該頁面時,嵌入其中的腳本代碼會被執行,從而達到惡意攻擊用戶的目的,如盜取用戶 cookie、破壞頁面結構、重定向到其餘網站等。
預防 XSS 的核心是必須對輸入的數據作過濾處理。
73.什麼是 CSRF 攻擊,如何避免?
CSRF:Cross-Site Request Forgery(中文:跨站請求僞造),能夠理解爲攻擊者盜用了你的身份,以你的名義發送惡意請求,好比:以你名義發送郵件、發消息、購買商品,虛擬貨幣轉帳等。
防護手段:
74.throw 和 throws 的區別?
l throw則是指拋出的一個具體異常類型
l throws是用來聲明一個方法可能拋出的全部異常信息
75.final、finally、finalize 有什麼區別?
l final 是用來修飾類、方法、變量
l finally 只能用在 try catch 語法中,表示這段語句最終必定會被執行
76.try-catch-finally 中哪一個部分能夠省略?
try-catch-finally 其中 catch 和 finally 均可以被省略,可是不能同時省略,也就是說有 try 的時候,必須後面跟一個 catch 或者 finally
77.try-catch-finally 中,若是 catch 中 return 了,finally 還會執行嗎?
必定會, catch 中 return會等finally中的代碼執行完以後纔會執行
78.常見的異常類有哪些?
l NullPointerException 空指針異常
l ClassNotFoundException 指定類不存在
l NumberFormatException 字符串轉換爲數字異常
l IndexOutOfBoundsException 數組下標越界異常
l ClassCastException 數據類型轉換異常
l FileNotFoundException 文件未找到異常
l NoSuchMethodException 方法不存在異常
l IOException IO 異常
l SocketException Socket 異常
79.http 響應碼 301 和 302 表明的是什麼?有什麼區別?
l 301表示網頁永久性轉移到另外一個地址
l 302表示臨時性轉移
l 區別:
u 301是永久的重定向,搜索引擎在抓取新內容的同時也將舊的網址替換爲重定向以後的網址
u 302重定向是臨時的重定向,搜索引擎抓取新的內容而保留舊的網址
80.forward 和 redirect 的區別?
l forward 是服務器的內部重定向
l redirect 是服務器收到請求後發送一個狀態頭給客戶,客戶將在從新請求一次
81.簡述 tcp 和 udp的區別?
tcp 和 udp 是 OSI 模型中的運輸層中的協議。tcp 提供可靠的通訊傳輸,而 udp 則常被用於讓廣播和細節控制交給應用的通訊傳輸。
二者的區別大體以下:
82.tcp 爲何要三次握手,兩次不行嗎?爲何?
若是採用兩次握手,那麼只要服務器發出確認數據包就會創建鏈接,但因爲客戶端此時並未響應服務器端的請求,那此時服務器端就會一直在等待客戶端,這樣服務器端就白白浪費了必定的資源。若採用三次握手,服務器端沒有收到來自客戶端的再此確認,則就會知道客戶端並無要求創建請求,就不會浪費服務器的資源
83.說一下 tcp 粘包是怎麼產生的?
tcp 粘包可能發生在發送端或者接收端,分別來看兩端各類產生粘包的緣由:
l 發送端粘包:發送端須要等緩衝區滿才發送出去,形成粘包;
l 接收方粘包:接收方不及時接收緩衝區的包,形成多個包接收。
84.OSI 的七層模型都有哪些?
l 物理層:利用傳輸介質爲數據鏈路層提供物理鏈接,實現比特流的透明傳輸。
l 數據鏈路層:負責創建和管理節點間的鏈路。
l 網絡層:經過路由選擇算法,爲報文或分組經過通訊子網選擇最適當的路徑。
l 傳輸層:向用戶提供可靠的端到端的差錯和流量控制,保證報文的正確傳輸。
l 會話層:向兩個實體的表示層提供創建和使用鏈接的方法。
l 表示層:處理用戶信息的表示問題,如編碼、數據格式轉換和加密解密等。
l 應用層:直接向用戶提供服務,完成用戶但願在網絡上完成的各類工做。
85.get 和 post 請求有哪些區別?
l get請求的參數在URL中,而post 請求在請求body中
l get請求傳參有長度限制,post請求沒有長度限制
l get請求的參數只能是ASCII碼,post請求傳參沒有這個限制
86.如何實現跨域?
l 使用CORS技術
l 使用JSONP
87.說一下 JSONP 實現原理?
jsonp是一種輕量級的數據交換格式。
jsonp:JSON with Padding,它是利用script標籤的 src 鏈接能夠訪問不一樣源的特性,加載遠程返回的「JS 函數」來執行的。
9、設計模式
88.說一下你熟悉的設計模式?
l 單例模式:保證被建立一次,節省系統開銷。
l 工廠模式(簡單工廠、抽象工廠):解耦代碼。
l 觀察者模式:定義了對象之間的一對多的依賴,這樣一來,當一個對象改變時,它的全部的依賴者都會收到通知並自動更新。
l 外觀模式:提供一個統一的接口,用來訪問子系統中的一羣接口,外觀定義了一個高層的接口,讓子系統更容易使用。
l 模版方法模式:定義了一個算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類能夠在不改變算法結構的狀況下,從新定義算法的步驟。
l 狀態模式:容許對象在內部狀態改變時改變它的行爲,對象看起來好像修改了它的類。
89.簡單工廠和抽象工廠有什麼區別?
l 簡單工廠:用來生產同一等級結構中的任意產品,對於增長新的產品,無能爲力。
l 工廠方法:用來生產同一等級結構中的固定產品,支持增長任意產品。
l 抽象工廠:用來生產不一樣產品族的所有產品,對於增長新的產品,無能爲力;支持增長產品族
90.爲何要使用 spring?
spring是一個開源框架,是個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架
91.解釋一下什麼是 aop?
AOP即面向切面編程,是OOP編程的有效補充。使用AOP技術,能夠將一些系統性相關的編程工做,獨立提取出來,獨立實現,而後經過切面切入進系統。從而避免了在業務邏輯的代碼中混入不少的系統相關的邏輯——好比權限管理,事物管理,日誌記錄等等。
AOP分爲靜態AOP和動態AOP:
l 靜態AOP是指AspectJ實現的AOP,他是將切面代碼直接編譯到Java類文件中。
l 動態AOP是指將切面代碼進行動態織入實現的AOP,JDK動態代理。
92.解釋一下什麼是 ioc?
即「控制反轉」,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。
IoC很好的體現了面向對象設計法則之一—— 好萊塢法則:「別找咱們,咱們找你」;即由IoC容器幫對象找相應的依賴對象並注入,而不是由對象主動去找。
93.spring 有哪些主要模塊?
core模塊、aop模塊、data access模塊、web模塊、test模塊
l spring core:框架的最基礎部分,提供 ioc 和依賴注入特性。
l spring context:構建於 core 封裝包基礎上的 context 封裝包,提供了一種框架式的對象訪問方法。
l spring dao:Data Access Object 提供了JDBC的抽象層。
l spring aop:提供了面向切面的編程實現,讓你能夠自定義攔截器、切點等。
l spring Web:提供了針對 Web 開發的集成特性,例如文件上傳,利用 servlet listeners 進行 ioc 容器初始化和針對 Web 的 ApplicationContext。
l spring Web mvc:spring 中的 mvc 封裝包提供了 Web 應用的 Model-View-Controller(MVC)的實現。
94.spring 經常使用的注入方式有哪些?
詳細解析:http://www.javashuo.com/article/p-gdkynkay-kb.html
95.spring 中的 bean 是線程安全的嗎?
spring 中的 bean 默認是單例模式,spring 框架並無對單例 bean 進行多線程的封裝處理。
實際上大部分時候 spring bean 無狀態的(好比 dao 類),全部某種程度上來講 bean 也是安全的,但若是 bean 有狀態的話(好比 view model 對象),那就要開發者本身去保證線程安全了,最簡單的就是改變 bean 的做用域,把「singleton」變動爲「prototype」,這樣請求 bean 至關於 new Bean()了,因此就能夠保證線程安全了。
96.spring 支持幾種 bean 的做用域?
singleton、prototype、request、session、globalSession五中做用域。
l singleton:spring ioc 容器中只存在一個 bean 實例,bean 以單例模式存在,是系統默認值;
l prototype:每次從容器調用 bean 時都會建立一個新的示例,既每次 getBean()至關於執行 new Bean()操做;
l Web 環境下的做用域:
u request:每次 http 請求都會建立一個 bean;
u session:同一個 http session 共享一個 bean 實例;
u global-session:用於 portlet 容器,由於每一個 portlet 有單獨的 session,globalsession 提供一個全局性的 http session
97.spring 自動裝配 bean 有哪些方式?
可分爲四種:
l byName:按照bean的屬性名稱來匹配要裝配的bean
l byType:按照bean的類型來匹配要裝配的bean
l constructor:按照bean的構造器入參的類型來進行匹配
l autodetect(自動檢測):先使用constructor進行裝配,若是不成功就使用byType來裝配
98.spring 事務實現方式有哪些?
l 聲明式事務:聲明式事務也有兩種實現方式,基於 xml 配置文件的方式和註解方式(在類上添加 @Transaction 註解)。
l 編碼方式:提供編碼的形式管理和維護事務。
99.說一下 spring 的事務隔離?
spring 有五大隔離級別,默認值爲 ISOLATION_DEFAULT(使用數據庫的設置),其餘四個隔離級別和數據庫的隔離級別一致:
l ISOLATION_DEFAULT:用底層數據庫的設置隔離級別,數據庫設置的是什麼我就用什麼;
l ISOLATIONREADUNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其餘事務讀取(會出現幻讀、髒讀、不可重複讀);
l ISOLATIONREADCOMMITTED:提交讀,一個事務提交後才能被其餘事務讀取到(會形成幻讀、不可重複讀),SQL server 的默認級別;
l ISOLATIONREPEATABLEREAD:可重複讀,保證屢次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(會形成幻讀),MySQL 的默認級別;
l ISOLATION_SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止髒讀、不可重複讀、幻讀。
l 髒讀 :表示一個事務可以讀取另外一個事務中還未提交的數據。好比,某個事務嘗試插入記錄 A,此時該事務還未提交,而後另外一個事務嘗試讀取到了記錄 A。
l 不可重複讀 :是指在一個事務內,屢次讀同一數據。
l 幻讀 :指同一個事務內屢次查詢返回的結果集不同。好比同一個事務 A 第一次查詢時候有 n 條記錄,可是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺。發生幻讀的緣由也是另一個事務新增或者刪除或者修改了第一個事務結果集裏面的數據,同一個記錄的數據內容被修改了,全部數據行的記錄就變多或者變少了
100.說一下 spring mvc 運行流程?
l spring mvc 先將請求發送給 DispatcherServlet。
l DispatcherServlet 查詢一個或多個 HandlerMapping,找處處理請求的 Controller。
l DispatcherServlet 再把請求提交到對應的 Controller。
l Controller 進行業務邏輯處理後,會返回一個ModelAndView。
l Dispathcher 查詢一個或多個 ViewResolver 視圖解析器,找到 ModelAndView 對象指定的視圖對象。
l 視圖對象負責渲染返回給客戶端
101.spring mvc 有哪些組件?
l 前置控制器 DispatcherServlet
l 映射控制器 HandlerMapping
l 處理器 Controller
l 模型和視圖 ModelAndView
l 視圖解析器 ViewResolver
102.@RequestMapping 的做用是什麼?
將 http 請求映射到相應的類/方法上
103.@Autowired 的做用是什麼?
@Autowired 它能夠對類成員變量、方法及構造函數進行標註,完成自動裝配的工做,經過@Autowired 的使用來消除 set/get 方法
104.什麼是 spring boot?
Spring Boot是一個構建在Spring框架頂部的項目。它提供了一種更簡單、更快捷的方法來設置、配置和運行簡單和基於Web的應用程序。
105.爲何要用 spring boot?
l 配置簡單
l 獨立運行
l 自動裝配
l 無代碼生成和 xml 配置
l 提供應用監控
l 易上手
l 提高開發效率
106.spring boot 核心配置文件是什麼?
spring boot 核心的兩個配置文件:
l bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加載的,比 applicaton 優先加載,且 boostrap 裏面的屬性不能被覆蓋
l application (. yml 或者 . properties):用於 spring boot 項目的自動化配置
107.spring boot 配置文件有哪幾種類型?它們有什麼區別?
配置文件有 . properties 格式和 . yml 格式,它們主要的區別是書法風格不一樣。
. properties 配置以下:
spring. RabbitMQ. port=5672
. yml 配置以下:
spring:
RabbitMQ:
port: 5672
. yml 格式不支持 @PropertySource 註解導入
108.spring boot 有哪些方式能夠實現熱部署?
l 使用 devtools 啓動熱部署,添加 devtools 庫,在配置文件中把 spring. devtools. restart. enabled 設置爲 true
l 使用 Intellij Idea 編輯器,勾上自動編譯或手動從新編譯
109.jpa 和 hibernate 有什麼區別?
jpa 全稱 Java Persistence API,是 Java 持久化接口規範,hibernate 屬於 jpa 的具體實現。
110.什麼是 spring cloud?
spring cloud 是一系列框架的有序集合。它利用 spring boot 的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,均可以用 spring boot 的開發風格作到一鍵啓動和部署
111.spring cloud 斷路器的做用是什麼?
在分佈式架構中,斷路器模式的做用也是相似的,當某個服務單元發生故障(相似用電器發生短路)以後,經過斷路器的故障監控(相似熔斷保險絲),向調用方返回一個錯誤響應,而不是長時間的等待。這樣就不會使得線程因調用故障服務被長時間佔用不釋放,避免了故障在分佈式系統中的蔓延
112.spring cloud 的核心組件有哪些?
l Eureka:服務註冊於發現
l Feign:基於動態代理機制,根據註解和選擇的機器,拼接請求 url 地址,發起請求
l Ribbon:實現負載均衡,從一個服務的多臺機器中選擇一臺
l Hystrix:提供線程池,不一樣的服務走不一樣的線程池,實現了不一樣服務調用的隔離,避免了服務雪崩的問題
l Zuul:網關管理,由 Zuul 網關轉發請求給對應的服務
113.爲何要使用 hibernate?
114.什麼是 ORM 框架?
115.hibernate 中如何在控制檯查看打印的 sql 語句?
116.hibernate 有幾種查詢方式?
117.hibernate 實體類能夠被定義爲 final 嗎?
118.在 hibernate 中使用 Integer 和 int 作映射有什麼區別?
119.hibernate 是如何工做的?
120.get()和 load()的區別?
121.說一下 hibernate 的緩存機制?
122.hibernate 對象有哪些狀態?
123.在 hibernate 中 getCurrentSession 和 openSession 的區別是什麼?
124.hibernate 實體類必需要有無參構造函數嗎?爲何?
125.mybatis 中 #{}和 ${}的區別是什麼?
l #{} 獲取參數的內容支持 索引獲取,param1 獲取指定位置參數, 而且 SQL 使用?佔位符
l ${} 字符串拼接不使用?,默認找${內容}內容的 get/set 方法,如 果寫數字,就是一個數字
126.mybatis 有幾種分頁方式?(4種)
http://www.javashuo.com/article/p-ajixgtna-dk.html
127.RowBounds 是一次性查詢所有結果嗎?爲何?
oracle 數據庫,查詢增長RowBounds限制查詢條數,默認是0到1000條
128.mybatis 邏輯分頁和物理分頁的區別是什麼?
邏輯分頁:內存開銷比較大,在數據量比較小的狀況下效率比物理分頁高;在數據量很大的狀況下,內存開銷過大,容易內存溢出,不建議使用
物理分頁:內存開銷比較小,在數據量比較小的狀況下效率比邏輯分頁仍是低,在數據量很大的狀況下,建議使用物理分頁
129.mybatis 是否支持延遲加載?延遲加載的原理是什麼?
http://www.javashuo.com/article/p-qlkugbfa-ca.html
130.說一下 mybatis 的一級緩存和二級緩存?
一級緩存:
l 同一個 SqlSession 對象調用同一個<select>時,只有第一次訪問
l 數據庫,第一次以後把查詢結果緩存到 SqlSession 緩存區(內存)中
l 緩存的是 statement 對象.(簡單記憶必須是用一個<select>)
l 在 myabtis 時一個<select>對應一個 statement 對象
l 有效範圍必須是同一個 SqlSession 對象
二級緩存:
SqlSessionFactory 緩存
5.1 又叫:二級緩存
5.2 有效範圍:同一個 factory 內哪一個 SqlSession 均可以獲取
5.3 何時使用二級緩存:
5.3.1 當數據頻繁被使用,不多被修改
5.4 使用二級緩存步驟
5.4.1 在 mapper.xml 中添加
5.4.2 若是不寫 readOnly=」true」須要把實體類序列化
5.5 當 SqlSession 對象 close()時或 commit()時會把 SqlSession 緩存 的數據刷(flush)到 SqlSessionFactory 緩存區中
131.mybatis 和 hibernate 的區別有哪些?
http://www.javashuo.com/article/p-aolcpyvz-bv.html
2.1 開發方面
在項目開發過程中,就速度而言:
hibernate開發中,sql語句已經被封裝,直接能夠使用,加快系統開發;
Mybatis 屬於半自動化,sql須要手工完成,稍微繁瑣;
可是,凡事都不是絕對的,若是對於龐大複雜的系統項目來講,發雜語句較多,選擇hibernate 就不是一個好方案。
2.2 sql優化方面
Hibernate 自動生成sql,有些語句較爲繁瑣,會多消耗一些性能;
Mybatis 手動編寫sql,能夠避免不須要的查詢,提升系統性能;
2.3 對象管理比對
Hibernate 是完整的對象-關係映射的框架,開發工程中,無需過多關注底層實現,只要去管理對象便可;
Mybatis 須要自行管理 映射關係;
2.4 緩存方面
相同點: Hibernate和Mybatis的二級緩存除了採用系統默認的緩存機制外,均可以經過實現你本身的緩存或爲其餘第三方緩 存方案,建立適配器來徹底覆蓋緩存行爲。 不一樣點: Hibernate的二級緩存配置在SessionFactory生成的配置文件中進行詳細配置,而後再在具體的表-對象映射中配置是那種緩存。 MyBatis的二級緩存配置都是在每一個具體的表-對象映射中進行詳細配置,這樣針對不一樣的表能夠自定義不一樣的緩存機制。而且Mybatis能夠在命名空間中共享相同的緩存配置和實例,經過Cache-ref來實現。 |
比較:
Hibernate 具備良好的管理機制,用戶不須要關注SQL,若是二級緩存出現髒數據,系統會保存,;
Mybatis 在使用的時候要謹慎,避免緩存CAche 的使用。
Mybatis:小巧、方便、高效、簡單、直接、半自動化
Hibernate:強大、方便、高效、複雜、間接、全自動化
132.mybatis 有哪些執行器(Executor)?
SimpleExecutor:每執行一次update或select,就開啓一個Statement對象,用完馬上關閉Statement對象。
ReuseExecutor:執行update或select,以sql做爲key查找Statement對象,存在就使用,不存在就建立,用完後,不關閉Statement對象,而是放置於Map內,供下一次使用。簡言之,就是重複使用Statement對象。
BatchExecutor:執行update(沒有select,JDBC批處理不支持select),將全部sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每一個Statement對象都是addBatch()完畢後,等待逐一執行executeBatch()批處理。與JDBC批處理相同。
做用範圍:Executor的這些特色,都嚴格限制在SqlSession生命週期範圍內。
Mybatis中如何指定使用哪種Executor執行器?
答:在Mybatis配置文件中,能夠指定默認的ExecutorType執行器類型,也能夠手動給DefaultSqlSessionFactory的建立SqlSession的方法傳遞ExecutorType類型參數。
133.mybatis 分頁插件的實現原理是什麼?
https://www.jianshu.com/p/eed3f2e24b83
1. SQL 分頁
<select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper">
select * from student limit #{currIndex} , #{pageSize}
</select>
2. 使用攔截器分頁
建立攔截器,攔截mybatis接口方法id以ByPage結束的語句
String sql = (String) MetaObjectHandler.getValue("delegate.boundSql.sql");
//也能夠經過statementHandler直接獲取
//sql = statementHandler.getBoundSql().getSql();
//構建分頁功能的sql語句
String limitSql;
sql = sql.trim();
limitSql = sql + " limit " + (currPage - 1) * pageSize + "," + pageSize;
//將構建完成的分頁sql語句賦值個體'delegate.boundSql.sql',偷天換日 MetaObjectHandler.setValue("delegate.boundSql.sql", limitSql);
<configuration>
<plugins>
<plugin interceptor="com.autumn.interceptor.MyPageInterceptor">
<property name="limit" value="10"/>
<property name="dbType" value="mysql"/>
</plugin>
</plugins>
</configuration>
經過自定義插件的形式實現分頁,也是最好的,也叫作分頁攔截器。實現步驟以下:
插件支持MySQL和Oracle兩種數據庫,經過方法名關鍵字ListPage去匹配,有才進行分頁處理,而且不用在Mapping中寫分頁代碼。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="PageInfo" type="com.jsoft.testmybatis.util.PageInfo" />
</typeAliases>
<plugins>
<plugin interceptor="com.jsoft.testmybatis.util.PagePlugin">
<property name="dialect" value="mysql" />
<property name="pageSqlId" value=".*ListPage.*" />
</plugin>
</plugins>
</configuration>
3. RowBounds分頁
Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁,能夠在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也能夠使用分頁插件來完成物理分頁。
數據量小時,RowBounds不失爲一種好辦法。可是數據量大時,實現攔截器就頗有必要了。
mybatis接口加入RowBounds參數
(1)Dao:
public List queryUsersByPage(String userName, RowBounds rowBounds);
(2)Service:
@Override
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS)
publicList queryRolesByPage(String roleName,intstart,int limit) {
returnroleDao.queryRolesByPage(roleName,new RowBounds(start, limit));
}
分頁插件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,而後重寫sql,根據dialect方言,添加對應的物理分頁語句和物理分頁參數。
舉例:select * from student,攔截sql後重寫爲:select t.* from (select * from student)t limit 0,10
134.mybatis 如何編寫一個自定義插件?
http://www.javashuo.com/article/p-aubwqooz-cy.html
十4、RabbitMQ
135.rabbitmq 的使用場景有哪些?
136.rabbitmq 有哪些重要的角色?
137.rabbitmq 有哪些重要的組件?
138.rabbitmq 中 vhost 的做用是什麼?
139.rabbitmq 的消息是怎麼發送的?
140.rabbitmq 怎麼保證消息的穩定性?
141.rabbitmq 怎麼避免消息丟失?
142.要保證消息持久化成功的條件有哪些?
143.rabbitmq 持久化有什麼缺點?
144.rabbitmq 有幾種廣播類型?
145.rabbitmq 怎麼實現延遲消息隊列?
146.rabbitmq 集羣有什麼用?
147.rabbitmq 節點的類型有哪些?
148.rabbitmq 集羣搭建須要注意哪些問題?
149.rabbitmq 每一個節點是其餘節點的完整拷貝嗎?爲何?
150.rabbitmq 集羣中惟一一個磁盤節點崩潰了會發生什麼狀況?
151.rabbitmq 對集羣節點中止順序有要求嗎?
十5、Kafka
152.kafka 能夠脫離 zookeeper 單獨使用嗎?爲何?
kafka使用ZooKeeper用於管理、協調代理。每一個Kafka代理經過Zookeeper協調其餘Kafka代理。
當Kafka系統中新增了代理或某個代理失效時,Zookeeper服務將通知生產者和消費者。生產者與消費者據此開始與其餘代理協調工做。
Zookeeper在Kakfa中扮演的角色:Kafka將元數據信息保存在Zookeeper中,可是發送給Topic自己的數據是不會發到Zk上的
kafka使用zookeeper來實現動態的集羣擴展,不須要更改客戶端(producer和consumer)的配置。broker會在zookeeper註冊並保持相關的元數據(topic,partition信息等)更新。
n 而客戶端會在zookeeper上註冊相關的watcher。一旦zookeeper發生變化,客戶端能及時感知並做出相應調整。這樣就保證了添加或去除broker時,各broker間仍能自動實現負載均衡。這裏的客戶端指的是Kafka的消息生產端(Producer)和消息消費端(Consumer)
n Broker端使用zookeeper來註冊broker信息,以及監測partitionleader存活性.
n Consumer端使用zookeeper用來註冊consumer信息,其中包括consumer消費的partition列表等,同時也用來發現broker列表,並和partitionleader創建socket鏈接,並獲取消息.
n Zookeer和Producer沒有創建關係,只和Brokers、Consumers創建關係以實現負載均衡,即同一個ConsumerGroup中的Consumers能夠實現負載均衡(由於Producer是瞬態的,能夠發送後關閉,無需直接等待)
153.kafka 有幾種數據保留的策略?
154.kafka 同時設置了 7 天和 10G 清除數據,到第五天的時候消息達到了 10G,這個時候 kafka 將如何處理?
155.什麼狀況會致使 kafka 運行變慢?
156.使用 kafka 集羣須要注意什麼?
十6、Zookeeper
157.zookeeper 是什麼?
ZooKeeper由雅虎研究院開發,是Google Chubby的開源實現,後來託管到Apache,於2010年11月正式成爲Apache的頂級項目。
ZooKeeper是一個經典的分佈式數據一致性解決方案,致力於爲分佈式應用提供一個高性能、高可用,且具備嚴格順序訪問控制能力的分佈式協調服務。
分佈式應用程序能夠基於ZooKeeper實現數據發佈與訂閱、負載均衡、命名服務、分佈式協調與通知、集羣管理、Leader選舉、分佈式鎖、分佈式隊列等功能。
https://blog.csdn.net/lipinganq/article/details/81029499
158.zookeeper 都有哪些功能?
159.zookeeper 有幾種部署模式?
160.zookeeper 怎麼保證主從節點的狀態同步?
161.集羣中爲何要有主節點?
162.集羣中有 3 臺服務器,其中一個節點宕機,這個時候 zookeeper 還能夠使用嗎?
163.說一下 zookeeper 的通知機制?
164.數據庫的三範式是什麼?
l 第一範式:強調的是列的原子性,即數據庫表的每一列都是不可分割的原子數據項。
l 第二範式:要求實體的屬性徹底依賴於主關鍵字。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性。
l 第三範式:任何非主屬性不依賴於其它非主屬性。
165.一張自增表裏面總共有 7 條數據,刪除了最後 2 條數據,重啓 mysql 數據庫,又插入了一條數據,此時 id 是幾?
l 表類型若是是 MyISAM ,那 id 就是 8。
l 表類型若是是 InnoDB,那 id 就是 6。
166.如何獲取當前數據庫版本?
使用 select version() 獲取當前 MySQL 數據庫版本。
select version()
167.說一下 ACID 是什麼?
l Atomicity(原子性):一個事務(transaction)中的全部操做,或者所有完成,或者所有不完成,不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被恢復(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。即,事務不可分割、不可約簡。
l Consistency(一致性):在事務開始以前和事務結束之後,數據庫的完整性沒有被破壞。這表示寫入的資料必須徹底符合全部的預設約束、觸發器、級聯回滾等。
l Isolation(隔離性):數據庫容許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性能夠防止多個事務併發執行時因爲交叉執行而致使數據的不一致。事務隔離分爲不一樣級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
l Durability(持久性):事務處理結束後,對數據的修改就是永久的,即使系統故障也不會丟失。
168.char 和 varchar 的區別是什麼?
u char(n) :固定長度類型,好比訂閱 char(10),當你輸入"abc"三個字符的時候,它們佔的空間仍是 10 個字節,其餘 7 個是空字節。
u chat 優勢:效率高;缺點:佔用空間;適用場景:存儲密碼的 md5 值,固定長度的,使用 char 很是合適。
u varchar(n) :可變長度,存儲的值是每一個值佔用的字節再加上一個用來記錄其長度的字節的長度。
u 因此,從空間上考慮 varcahr 比較合適;從效率上考慮 char 比較合適,兩者使用須要權衡
169.float 和 double 的區別是什麼?
u float 最多能夠存儲 8 位的十進制數,並在內存中佔 4 字節。
u double 最可能夠存儲 16 位的十進制數,並在內存中佔 8 字節。
170.mysql 的內鏈接、左鏈接、右鏈接有什麼區別?
內鏈接關鍵字:inner join;左鏈接:left join;右鏈接:right join。 內鏈接是把匹配的關聯數據顯示出來;左鏈接是左邊的表所有顯示出來,右邊的表顯示出符合條件的數據;右鏈接正好相反
171.mysql 索引是怎麼實現的?
索引是知足某種特定查找算法的數據結構,而這些數據結構會以某種方式指向數據,從而實現高效查找數據。 具體來講 MySQL 中的索引,不一樣的數據引擎實現有所不一樣,但目前主流的數據庫引擎的索引都是 B+ 樹實現的,B+ 樹的搜索效率,能夠到達二分法的性能,找到數據區域以後就找到了完整的數據結構了,全部索引的性能也是更好的
172.怎麼驗證 mysql 的索引是否知足需求?
使用 explain 查看 SQL 是如何執行查詢語句的,從而分析你的索引是否知足需求。
explain 語法:
explain select * from table where type=1
173.說一下數據庫的事務隔離?
MySQL 的事務隔離是在 MySQL. ini 配置文件裏添加的,在文件的最後添加:
transaction-isolation = REPEATABLE-READ
可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。
u READ-UNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其餘事務讀取(會出現幻讀、髒讀、不可重複讀)。
u READ-COMMITTED:提交讀,一個事務提交後才能被其餘事務讀取到(會形成幻讀、不可重複讀)。
u REPEATABLE-READ:可重複讀,默認級別,保證屢次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(會形成幻讀)。
u SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止髒讀、不可重複讀、幻讀。
髒讀 :表示一個事務可以讀取另外一個事務中還未提交的數據。好比,某個事務嘗試插入記錄 A,此時該事務還未提交,而後另外一個事務嘗試讀取到了記錄 A。
不可重複讀 :是指在一個事務內,屢次讀同一數據。
幻讀 :指同一個事務內屢次查詢返回的結果集不同。好比同一個事務 A 第一次查詢時候有 n 條記錄,可是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺。發生幻讀的緣由也是另一個事務新增或者刪除或者修改了第一個事務結果集裏面的數據,同一個記錄的數據內容被修改了,全部數據行的記錄就變多或者變少了
174.說一下 mysql 經常使用的引擎?
l InnoDB 引擎:InnoDB 引擎提供了對數據庫 acid 事務的支持,而且還提供了行級鎖和外鍵的約束,它的設計的目標就是處理大數據容量的數據庫系統。MySQL 運行的時候,InnoDB 會在內存中創建緩衝池,用於緩衝數據和索引。可是該引擎是不支持全文搜索,同時啓動也比較的慢,它是不會保存表的行數的,因此當進行 select count(*) from table 指令的時候,須要進行掃描全表。因爲鎖的粒度小,寫操做是不會鎖定全表的,因此在併發度較高的場景下使用會提高效率
l MyIASM 引擎:MySQL 的默認引擎,但不提供事務的支持,也不支持行級鎖和外鍵。所以當執行插入和更新語句時,即執行寫操做的時候須要鎖定這個表,因此會致使效率會下降。不過和 InnoDB 不一樣的是,MyIASM 引擎是保存了表的行數,因而當進行 select count(*) from table 語句時,能夠直接的讀取已經保存的值而不須要進行掃描全表。因此,若是表的讀操做遠遠多於寫操做時,而且不須要事務的支持的,能夠將 MyIASM 做爲數據庫引擎的首選
175.說一下 mysql 的行鎖和表鎖?
MyISAM 只支持表鎖,InnoDB 支持表鎖和行鎖,默認爲行鎖
表級鎖:開銷小,加鎖快,不會出現死鎖。鎖定粒度大,發生鎖衝突的機率最高,併發量最低
行級鎖:開銷大,加鎖慢,會出現死鎖。鎖力度小,發生鎖衝突的機率小,併發度最高
176.說一下樂觀鎖和悲觀鎖?
l 樂觀鎖:每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在提交更新的時候會判斷一下在此期間別人有沒有去更新這個數據
l 悲觀鎖:每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻止,直到這個鎖被釋放
u 數據庫的樂觀鎖須要本身實現,在表裏面添加一個 version 字段,每次修改爲功值加 1,這樣每次修改的時候先對比一下,本身擁有的 version 和數據庫如今的 version 是否一致,若是不一致就不修改,這樣就實現了樂觀鎖
177.mysql 問題排查都有哪些手段?
178.如何作 mysql 的性能優化?
179.redis 是什麼?都有哪些使用場景?
Redis是一個開源的 key—value型 單線程 數據庫,支持string、list、set、zset和hash類型數據。
默認端口:6379
默認數據庫數量:16
2、優勢:
1.nosql數據庫沒有關聯關係,數據結構簡單,拓展表比較容易
2.nosql讀取速度快,對較大數據處理快
3、適用場景:
1.數據高併發的讀寫
2.海量數據的讀寫
對擴展性要求高的數據
4、不適場景:
1.須要事務支持(非關係型數據庫)
2.基於sql結構化查詢儲存,關係複雜
5、應用場景
1.取最新N個數據的操做
好比典型的取你網站的最新文章,經過下面方式,咱們能夠將最新的5000條評論的ID放在Redis的List集合中,並將超出集合部分從數據庫獲取
2.排行榜應用,取TOP N操做
這個需求與上面需求的不一樣之處在於,前面操做以時間爲權重,這個是以某個條件爲權重,好比按頂的次數排序,這時候就須要咱們的sorted set出馬了,將你要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只須要執行一條ZADD命令便可。
3.須要精準設定過時時間的應用
好比你能夠把上面說到的sorted set的score值設置成過時時間的時間戳,那麼就能夠簡單地經過過時時間排序,定時清除過時數據了,不只是清除Redis中的過時數據,你徹底能夠把Redis裏這個過時時間當成是對數據庫中數據的索引,用Redis來找出哪些數據須要過時刪除,而後再精準地從數據庫中刪除相應的記錄。
4.計數器應用
Redis的命令都是原子性的,你能夠輕鬆地利用INCR,DECR命令來構建計數器系統。
5.Uniq操做,獲取某段時間全部數據排重值
這個使用Redis的set數據結構最合適了,只須要不斷地將數據往set中扔就好了,set意爲集合,因此會自動排重。
6.實時系統,反垃圾系統
經過上面說到的set功能,你能夠知道一個終端用戶是否進行了某個操做,能夠找到其操做的集合並進行分析統計對比等。沒有作不到,只有想不到。
7.Pub/Sub構建實時消息系統
Redis的Pub/Sub系統能夠構建實時的消息系統,好比不少用Pub/Sub構建的實時聊天系統的例子。
8.構建隊列系統
使用list能夠構建隊列系統,使用sorted set甚至能夠構建有優先級的隊列系統。
180.redis 有哪些功能?
https://blog.csdn.net/u010963948/article/details/79589710
181.redis 和 memecache 有什麼區別?
1)、存儲方式 Memecache把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小。 Redis有部份存在硬盤上,這樣能保證數據的持久性。
2)、數據支持類型 Memcache對數據類型支持相對簡單。 Redis有複雜的數據類型。
3)、使用底層模型不一樣 它們之間底層實現方式 以及與客戶端之間通訊的應用協議不同。 Redis直接本身構建了VM 機制 ,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。
182.redis 爲何是單線程的?
redis 核心就是 若是個人數據全都在內存裏,我單線程的去操做 就是效率最高的,爲何呢,由於多線程的本質就是 CPU 模擬出來多個線程的狀況,這種模擬出來的狀況就有一個代價,就是上下文的切換,對於一個內存的系統來講,它沒有上下文的切換就是效率最高的。redis 用 單個CPU 綁定一塊內存的數據,而後針對這塊內存的數據進行屢次讀寫的時候,都是在一個CPU上完成的,因此它是單線程處理這個事。在內存的狀況下,這個方案就是最佳方案 .
183.什麼是緩存穿透?怎麼解決?
https://www.jianshu.com/p/400dd82389b4?from=groupmessage
184.redis 支持的數據類型有哪些?
Redis支持五種數據類型:
string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。
185.redis 支持的 java 客戶端都有哪些?
Redisson,Jedis,lettuce等等,官方推薦使用Redisson。
186.jedis 和 redisson 有哪些區別?
Jedis 和 Redisson 都是Java中對Redis操做的封裝。Jedis 只是簡單的封裝了 Redis 的API庫,能夠看做是Redis客戶端,它的方法和Redis 的命令很相似。Redisson 不只封裝了 redis ,還封裝了對更多數據結構的支持,以及鎖等功能,相比於Jedis 更加大。但Jedis相比於Redisson 更原生一些,更靈活。
Redis官方對Java 語言的封裝框架推薦的有十多種(Redis 官網),主要是Jedis 、Redisson。
187.怎麼保證緩存和數據庫數據的一致性?
https://blog.csdn.net/qq_28740207/article/details/80877079
188.redis 持久化有幾種方式?
http://www.javashuo.com/article/p-rxipfaem-cp.html
189.redis 怎麼實現分佈式鎖?
http://www.javashuo.com/article/p-bzdaslnp-eh.html
190.redis 分佈式鎖有什麼缺陷?
https://www.jianshu.com/p/6fba984cd9bd
191.redis 如何作內存優化?
http://www.javashuo.com/article/p-zlxkszfb-ca.html
192.redis 淘汰策略有哪些?
用於解決什麼問題呢?舉個例子
1)咱們都知道技術都是衍生於問題的。那咱們就來講說用來作什麼吧。
你們能夠想一想,當咱們的物理服務內存只有8G,可是數據卻有100G,如何慢慢的放在redis中呢?再加上公司近期資金不夠,不能擴展機器怎麼辦?
2)解決上述的問題,咱們就要引出一個redis的策略,便是標題。
淘汰策略
1)voltile-lru:從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
2)volatile-ttl:從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰
3)volatile-random:從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰
4)allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
5)allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
6)no-enviction(驅逐):禁止驅逐數據
解析
使用淘汰策略是能夠把上面的問題暫時頂過去,可是會出現一系列的問題。
1.內存是騰出來了,可是這樣緩存在其中的數據卻出去了,萬一我須要再次調用緩存中的數據又怎麼解決?
2.前段時間沒有訪問的,如今火起來了,個人緩存中沒有,一下壓力進入DB怎麼辦?
3.使用上面的解決方式,會暴露出問題也是沒辦法的,畢竟魚和熊掌不可兼得。咱們得先解決當下的問題不是。上面會總結出一個詞語緩存命中率
什麼事緩存命中率?
1)命中率就是緩存裏能夠查詢到的記錄數除以數據庫裏的總記錄數。命中率越低性能越高,反之越差。(大白話就是直接去數據庫查詢而不走緩存,這樣就增大了數據庫的壓力,查詢到數據庫中的值之後再存入緩存中。)
命中率低下的緣由也有不少,例如:
1.內存不足,淘汰掉了;
2.緩存服務器宕機;
193.redis 常見的性能問題有哪些?該如何解決?
https://blog.csdn.net/u011516796/article/details/50762573
194.說一下 jvm 的主要組成部分?及其做用?
組件的做用: 首先經過類加載器(ClassLoader)會把 Java 代碼轉換成字節碼,運行時數據區(Runtime Data Area)再把字節碼加載到內存中,而字節碼文件只是 JVM 的一套指令集規範,並不能直接交個底層操做系統去執行,所以須要特定的命令解析器執行引擎(Execution Engine),將字節碼翻譯成底層系統指令,再交由 CPU 去執行,而這個過程當中須要調用其餘語言的本地庫接口(Native Interface)來實現整個程序的功能
195.說一下 jvm 運行時數據區?
不一樣虛擬機的運行時數據區可能略微有所不一樣,但都會聽從 Java 虛擬機規範, Java 虛擬機規範規定的區域分爲如下 5 個部分:
l 程序計數器(Program Counter Register):當前線程所執行的字節碼的行號指示器,字節碼解析器的工做是經過改變這個計數器的值,來選取下一條須要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能,都須要依賴這個計數器來完成
l Java 虛擬機棧(Java Virtual Machine Stacks):用於存儲局部變量表、操做數棧、動態連接、方法出口等信息
l 本地方法棧(Native Method Stack):與虛擬機棧的做用是同樣的,只不過虛擬機棧是服務 Java 方法的,而本地方法棧是爲虛擬機調用 Native 方法服務的
l Java 堆(Java Heap):Java 虛擬機中內存最大的一塊,是被全部線程共享的,幾乎全部的對象實例都在這裏分配內存
l 方法區(Methed Area):用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯後的代碼等數據
196.說一下堆棧的區別?
197.隊列和棧是什麼?有什麼區別?
198.什麼是雙親委派模型?
在介紹雙親委派模型以前先說下類加載器。對於任意一個類,都須要由加載它的類加載器和這個類自己一同確立在 JVM 中的惟一性,每個類加載器,都有一個獨立的類名稱空間。類加載器就是根據指定全限定名稱將 class 文件加載到 JVM 內存,而後再轉化爲 class 對象。
類加載器分類:
l 啓動類加載器(Bootstrap ClassLoader),是虛擬機自身的一部分,用來加載Java_HOME/lib/目錄中的,或者被 -Xbootclasspath 參數所指定的路徑中而且被虛擬機識別的類庫
l 其餘類加載器:
l 擴展類加載器(Extension ClassLoader):負責加載\lib\ext目錄或Java. ext. dirs系統變量指定的路徑中的全部類庫
l 應用程序類加載器(Application ClassLoader)。負責加載用戶類路徑(classpath)上的指定類庫,咱們能夠直接使用這個類加載器。通常狀況,若是咱們沒有自定義類加載器默認就是用這個加載器
雙親委派模型:若是一個類加載器收到了類加載的請求,它首先不會本身去加載這個類,而是把這個請求委派給父類加載器去完成,每一層的類加載器都是如此,這樣全部的加載請求都會被傳送到頂層的啓動類加載器中,只有當父加載沒法完成加載請求(它的搜索範圍中沒找到所需的類)時,子加載器纔會嘗試去加載類
199.說一下類加載的執行過程?
類裝載分爲如下 5 個步驟:
200.怎麼判斷對象是否能夠被回收?
通常有兩種方法來判斷:
l 引用計數器:爲每一個對象建立一個引用計數,有對象引用時計數器 +1,引用被釋放時計數 -1,當計數器爲 0 時就能夠被回收。它有一個缺點不能解決循環引用的問題
l 可達性分析:從 GC Roots 開始向下搜索,搜索所走過的路徑稱爲引用鏈。當一個對象到 GC Roots 沒有任何引用鏈相連時,則證實此對象是能夠被回收的
201.java 中都有哪些引用類型?
202.說一下 jvm 有哪些垃圾回收算法?
l 標記-清除算法:標記無用對象,而後進行清除回收。缺點:效率不高,沒法清除垃圾碎片
l 標記-整理算法:標記無用對象,讓全部存活的對象都向一端移動,而後直接清除掉端邊界之外的內存
l 複製算法:按照容量劃分二個大小相等的內存區域,當一塊用完的時候將活着的對象複製到另外一塊上,而後再把已使用的內存空間一次清理掉。缺點:內存使用率不高,只有原來的一半
l 分代算法:根據對象存活週期的不一樣將內存劃分爲幾塊,通常是新生代和老年代,新生代基本採用複製算法,老年代採用標記整理算法
203.說一下 jvm 有哪些垃圾回收器?
l Serial:最先的單線程串行垃圾回收器
l Serial Old:Serial 垃圾回收器的老年版本,一樣也是單線程的,能夠做爲 CMS 垃圾回收器的備選預案
l ParNew:是 Serial 的多線程版本
l Parallel 和 ParNew 收集器相似是多線程的,但 Parallel 是吞吐量優先的收集器,能夠犧牲等待時間換取系統的吞吐量
l Parallel Old 是 Parallel 老生代版本,Parallel 使用的是複製的內存回收算法,Parallel Old 使用的是標記-整理的內存回收算法
l CMS:一種以得到最短停頓時間爲目標的收集器,很是適用 B/S 系統
l G1:一種兼顧吞吐量和停頓時間的 GC 實現,是 JDK 9 之後的默認 GC 選項
204.詳細介紹一下 CMS 垃圾回收器?
l CMS 是英文 Concurrent Mark-Sweep 的簡稱,是以犧牲吞吐量爲代價來得到最短回收停頓時間的垃圾回收器。對於要求服務器響應速度的應用上,這種垃圾回收器很是適合。在啓動 JVM 的參數加上「-XX:+UseConcMarkSweepGC」來指定使用 CMS 垃圾回收器
l CMS 使用的是標記-清除的算法實現的,因此在 gc 的時候回產生大量的內存碎片,當剩餘內存不能知足程序運行要求時,系統將會出現 Concurrent Mode Failure,臨時 CMS 會採用 Serial Old 回收器進行垃圾清除,此時的性能將會被下降
205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什麼區別?
新生代垃圾回收器通常採用的是複製算法,複製算法的優勢是效率高,缺點是內存利用率低;老年代回收器通常採用的是標記-整理的算法進行垃圾回收
206.簡述分代垃圾回收器是怎麼工做的?
分代回收器有兩個分區:老生代和新生代,新生代默認的空間佔比總空間的 1/3,老生代的默認佔比是 2/3
新生代使用的是複製算法,新生代裏有 3 個分區:Eden、To Survivor、From Survivor,它們的默認佔比是 8:1:1,它的執行流程以下:
l 把 Eden + From Survivor 存活的對象放入 To Survivor 區
l 清空 Eden 和 From Survivor 分區
l From Survivor 和 To Survivor 分區交換,From Survivor 變 To Survivor,To Survivor 變 From Survivor
每次在 From Survivor 到 To Survivor 移動時都存活的對象,年齡就 +1,當年齡到達 15(默認配置是 15)時,升級爲老生代。大對象也會直接進入老生代。 老生代當空間佔用到達某個值以後就會觸發全局垃圾收回,通常使用標記整理的執行算法。以上這些循環往復就構成了整個分代垃圾回收的總體執行流程
207.說一下 jvm 調優的工具?
JDK 自帶了不少監控工具,都位於 JDK 的 bin 目錄下,其中最經常使用的是 jconsole 和 jvisualvm 這兩款視圖監控工具
l jconsole:用於對 JVM 中的內存、線程和類等進行監控;
l jvisualvm:JDK 自帶的全能分析工具,能夠分析:內存快照、線程快照、程序死鎖、監控內存的變化、gc 變化等
208.經常使用的 jvm 調優的參數都有哪些?
l -Xms2g:初始化推大小爲 2g
l -Xmx2g:堆最大內存爲 2g
l -XX:NewRatio=4:設置年輕的和老年代的內存比例爲 1:4
l -XX:SurvivorRatio=8:設置新生代 Eden 和 Survivor 比例爲 8:2
l –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器組合
l -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器組合
l -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器組合
l -XX:+PrintGC:開啓打印 gc 信息
l -XX:+PrintGCDetails:打印 gc 詳細信息
1.jdk和jre有什麼區別?
JRE: Java Runtime Environment
JDK:Java Development Kit
JRE顧名思義是java運行時環境,包含了java虛擬機,java基礎類庫。是使用java語言編寫的程序運行所須要的軟件環境,是提供給想運行java程序的用戶使用的。
JDK顧名思義是java開發工具包,是程序員使用java語言編寫java程序所需的開發工具包,是提供給程序員使用的。JDK包含了JRE,同時還包含了編譯java源碼的編譯器javac,還包含了不少java程序調試和分析的工具:jconsole,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序。
若是你須要運行java程序,只需安裝JRE就能夠了。若是你須要編寫java程序,須要安裝JDK。
JRE根據不一樣操做系統(如:windows,linux等)和不一樣JRE提供商(IBM,ORACLE等)有不少版本,最經常使用的是Oracle公司收購SUN公司的JRE版本。
2. ==和equals的區別是什麼?
== :比較
. 基本數據類型比較的是值;
. 引用類型比較的是地址值。
equals(Object o):
1)不能比較基本數據類型,基本數據類型不是類類型;
2)a.比較引用類型時(該方法繼承自Object,在object中比較的是地址值)等同於」==」;
Object類中的方法,因此,在每個java類中,都會有這個方法,由於每個java類都是直接或者間接的Object類的子類,會繼承到這個方法。
2)b.若是本身所寫的類中已經重寫了equals方法,那麼就安裝用戶自定義的方式來比較倆個對象是否相等,若是沒有重寫過equal方法,那麼會調用父類(Object)中的equals方法進行比較,也就是比較地址值。
注:有的實現類中(JDK中),重寫了equals方法,這時候比較內容(java.lang.String)
在自定義類中,若是比較對象,本身能夠重寫equals方法定義比較規則。
注意:equals(Object o)方法只能是一個對象來調用,而後參數也是要傳一個對象的。
1)若是是基本數據類型那麼就用==比較
2)若是是引用類型的話,想按照本身的方式去比較,就要重寫這個類中的equals方法,
若是沒有重寫,那麼equals和==比較的效果是同樣的,都是比較引用的地址值。
3)若是是比較字符串,那麼直接用equals就能夠了,由於String類裏面已經重寫了equals方法,
比較的時候字符串的內容,而不是引用的地址值了。
※ toString(): Object類中的方法,因此,在每個java類中,都會有這個方法,由於每個java類都是直接或者間接的Object類的子類,會繼承到這個方法。
3.兩個對象的hashCode()相同,則equals()也必定爲true,對嗎?
equls返回爲true,則二者的hashcode必定相等,意即相等的對象必須具備相等的哈希碼。每當equals方法被覆寫,一般須要重寫hashCode方法從而
保持對象行爲的一致性。而具備相等的hashcode的兩個對象equals不必定成立。你能夠這樣認爲也行,hashcode是做爲一個對象存儲的參考,hash表自己是一種散列表,在數據存儲這塊,功效比較大,而equals是至關於兩對象之間的屬性(成員變量)「相等」,意即具備相同的行爲(方法)。或許這樣講起來理解比較的費勁。舉個例子,好比你定義class A有兩個屬性,int aA,aB,在定義一個class B也有兩個屬性,int bA,bB,而後覆寫hashcode方法,A類爲return aA*aB;B類爲return bA*bB.如今狀況已經很顯然了,各自實例化一個對象:a,b,假如:a.aA=b.bA,a.aB=b.bB,相等,或者a.aA=b.bB,a.aB=b.bA兩個對象a,b的hashcode必定相等,當時你能說兩個對象相等嗎?顯然不能吧,a與b都是不一樣類的實例。連equals最基本的obj instance of A或是obj instance of B都不成立。若是是同一個類的不一樣對象,當二者擁有相同hashcode的時候,則必定相等,或者equals成立的時候則hashcode必定爲真,這也就是所謂的相等的對象具備行爲一致性。
4.final在Java中有什麼做用?
(1).被final關鍵字修飾的類不能被繼承,被final關鍵字修飾的類屬性和類方法不能被覆蓋(重寫);
(2).對於被final關鍵字修飾的類屬性而言,子類就不能給他從新賦值了,若是從新賦值,會報錯:
(3).與類屬性相似,父類方法若是用final關鍵字進行修飾,那麼不能被覆蓋,但要說明一點的是,不能被重寫是指不能同時和和父類方法同名,同參數,換句話講,只要子類中的方法與父類中的方法同名,同參數列表,即便返回值不一樣,仍然是屬於重寫的範疇:
5.java中Math.round(-1.5)等於多少?
Math.round(1.5)的返回值是2,Math.round(-1.5)的返回值是-1。四捨五入的原理是在參數上加0.5而後作向下取整。
6.String屬於基礎的數據類型嗎?
String不是基本的數據類型,是final修飾的java類,java中的基本類型一共有8個,它們分別爲:
1 字符類型:byte,char
2 基本整型:short,int,long
3 浮點型:float,double
4 布爾類型:boolean
7.java中操做字符串的都有哪些類?他們之間有什麼區別?
String、StringBuffer、StringBuilder
String : final修飾,String類的方法都是返回new String。即對String對象的任何改變都不影響到原對象,對字符串的修改操做都會生成新的對象。
StringBuffer : 對字符串的操做的方法都加了synchronized,保證線程安全。
StringBuilder : 不保證線程安全,在方法體內須要進行字符串的修改操做,能夠new StringBuilder對象,調用StringBuilder對象的append、replace、delete等方法修改字符串。
1)String是不可變類型的每聲明一個字符就會建立一個對象而後將指針指向新的對象
2)StringBuffer 和StringBuilder都是可變的。
3)String StringBuffer是線程安全的多線程環境下推薦使用StringBuffer
4)StringBuilder是非線程安全的因此效率要高於StringBuffer因此通常單線程狀況下推薦使用StringBuilder
8.String str = 「i」和 String str = new String(「i」)同樣嗎?
答案:不同他們兩個在內存的分配上不同
String str = 「i」 java虛擬機會將其分配到常量池中
String str = new String(「i」) 則是將其分配到堆內存中
9.如何將字符串反轉?
StringBuilder 和 StringBuffer的reverse()方法.
http://www.javashuo.com/article/p-aedcblzh-bn.html
10.String類的經常使用方法都有哪些?
http://www.javashuo.com/article/p-ezdawwxs-bv.html
https://blog.csdn.net/qq_25406669/article/details/79021911
11.抽象類必需要有抽象方法嗎?
抽象類能夠沒有抽象方法,可是若是你的一個類已經聲明成了抽象類,即便這個類中沒有抽象方法,它也不能再實例化,即不能直接構造一個該類的對象。若是一個類中有了一個抽象方法,那麼這個類必須聲明爲抽象類,不然編譯通不過。
12.普通類和抽象類有哪些區別?
* 抽象類不能直接產生對象,抽象方法沒有方法體,因此不能被實例化。
* 抽象類必須有子類,必須被繼承,抽象類的子類不是抽象類,但必須所有覆寫抽象類方法
* 抽象類的實例化須要藉助子類來實現,採用向上轉型的方式處理。
* 抽象類的構造方法是先調用父類的,再調用子類的。
* 抽象方法不能使用final定義,由於抽象類必須有子類。
* 外部的抽象類不容許使用static申明,內部類能夠使用static修飾
* 抽象類的子類只能繼承一個父類
13.抽象類能使用final修飾嗎?
抽象類須要被繼承才能使用,而被final修飾的類沒法被繼承,因此abstract和final是不能共存的。
Java抽象類是內部類時,能夠被private修飾
Java抽象類不是內部類時,不能夠被private修飾
14.接口和抽象類有什麼區別?
1、抽象類和接口都不能直接實例化,若是要實例化,抽象類變量必須指向實現全部抽象方法的子類對象,接口變量必須指向實現全部接口方法的類對象。
2、抽象類要被子類繼承,接口要被類實現。
3、接口只能作方法申明,抽象類中能夠作方法申明,也能夠作方法實現
4、接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通量。
5、抽象類裏的抽象方法必須所有被子類所實現,若是子類不能所有實現父類抽象方法,那麼該子類只能是抽象類。一樣,一個實現接口的時候,如不能所有實現接口方法,那麼該類也只能爲抽象類。
6、抽象方法只能申明,不能實現,接口是設計的結果,抽象類是重構的結果
7、抽象類裏能夠沒有抽象方法
8、若是一個類裏有抽象方法,那麼這個類只能是抽象類
9、抽象方法要被實現,因此不能是靜態的,也不能是私有的。
10、接口可繼承接口,並可多繼承接口,但類只能單根繼承。
1.抽象類和接口都是用來抽象具體對象的. 可是接口的抽象級別最高
2.抽象類能夠有具體的方法和屬性, 接口只能有抽象方法和不可變常量
3.抽象類主要用來抽象類別,接口主要用來抽象功能.
4、抽象類中,且不包含任何實現,派生類必須覆蓋它們。接口中全部方法都必須是未實現的。
15.Java中的IO流分爲幾種?
按流向分(站在程序角度考慮)
輸入流(input)
輸出流(output)
按類型分:
l 字節流(InputStream/OutputStream)
u 任何文件均可以經過字節流進行傳輸。
l 字符流(Reader/Writer)
u 非純文本文件,不能用字符流,會致使文件格式破壞,不能正常執行。
l 節點流(低級流:直接跟輸入輸出源對接)
FileInputStream/FileOutputStream/FileReader/FileWriter/PrintStream/PrintWriter.
l 處理流(高級流:創建在低級流的基礎上)
u 轉換流:InputStreamReader/OutputStreamWriter,字節流轉字符流/字符流轉字節流
u 緩衝流:BufferedInputStream/BufferedOutputStream BufferedReader/BufferedReader可對節點流經行包裝,使讀寫更快
16.BIO,NIO,AIO有什麼區別?
ü Java BIO :同步並阻塞,服務器實現模式爲一個鏈接一個線程,即客戶端有鏈接請求時服務器端就須要啓動一個線程進行處理,若是這個鏈接不作任何事情會形成沒必要要的線程開銷,固然能夠經過線程池機制改善。
ü Java NIO :同步非阻塞,服務器實現模式爲一個請求一個線程,即客戶端發送的鏈接請求都會註冊到多路複用器上,多路複用器輪詢到鏈接有I/O請求時才啓動一個線程進行處理。
ü Java AIO(NIO.2) :異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啓動線程進行處理.
l BIO方式適用於鏈接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4之前的惟一選擇,但程序直觀簡單易理解。
l NIO方式適用於鏈接數目多且鏈接比較短(輕操做)的架構,好比聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持。
l AIO方式使用於鏈接數目多且鏈接比較長(重操做)的架構,好比相冊服務器,充分調用OS參與併發操做,編程比較複雜,JDK7開始支持。
17.Files的經常使用方法有哪些?
建立:
createNewFile()在指定位置建立一個空文件,成功就返回true,若是已存在就不建立,而後返回false。
mkdir() 在指定位置建立一個單級文件夾。
mkdirs() 在指定位置建立一個多級文件夾。
renameTo(File dest)若是目標文件與源文件是在同一個路徑下,那麼renameTo的做用是重命名,若是目標文件與源文件不是在同一個路徑下,那麼renameTo的做用就是剪切,並且還不能操做文件夾。
刪除:
delete() 刪除文件或者一個空文件夾,不能刪除非空文件夾,立刻刪除文件,返回一個布爾值。
deleteOnExit()jvm退出時刪除文件或者文件夾,用於刪除臨時文件,無返回值。
判斷:
exists() 文件或文件夾是否存在。
isFile() 是不是一個文件,若是不存在,則始終爲false。
isDirectory() 是不是一個目錄,若是不存在,則始終爲false。
isHidden() 是不是一個隱藏的文件或是不是隱藏的目錄。
isAbsolute() 測試此抽象路徑名是否爲絕對路徑名。
獲取:
getName() 獲取文件或文件夾的名稱,不包含上級路徑。
getAbsolutePath()獲取文件的絕對路徑,與文件是否存在不要緊
length() 獲取文件的大小(字節數),若是文件不存在則返回0L,若是是文件夾也返回0L。
getParent() 返回此抽象路徑名父目錄的路徑名字符串;若是此路徑名沒有指定父目錄,則返回null。
lastModified()獲取最後一次被修改的時間。
文件夾相關:
static File[] listRoots()列出全部的根目錄(Window中就是全部系統的盤符)
list() 返回目錄下的文件或者目錄名,包含隱藏文件。對於文件這樣操做會返回null。
listFiles() 返回目錄下的文件或者目錄對象(File類實例),包含隱藏文件。對於文件這樣操做會返回null。
list(FilenameFilter filter)返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操做會返回null。
listFiles(FilenameFilter filter)返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操做會返回null。
http://www.javashuo.com/article/p-kgiurvpu-ch.html
18.Java容器都有哪些?
http://www.javashuo.com/article/p-nihqhepn-bn.html
List:存放有序,列表存儲,元素可重複
Set:無序,元素不可重複
Map:無序,元素可重複
Set底層HashMap實現
HashMap底層用數組+鏈表實現
LinkedHashMap,TreeHashMap底層用額外的鏈表和樹進行維護
HashMap的線程安全包:ConcurrentHashMap
19.Collection和collections有什麼區別?
java.util.Collection 是一個集合接口(集合類的一個頂級接口)。它提供了對集合對象進行基本操做的通用接口方法。Collection接口在Java 類庫中有不少具體的實現。Collection接口的意義是爲各類具體的集合提供了最大化的統一操做方式,其直接繼承接口有List與Set。
Collections則是集合類的一個工具類/幫助類,其中提供了一系列靜態方法,用於對集合中元素進行排序、搜索以及線程安全等各類操做。
1) 排序(Sort)
List<Integer> list = new ArrayList<Integer>();
int array[] = {112, 111, 23, 456, 231 };
for (int i = 0; i < array.length; i++) {
list.add(array[i]);
}
Collections.sort(list);
for (int i = 0; i < array.length; i++) {
System.out.println(list.get(i));
}
2) 反轉(Reverse)
3) 替換因此的元素(Fill)
4) 拷貝(Copy)
用兩個參數,一個目標 List 和一個源 List, 將源的元素拷貝到目標,並覆蓋它的內容。目標 List 至少與源同樣長。若是它更長,則在目標 List 中的剩餘元素不受影響。
Collections.copy(list,li): 前面一個參數是目標列表 ,後一個是源列表。
6) 返回Collections中最小元素(min)
根據指定比較器產生的順序,返回給定 collection 的最小元素。collection 中的全部元素都必須是經過指定比較器可相互比
(7)Collections.min(list)
返回Collections中最大元素(max)
根據指定比較器產生的順序,返回給定 collection 的最大元素。collection 中的全部元素都必須是經過指定比較器可相互比較的。
Collections.max(list)
http://www.javashuo.com/article/p-nlqdavya-cv.html
20.List,Set,Map之間的區別是什麼?
聯繫:
Collection與Map屬於同等關係,但Map依賴與Collection。
Coolection接口的子類包含List(ArrayList、LinkedList等)、Set(HashSet、TreeSet等)
區別:
List及實現類是可變大小的列表,適用於按數組索引訪問元素。
Set接口繼承了Collection接口,可是它不容許集合中存在重複項。
Map中以鍵-值對形式存儲數據。
21.HashMap與HashTable有什麼區別?
HashMap和Hashtable都實現了Map接口,但決定用哪個以前先要弄清楚它們之間的分別。主要的區別有:線程安全性,同步(synchronization),以及速度。
l HashMap幾乎能夠等價於Hashtable,除了HashMap是非synchronized的,並能夠接受null(HashMap能夠接受爲null的鍵值(key)和值(value),而Hashtable則不行)。
l HashMap是非synchronized,而Hashtable是synchronized,這意味着Hashtable是線程安全的,多個線程能夠共享一個Hashtable;而若是沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
l 另外一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。因此當有其它線程改變了HashMap的結構(增長或者移除元素),將會拋出ConcurrentModificationException,但迭代器自己的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並非一個必定發生的行爲,要看JVM。這條一樣也是Enumeration和Iterator的區別。
l 因爲Hashtable是線程安全的也是synchronized,因此在單線程環境下它比HashMap要慢。若是你不須要同步,只須要單一線程,那麼使用HashMap性能要好過Hashtable。
l HashMap不能保證隨着時間的推移Map中的元素次序是不變的。
22.如何決定使用HashMap仍是TreeMap?
(1)HashMap:適用於在Map中插入、刪除和定位元素。
(2)Treemap:適用於按天然順序或自定義順序遍歷鍵(key)。
(3)HashMap一般比TreeMap快一點(樹和哈希表的數據結構使然),建議多使用HashMap,在須要排序的Map時候才用TreeMap.
(4)HashMap 非線程安全 TreeMap 非線程安全
(5)HashMap的結果是沒有排序的,而TreeMap輸出的結果是排好序的。
23.說一下HashMap的實現原理
HashMap是基於哈希表的Map接口的非同步實現。此實現提供全部可選的映射操做,並容許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恆久不變。
在java編程語言中,最基本的結構就是兩種,一個是數組,另一個是模擬指針(引用),全部的數據結構均可以用這兩個基本結構來構造的,HashMap也不例外。HashMap其實是一個「鏈表散列」的數據結構,即數組和鏈表的結合體。
HashMap的實現原理:
1. 利用key的hashCode從新hash計算出當前對象的元素在數組中的下標
2. 存儲時,若是出現hash值相同的key,此時有兩種狀況。(1)若是key相同,則覆蓋原始值;(2)若是key不一樣(出現衝突),則將當前的key-value放入鏈表中
3. 獲取時,直接找到hash值對應的下標,在進一步判斷key是否相同,從而找到對應值。
4. 理解了以上過程就不難明白HashMap是如何解決hash衝突的問題,核心就是使用了數組的存儲方式,而後將衝突的key的對象放入鏈表中,一旦發現衝突就在鏈表中作進一步的對比。
http://www.javashuo.com/article/p-bbqtkbbn-dg.html
24.hashSet實現原理
HashSet的實現原理:
往HashSet添加元素的時候,HashSet會先調用元素的hashCode方法獲得元素的哈希值,而後經過元素的哈希值通過移位等運算,就能夠算出該元素在哈希表中的存儲位置。
狀況1:若是算出元素存儲的位置目前沒有任何元素存儲,那麼該元素能夠直接存儲到該位置上。
狀況2:若是算出該元素的存儲位置目前已經存在有其餘的元素了,那麼會調用該元素的equals方法與該位置的元素再比較一次,若是equals返回的是true,那麼該元素與這個位置上的元素就視爲重複元素,不容許添加,若是equals方法返回的是false,那麼該元素運行添加。
25.ArrayList和Linkedlist的區別?
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。
3.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據。
26.如何實現數組和list之間的轉換?
List轉數組:toArray(arraylist.size()方法
數組轉List:Arrays的asList(a)方法
List<String> arrayList = new ArrayList<String>();
arrayList.add("s");
arrayList.add("e");
arrayList.add("n");
/**
* ArrayList轉數組
*/
int size=arrayList.size();
String[] a = arrayList.toArray(new String[size]);
//輸出第二個元素
System.out.println(a[1]);//結果:e
//輸出整個數組
System.out.println(Arrays.toString(a));//結果:[s, e, n]
/**
* 數組轉list
*/
List<String> list=Arrays.asList(a);
* list轉Arraylist
*/
List<String> arrayList2 = new ArrayList<String>();
arrayList2.addAll(list);
System.out.println(list);
27.在 Queue 中 poll()和 remove()有什麼區別?
1. queue的增長元素方法add和offer的區別在於,add方法在隊列滿的狀況下將選擇拋異常的方法來表示隊列已經滿了,而offer方法經過返回false表示隊列已經滿了;在有限隊列的狀況,使用offer方法優於add方法;
2. remove方法和poll方法都是刪除隊列的頭元素,remove方法在隊列爲空的狀況下將拋異常,而poll方法將返回null;
3. element和peek方法都是返回隊列的頭元素,可是不刪除頭元素,區別在與element方法在隊列爲空的狀況下,將拋異常,而peek方法將返回null.
Vector是同步的,而ArrayList不是。然而,若是你尋求在迭代的時候對列表進行改變,你應該使用CopyOnWriteArrayList。
ArrayList比Vector快,它由於有同步,不會過載。
ArrayList更加通用,由於咱們能夠使用Collections工具類輕易地獲取同步列表和只讀列表。
l Array能夠容納基本類型和對象,而ArrayList只能容納對象。
l Array是指定大小的,而ArrayList大小是固定的。
l Array沒有提供ArrayList那麼多功能,好比addAll、removeAll和iterator等
30. 哪些集合類是線程安全的?
vector:就比arraylist多了個同步化機制(線程安全),由於效率較低,如今已經不太建議使用。在web應用中,特別是前臺頁面,每每效率(頁面響應速度)是優先考慮的。
statck:堆棧類,先進後出
hashtable:就比hashmap多了個線程安全
enumeration:枚舉,至關於迭代器
除了這些以外,其餘的都是非線程安全的類和接口。
31. 迭代器 Iterator 是什麼?
迭代器是一種設計模式,它是一個對象,它能夠遍歷並選擇序列中的對象,而開發人員不須要了解該序列的底層結構。迭代器一般被稱爲「輕量級」對象,由於建立它的代價小。
Java中的Iterator功能比較簡單,而且只能單向移動:
(1) 使用方法iterator()要求容器返回一個Iterator。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
(2) 使用next()得到序列中的下一個元素。
(3) 使用hasNext()檢查序列中是否還有元素。
(4) 使用remove()將迭代器新返回的元素刪除。
Iterator是Java迭代器最簡單的實現,爲List設計的ListIterator具備更多的功能,它能夠從兩個方向遍歷List,也能夠從List中插入和刪除元素。
Iterator it = l.iterator();
String lll = "";
while (it.hasNext()) {
String kk = (String) it.next();
lll = lll + kk;
}
System.out.println(lll);
32. Iterator 怎麼使用?有什麼特色?
33. Iterator 和 ListIterator 有什麼區別?
都是迭代器,當須要對集合中元素進行遍歷不須要干涉其遍歷過程時,這兩種迭代器均可以使用。
1.使用範圍不一樣,Iterator能夠應用於全部的集合,Set、List和Map和這些集合的子類型。而ListIterator只能用於List及其子類型。
2.ListIterator有add方法,能夠向List中添加對象,而Iterator不能。
3.ListIterator和Iterator都有hasNext()和next()方法,能夠實現順序向後遍歷,可是ListIterator有hasPrevious()和previous()方法,能夠實現逆向(順序向前)遍歷。Iterator不能夠。
4.ListIterator能夠定位當前索引的位置,nextIndex()和previousIndex()能夠實現。Iterator沒有此功能。
5.均可實現刪除操做,可是ListIterator能夠實現對象的修改,set()方法能夠實現。Iterator僅能遍歷,不能修改。
34. 怎麼確保一個集合不能被修改?
Collections.unmodifiableList(List)
Collections.unmodifiableMap(Map)
Collections.unmodifiableSet(Set)
以上返回的集合對象都是不可修改的,調用修改方法會拋出異常UnsupportedOperationException
35. 並行和併發有什麼區別?
l 併發在單核和多核均可存在,就是同一時間有多個能夠執行的進程。可是在單核中同一時刻只有一個進程得到CPU,雖然宏觀上你認爲多個進程都在進行
l 並行是指同一時間多個進程在微觀上都在真正的執行,這就只有在多核的狀況下了
36. 線程和進程的區別?
l 線程:是程序執行流的最小單元,是系統獨立調度和分配CPU(獨立運行)的基本單位
l 進程:是資源分配的基本單位。一個進程包括多個線程
區別:地址空間、資源擁有
1. 線程與資源分配無關,它屬於某一個進程,並與進程內的其餘線程一塊兒共享進程的資源
2. 每一個進程都有本身一套獨立的資源(數據),供其內的全部線程共享
3. 不管是大小,開銷線程要更「輕量級」
4. 一個進程內的線程通訊比進程之間的通訊更快速,有效。(由於共享變量)
37.守護線程是什麼?
守護線程是個服務線程,服務於其餘線程
典型案例:垃圾回收線程
38.建立線程有哪幾種方式?
· 繼承Thread類建立線程
· 實現Runnable接口建立線程
· 經過Callable和Future建立線程
39.說一下 runnable 和 callable 有什麼區別?
runnable 沒有返回值,callable 能夠拿到有返回值,callable 能夠看做是 runnable 的補充。
二者都是接口;(廢話)
二者均可用來編寫多線程程序;
二者都須要調用Thread.start()啓動線程;
不一樣點:
1. 二者最大的不一樣點是:實現Callable接口的任務線程能返回執行結果;而實現Runnable接口的任務線程不能返回結果;
2. Callable接口的call()方法容許拋出異常;而Runnable接口的run()方法的異常只能在內部消化,不能繼續上拋;
注意點:
· Callable接口支持返回執行結果,此時須要調用FutureTask.get()方法實現,此方法會阻塞主線程直到獲取‘未來’結果;當不調用此方法時,主線程不會阻塞!
40.線程有哪些狀態?
建立、就緒、運行、阻塞、死亡
41.sleep() 和 wait() 有什麼區別?
· sleep() 能夠在任何地方使用
· wait() 只能在同步方法或同步塊中使用
· 每一個對象都有一個鎖來控制同步訪問,Synchronized關鍵字能夠和對象的鎖交互,來實現同步方法或同步塊。sleep()方法正在執行的線程主動讓出CPU(而後CPU就能夠去執行其餘任務),在sleep指定時間後CPU再回到該線程繼續往下執行(注意:sleep方法只讓出了CPU,而並不會釋放同步資源鎖!!!);wait()方法則是指當前線程讓本身暫時退讓出同步資源鎖,以便其餘正在等待該資源的線程獲得該資源進而運行,只有調用了notify()方法,以前調用wait()的線程纔會解除wait狀態,能夠去參與競爭同步資源鎖,進而獲得執行。(注意:notify的做用至關於叫醒睡着的人,而並不會給他分配任務,就是說notify只是讓以前調用wait的線程有權利從新參與線程的調度);
· 2、sleep()方法能夠在任何地方使用;wait()方法則只能在同步方法或同步塊中使用;
· 3、sleep()是線程線程類(Thread)的方法,調用會暫停此線程指定的時間,但監控依然保持,不會釋放對象鎖,到時間自動恢復;wait()是Object的方法,調用會放棄對象鎖,進入等待隊列,待調用notify()/notifyAll()喚醒指定的線程或者全部線程,纔會進入鎖池,再也不次得到對象鎖纔會進入運行狀態;
·
42.notify()和 notifyAll()有什麼區別?
· notify是喚醒某個線程
· notifyAll是喚醒全部暫停線程
43.線程的 run()和 start()有什麼區別?
· run() 至關於線程的任務處理邏輯的入口方法
· start() 的做用是啓動相應的線程
· run()至關於線程的任務處理邏輯的入口方法,它由Java虛擬機在運行相應線程時直接調用,而不是由應用代碼進行調用。
· 而start()的做用是啓動相應的線程。啓動一個線程實際是請求Java虛擬機運行相應的線程,而這個線程什麼時候可以運行是由線程調度器決定的。start()調用結束並不表示相應線程已經開始運行,這個線程可能稍後運行,也可能永遠也不會運行。h
44.建立線程池有哪幾種方式?
線程池建立有七種方式,最核心的是最後一種:
· newSingleThreadExecutor():它的特色在於工做線程數目被限制爲 1,操做一個無界的工做隊列,因此它保證了全部任務的都是被順序執行,最多會有一個任務處於活動狀態,而且不容許使用者改動線程池實例,所以能夠避免其改變線程數目;
· newCachedThreadPool():它是一種用來處理大量短期工做任務的線程池,具備幾個鮮明特色:它會試圖緩存線程並重用,當無緩存線程可用時,就會建立新的工做線程;若是線程閒置的時間超過 60 秒,則被終止並移出緩存;長時間閒置時,這種線程池,不會消耗什麼資源。其內部使用 SynchronousQueue 做爲工做隊列;
· newFixedThreadPool(int nThreads):重用指定數目(nThreads)的線程,其背後使用的是無界的工做隊列,任什麼時候候最多有 nThreads 個工做線程是活動的。這意味着,若是任務數量超過了活動隊列數目,將在工做隊列中等待空閒線程出現;若是有工做線程退出,將會有新的工做線程被建立,以補足指定的數目 nThreads;
· newSingleThreadScheduledExecutor():建立單線程池,返回 ScheduledExecutorService,能夠進行定時或週期性的工做調度;
· newScheduledThreadPool(int corePoolSize):和newSingleThreadScheduledExecutor()相似,建立的是個 ScheduledExecutorService,能夠進行定時或週期性的工做調度,區別在於單一工做線程仍是多個工做線程;
· newWorkStealingPool(int parallelism):這是一個常常被人忽略的線程池,Java 8 才加入這個建立方法,其內部會構建ForkJoinPool,利用Work-Stealing算法,並行地處理任務,不保證處理順序;
· ThreadPoolExecutor():是最原始的線程池建立,上面1-3建立方式都是對ThreadPoolExecutor的封裝。
45.線程池都有哪些狀態?
· RUNNING:這是最正常的狀態,接受新的任務,處理等待隊列中的任務。
· SHUTDOWN:不接受新的任務提交,可是會繼續處理等待隊列中的任務。
· STOP:不接受新的任務提交,再也不處理等待隊列中的任務,中斷正在執行任務的線程。
· TIDYING:全部的任務都銷燬了,workCount 爲 0,線程池的狀態在轉換爲 TIDYING 狀態時,會執行鉤子方法 terminated()。
· TERMINATED:terminated()方法結束後,線程池的狀態就會變成這個。
46.線程池中 submit()和 execute()方法有什麼區別?
· execute():只能執行 Runnable 類型的任務。
· submit():能夠執行 Runnable 和 Callable 類型的任務。
Callable 類型的任務能夠獲取執行的返回值,而 Runnable 執行無返回值。
47.在 java 程序中怎麼保證多線程的運行安全?
· 方法一:使用安全類,好比 Java. util. concurrent 下的類。
· 方法二:使用自動鎖 synchronized。
· 方法三:使用手動鎖 Lock。
手動鎖Java示例代碼以下:
Lock lock = new ReentrantLock();
lock.lock();
try {
System. out. println("得到鎖");
} catch (Exception e) {
// TODO: handle exception
} finally {
System. out. println("釋放鎖");
lock. unlock();
}
48.多線程鎖的升級原理是什麼?
synchronized 鎖升級原理:在鎖對象的對象頭裏面有一個 threadid 字段,在第一次訪問的時候 threadid 爲空,jvm 讓其持有偏向鎖,並將 threadid 設置爲其線程 id,再次進入的時候會先判斷 threadid 是否與其線程 id 一致,若是一致則能夠直接使用此對象,若是不一致,則升級偏向鎖爲輕量級鎖,經過自旋循環必定次數來獲取鎖,執行必定次數以後,若是尚未正常獲取到要使用的對象,此時就會把鎖從輕量級升級爲重量級鎖,此過程就構成了 synchronized 鎖的升級。
鎖的升級的目的:鎖升級是爲了減低了鎖帶來的性能消耗。在 Java 6 以後優化 synchronized 的實現方式,使用了偏向鎖升級爲輕量級鎖再升級到重量級鎖的方式,從而減低了鎖帶來的性能消耗。
49.什麼是死鎖?
當線程 A 持有獨佔鎖a,並嘗試去獲取獨佔鎖 b 的同時,線程 B 持有獨佔鎖 b,並嘗試獲取獨佔鎖 a 的狀況下,就會發生 AB 兩個線程因爲互相持有對方須要的鎖,而發生的阻塞現象,咱們稱爲死鎖。
50.怎麼防止死鎖?
· 儘可能使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),設置超時時間,超時能夠退出防止死鎖。
· 儘可能使用 Java. util. concurrent 併發類代替本身手寫鎖。
· 儘可能下降鎖的使用粒度,儘可能不要幾個功能用同一把鎖。
· 儘可能減小同步的代碼塊。
51.ThreadLocal 是什麼?有哪些使用場景?
ThreadLocal用於保存某個線程共享變量。使用場景:解決數據庫鏈接,Session管理
52.說一下 synchronized 底層實現原理?
synchronized 是由一對 monitorenter/monitorexit 指令實現的,monitor 對象是同步的基本實現單元。在 Java 6 以前,monitor 的實現徹底是依靠操做系統內部的互斥鎖,由於須要進行用戶態到內核態的切換,因此同步操做是一個無差異的重量級操做,性能也很低。但在 Java 6 的時候,Java 虛擬機對此進行了大刀闊斧地改進,提供了三種不一樣的 monitor 實現,也就是常說的三種不一樣的鎖:偏向鎖(Biased Locking)、輕量級鎖和重量級鎖,大大改進了其性能。
53.synchronized 和 volatile 的區別是什麼?
· volatile 是變量修飾符;synchronized 是修飾類、方法、代碼段。
· volatile 僅能實現變量的修改可見性,不能保證原子性;而 synchronized 則能夠保證變量的修改可見性和原子性。
· volatile 不會形成線程的阻塞;synchronized 可能會形成線程的阻塞。
54.synchronized 和 Lock 有什麼區別?
· synchronized 能夠給類、方法、代碼塊加鎖;而 lock 只能給代碼塊加鎖。
· synchronized 不須要手動獲取鎖和釋放鎖,使用簡單,發生異常會自動釋放鎖,不會形成死鎖;而 lock 須要本身加鎖和釋放鎖,若是使用不當沒有 unLock()去釋放鎖就會形成死鎖。
· 經過 Lock 能夠知道有沒有成功獲取鎖,而 synchronized 卻沒法辦到。
55.synchronized 和 ReentrantLock 區別是什麼?
synchronized 早期的實現比較低效,對比 ReentrantLock,大多數場景性能都相差較大,可是在 Java 6 中對 synchronized 進行了很是多的改進。
主要區別以下:
· ReentrantLock 使用起來比較靈活,可是必須有釋放鎖的配合動做;
· ReentrantLock 必須手動獲取與釋放鎖,而 synchronized 不須要手動釋放和開啓鎖;
· ReentrantLock 只適用於代碼塊鎖,而 synchronized 可用於修飾方法、代碼塊等。
· volatile 標記的變量不會被編譯器優化;synchronized 標記的變量能夠被編譯器優化。
56.說一下 atomic 的原理?
atomic 主要利用 CAS (Compare And Wwap) 和 volatile 和 native 方法來保證原子操做,從而避免 synchronized 的高開銷,執行效率大爲提高。
4、反射
57.什麼是反射?
能夠將一個程序(類)在運行的時候得到該程序(類)的信息的機制,也就是得到在編譯期不可能得到的類的信息,由於這些信息是保存在Class對象中的,而這個Class對象是在程序運行時動態加載的
58.什麼是 java 序列化?什麼狀況下須要序列化?
系列化就是把java對象轉換爲字節序列的方法。
· 把對象的字節序列化到永久的保存到硬盤中
· 在網絡上傳遞對象的字節序列
59.動態代理是什麼?有哪些應用?
動態代理是運行時動態生成代理類。
· 動態代理指的是能夠任意控制任意對象的執行過程
u 原本應該本身作的事情,由於沒有某種緣由不能直接作,只能請別人代理作。被請的人就是代理
u 好比春節買票回家,因爲沒有時間,只能找票務中介來買,這就是代理模式
· 應用:Spring 的 AOP
60.怎麼實現動態代理?
· JDK動態代理
· cglib動態代理
5、對象拷貝
61.爲何要使用克隆?
克隆的對象可能包含一些已經修改過的屬性,而 new 出來的對象的屬性都仍是初始化時候的值,因此當須要一個新的對象來保存當前對象的「狀態」就靠克隆方法了。
62.如何實現對象克隆?
· 實現 Cloneable 接口並重寫 Object 類中的 clone() 方法。
· 實現 Serializable 接口,經過對象的序列化和反序列化實現克隆,能夠實現真正的深度克隆。
63.深拷貝和淺拷貝區別是什麼?
· 淺克隆:當對象被複制時只複製它自己和其中包含的值類型的成員變量,而引用類型的成員對象並無複製。
· 深克隆:除了對象自己被複制外,對象所包含的全部成員變量也將複製。
64.jsp 和 servlet 有什麼區別?
l jsp經編譯後就成了Servlet(Jsp的本質就是Servlet,JVM只能識別Java類,不能識別Jsp代碼,Web容器將Jsp的代碼編譯成JVM可以識別的java類)
l jsp更擅長表現於頁面顯示,servlet更擅長於邏輯控制
l Servlet中沒有內置對象,Jsp中的內置對象都是必須經過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象獲得
65.jsp 有哪些內置對象?做用分別是什麼?
66.說一下 jsp 的 4 種做用域?
67.session 和 cookie 有什麼區別?
l 存儲位置不一樣:session 存儲在服務器端;cookie 存儲在瀏覽器端。
l 安全性不一樣:cookie 安全性通常,在瀏覽器存儲,能夠被僞造和修改。
l 容量和個數限制:cookie 有容量限制,每一個站點下的 cookie 也有個數限制。
l 存儲的多樣性:session 能夠存儲在 Redis 中、數據庫中、應用程序中;而 cookie 只能存儲在瀏覽器中
68.說一下 session 的工做原理?
session 的工做原理是客戶端登陸完成以後,服務器會建立對應的 session,session 建立完以後,會把 session 的 id 發送給客戶端,客戶端再存儲到瀏覽器中。這樣客戶端每次訪問服務器時,都會帶着 sessionid,服務器拿到 sessionid 以後,在內存找到與之對應的 session 這樣就能夠正常工做了
69.若是客戶端禁止 cookie 能實現 session 還能用嗎?
能夠用,session 只是依賴 cookie 存儲 sessionid,若是 cookie 被禁用了,能夠使用 url 中添加 sessionid 的方式保證 session 能正常使用
70.spring mvc 和 struts 的區別是什麼?
l 攔截級別:struts2 是類級別的攔截;spring mvc 是方法級別的攔截。
l 數據獨立性:spring mvc 的方法之間基本上獨立的,獨享 request 和 response 數據,請求數據經過參數獲取,處理結果經過 ModelMap 交回給框架,方法之間不共享變量;而 struts2 雖然方法之間也是獨立的,但其全部 action 變量是共享的,這不會影響程序運行,卻給咱們編碼和讀程序時帶來了必定的麻煩。
l 攔截機制:struts2 有以本身的 interceptor 機制,spring mvc 用的是獨立的 aop 方式,這樣致使struts2 的配置文件量比 spring mvc 大。
l 對 ajax 的支持:spring mvc 集成了ajax,全部 ajax 使用很方便,只須要一個註解 @ResponseBody 就能夠實現了;而 struts2 通常須要安裝插件或者本身寫代碼才行。
71.如何避免 sql 注入?
l 使用預處理 PreparedStatement。
l 使用正則表達式過濾掉字符中的特殊字符。
72.什麼是 XSS 攻擊,如何避免?
XSS 攻擊:即跨站腳本攻擊,它是 Web 程序中常見的漏洞。原理是攻擊者往 Web 頁面裏插入惡意的腳本代碼(css 代碼、Javascript 代碼等),當用戶瀏覽該頁面時,嵌入其中的腳本代碼會被執行,從而達到惡意攻擊用戶的目的,如盜取用戶 cookie、破壞頁面結構、重定向到其餘網站等。
預防 XSS 的核心是必須對輸入的數據作過濾處理。
73.什麼是 CSRF 攻擊,如何避免?
CSRF:Cross-Site Request Forgery(中文:跨站請求僞造),能夠理解爲攻擊者盜用了你的身份,以你的名義發送惡意請求,好比:以你名義發送郵件、發消息、購買商品,虛擬貨幣轉帳等。
防護手段:
· 驗證請求來源地址;
· 關鍵操做添加驗證碼;
· 在請求地址添加 token 並驗證
74.throw 和 throws 的區別?
l throw則是指拋出的一個具體異常類型
l throws是用來聲明一個方法可能拋出的全部異常信息
75.final、finally、finalize 有什麼區別?
l final 是用來修飾類、方法、變量
l finally 只能用在 try catch 語法中,表示這段語句最終必定會被執行
76.try-catch-finally 中哪一個部分能夠省略?
try-catch-finally 其中 catch 和 finally 均可以被省略,可是不能同時省略,也就是說有 try 的時候,必須後面跟一個 catch 或者 finally
77.try-catch-finally 中,若是 catch 中 return 了,finally 還會執行嗎?
必定會, catch 中 return會等finally中的代碼執行完以後纔會執行
78.常見的異常類有哪些?
l NullPointerException 空指針異常
l ClassNotFoundException 指定類不存在
l NumberFormatException 字符串轉換爲數字異常
l IndexOutOfBoundsException 數組下標越界異常
l ClassCastException 數據類型轉換異常
l FileNotFoundException 文件未找到異常
l NoSuchMethodException 方法不存在異常
l IOException IO 異常
l SocketException Socket 異常
79.http 響應碼 301 和 302 表明的是什麼?有什麼區別?
l 301表示網頁永久性轉移到另外一個地址
l 302表示臨時性轉移
l 區別:
u 301是永久的重定向,搜索引擎在抓取新內容的同時也將舊的網址替換爲重定向以後的網址
u 302重定向是臨時的重定向,搜索引擎抓取新的內容而保留舊的網址
80.forward 和 redirect 的區別?
l forward 是服務器的內部重定向
l redirect 是服務器收到請求後發送一個狀態頭給客戶,客戶將在從新請求一次
81.簡述 tcp 和 udp的區別?
tcp 和 udp 是 OSI 模型中的運輸層中的協議。tcp 提供可靠的通訊傳輸,而 udp 則常被用於讓廣播和細節控制交給應用的通訊傳輸。
二者的區別大體以下:
· tcp 面向鏈接,udp 面向非鏈接即發送數據前不須要創建連接;
· tcp 提供可靠的服務(數據傳輸),udp 沒法保證;
· tcp 面向字節流,udp 面向報文;
· tcp 數據傳輸慢,udp 數據傳輸快
82.tcp 爲何要三次握手,兩次不行嗎?爲何?
若是採用兩次握手,那麼只要服務器發出確認數據包就會創建鏈接,但因爲客戶端此時並未響應服務器端的請求,那此時服務器端就會一直在等待客戶端,這樣服務器端就白白浪費了必定的資源。若採用三次握手,服務器端沒有收到來自客戶端的再此確認,則就會知道客戶端並無要求創建請求,就不會浪費服務器的資源
83.說一下 tcp 粘包是怎麼產生的?
tcp 粘包可能發生在發送端或者接收端,分別來看兩端各類產生粘包的緣由:
l 發送端粘包:發送端須要等緩衝區滿才發送出去,形成粘包;
l 接收方粘包:接收方不及時接收緩衝區的包,形成多個包接收。
84.OSI 的七層模型都有哪些?
l 物理層:利用傳輸介質爲數據鏈路層提供物理鏈接,實現比特流的透明傳輸。
l 數據鏈路層:負責創建和管理節點間的鏈路。
l 網絡層:經過路由選擇算法,爲報文或分組經過通訊子網選擇最適當的路徑。
l 傳輸層:向用戶提供可靠的端到端的差錯和流量控制,保證報文的正確傳輸。
l 會話層:向兩個實體的表示層提供創建和使用鏈接的方法。
l 表示層:處理用戶信息的表示問題,如編碼、數據格式轉換和加密解密等。
l 應用層:直接向用戶提供服務,完成用戶但願在網絡上完成的各類工做。
85.get 和 post 請求有哪些區別?
l get請求的參數在URL中,而post 請求在請求body中
l get請求傳參有長度限制,post請求沒有長度限制
l get請求的參數只能是ASCII碼,post請求傳參沒有這個限制
86.如何實現跨域?
l 使用CORS技術
l 使用JSONP
87.說一下 JSONP 實現原理?
jsonp是一種輕量級的數據交換格式。
jsonp:JSON with Padding,它是利用script標籤的 src 鏈接能夠訪問不一樣源的特性,加載遠程返回的「JS 函數」來執行的。
9、設計模式
88.說一下你熟悉的設計模式?
l 單例模式:保證被建立一次,節省系統開銷。
l 工廠模式(簡單工廠、抽象工廠):解耦代碼。
l 觀察者模式:定義了對象之間的一對多的依賴,這樣一來,當一個對象改變時,它的全部的依賴者都會收到通知並自動更新。
l 外觀模式:提供一個統一的接口,用來訪問子系統中的一羣接口,外觀定義了一個高層的接口,讓子系統更容易使用。
l 模版方法模式:定義了一個算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類能夠在不改變算法結構的狀況下,從新定義算法的步驟。
l 狀態模式:容許對象在內部狀態改變時改變它的行爲,對象看起來好像修改了它的類。
89.簡單工廠和抽象工廠有什麼區別?
l 簡單工廠:用來生產同一等級結構中的任意產品,對於增長新的產品,無能爲力。
l 工廠方法:用來生產同一等級結構中的固定產品,支持增長任意產品。
l 抽象工廠:用來生產不一樣產品族的所有產品,對於增長新的產品,無能爲力;支持增長產品族
90.爲何要使用 spring?
spring是一個開源框架,是個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架
· 方便結構簡化開發
· AOP編碼的支持
· 聲明式事物的支持
· 方便程序的測試
· 方便集成各類優點框架
· 下降Java EE API 的使用難度
91.解釋一下什麼是 aop?
AOP即面向切面編程,是OOP編程的有效補充。使用AOP技術,能夠將一些系統性相關的編程工做,獨立提取出來,獨立實現,而後經過切面切入進系統。從而避免了在業務邏輯的代碼中混入不少的系統相關的邏輯——好比權限管理,事物管理,日誌記錄等等。
AOP分爲靜態AOP和動態AOP:
l 靜態AOP是指AspectJ實現的AOP,他是將切面代碼直接編譯到Java類文件中。
l 動態AOP是指將切面代碼進行動態織入實現的AOP,JDK動態代理。
92.解釋一下什麼是 ioc?
即「控制反轉」,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。
IoC很好的體現了面向對象設計法則之一—— 好萊塢法則:「別找咱們,咱們找你」;即由IoC容器幫對象找相應的依賴對象並注入,而不是由對象主動去找。
93.spring 有哪些主要模塊?
core模塊、aop模塊、data access模塊、web模塊、test模塊
l spring core:框架的最基礎部分,提供 ioc 和依賴注入特性。
l spring context:構建於 core 封裝包基礎上的 context 封裝包,提供了一種框架式的對象訪問方法。
l spring dao:Data Access Object 提供了JDBC的抽象層。
l spring aop:提供了面向切面的編程實現,讓你能夠自定義攔截器、切點等。
l spring Web:提供了針對 Web 開發的集成特性,例如文件上傳,利用 servlet listeners 進行 ioc 容器初始化和針對 Web 的 ApplicationContext。
l spring Web mvc:spring 中的 mvc 封裝包提供了 Web 應用的 Model-View-Controller(MVC)的實現。
94.spring 經常使用的注入方式有哪些?
詳細解析:http://www.javashuo.com/article/p-gdkynkay-kb.html
· 構造方法注入
· setter注入
· 基於註解注入
95.spring 中的 bean 是線程安全的嗎?
spring 中的 bean 默認是單例模式,spring 框架並無對單例 bean 進行多線程的封裝處理。
實際上大部分時候 spring bean 無狀態的(好比 dao 類),全部某種程度上來講 bean 也是安全的,但若是 bean 有狀態的話(好比 view model 對象),那就要開發者本身去保證線程安全了,最簡單的就是改變 bean 的做用域,把「singleton」變動爲「prototype」,這樣請求 bean 至關於 new Bean()了,因此就能夠保證線程安全了。
· 有狀態就是有數據存儲功能。
· 無狀態就是不會保存數據。
96.spring 支持幾種 bean 的做用域?
singleton、prototype、request、session、globalSession五中做用域。
l singleton:spring ioc 容器中只存在一個 bean 實例,bean 以單例模式存在,是系統默認值;
l prototype:每次從容器調用 bean 時都會建立一個新的示例,既每次 getBean()至關於執行 new Bean()操做;
l Web 環境下的做用域:
u request:每次 http 請求都會建立一個 bean;
u session:同一個 http session 共享一個 bean 實例;
u global-session:用於 portlet 容器,由於每一個 portlet 有單獨的 session,globalsession 提供一個全局性的 http session
97.spring 自動裝配 bean 有哪些方式?
可分爲四種:
l byName:按照bean的屬性名稱來匹配要裝配的bean
l byType:按照bean的類型來匹配要裝配的bean
l constructor:按照bean的構造器入參的類型來進行匹配
l autodetect(自動檢測):先使用constructor進行裝配,若是不成功就使用byType來裝配
98.spring 事務實現方式有哪些?
l 聲明式事務:聲明式事務也有兩種實現方式,基於 xml 配置文件的方式和註解方式(在類上添加 @Transaction 註解)。
l 編碼方式:提供編碼的形式管理和維護事務。
99.說一下 spring 的事務隔離?
spring 有五大隔離級別,默認值爲 ISOLATION_DEFAULT(使用數據庫的設置),其餘四個隔離級別和數據庫的隔離級別一致:
l ISOLATION_DEFAULT:用底層數據庫的設置隔離級別,數據庫設置的是什麼我就用什麼;
l ISOLATIONREADUNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其餘事務讀取(會出現幻讀、髒讀、不可重複讀);
l ISOLATIONREADCOMMITTED:提交讀,一個事務提交後才能被其餘事務讀取到(會形成幻讀、不可重複讀),SQL server 的默認級別;
l ISOLATIONREPEATABLEREAD:可重複讀,保證屢次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(會形成幻讀),MySQL 的默認級別;
l ISOLATION_SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止髒讀、不可重複讀、幻讀。
l 髒讀:表示一個事務可以讀取另外一個事務中還未提交的數據。好比,某個事務嘗試插入記錄 A,此時該事務還未提交,而後另外一個事務嘗試讀取到了記錄 A。
l 不可重複讀:是指在一個事務內,屢次讀同一數據。
l 幻讀:指同一個事務內屢次查詢返回的結果集不同。好比同一個事務 A 第一次查詢時候有 n 條記錄,可是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺。發生幻讀的緣由也是另一個事務新增或者刪除或者修改了第一個事務結果集裏面的數據,同一個記錄的數據內容被修改了,全部數據行的記錄就變多或者變少了
100.說一下 spring mvc 運行流程?
l spring mvc 先將請求發送給 DispatcherServlet。
l DispatcherServlet 查詢一個或多個 HandlerMapping,找處處理請求的 Controller。
l DispatcherServlet 再把請求提交到對應的 Controller。
l Controller 進行業務邏輯處理後,會返回一個ModelAndView。
l Dispathcher 查詢一個或多個 ViewResolver 視圖解析器,找到 ModelAndView 對象指定的視圖對象。
l 視圖對象負責渲染返回給客戶端
101.spring mvc 有哪些組件?
l 前置控制器 DispatcherServlet
l 映射控制器 HandlerMapping
l 處理器 Controller
l 模型和視圖 ModelAndView
l 視圖解析器 ViewResolver
102.@RequestMapping 的做用是什麼?
將 http 請求映射到相應的類/方法上
103.@Autowired 的做用是什麼?
@Autowired 它能夠對類成員變量、方法及構造函數進行標註,完成自動裝配的工做,經過@Autowired 的使用來消除 set/get 方法
104.什麼是 spring boot?
Spring Boot是一個構建在Spring框架頂部的項目。它提供了一種更簡單、更快捷的方法來設置、配置和運行簡單和基於Web的應用程序。
105.爲何要用 spring boot?
l 配置簡單
l 獨立運行
l 自動裝配
l 無代碼生成和 xml 配置
l 提供應用監控
l 易上手
l 提高開發效率
106.spring boot 核心配置文件是什麼?
spring boot 核心的兩個配置文件:
l bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加載的,比 applicaton 優先加載,且 boostrap 裏面的屬性不能被覆蓋
l application (. yml 或者 . properties):用於 spring boot 項目的自動化配置
107.spring boot 配置文件有哪幾種類型?它們有什麼區別?
配置文件有 . properties 格式和 . yml 格式,它們主要的區別是書法風格不一樣。
. properties 配置以下:
spring. RabbitMQ. port=5672
. yml 配置以下:
spring:
RabbitMQ:
port: 5672
. yml 格式不支持 @PropertySource 註解導入
108.spring boot 有哪些方式能夠實現熱部署?
l 使用 devtools 啓動熱部署,添加 devtools 庫,在配置文件中把 spring. devtools. restart. enabled 設置爲 true
l 使用 Intellij Idea 編輯器,勾上自動編譯或手動從新編譯
109.jpa 和 hibernate 有什麼區別?
jpa 全稱 Java Persistence API,是 Java 持久化接口規範,hibernate 屬於 jpa 的具體實現。
110.什麼是 spring cloud?
spring cloud 是一系列框架的有序集合。它利用 spring boot 的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,均可以用 spring boot 的開發風格作到一鍵啓動和部署
111.spring cloud 斷路器的做用是什麼?
在分佈式架構中,斷路器模式的做用也是相似的,當某個服務單元發生故障(相似用電器發生短路)以後,經過斷路器的故障監控(相似熔斷保險絲),向調用方返回一個錯誤響應,而不是長時間的等待。這樣就不會使得線程因調用故障服務被長時間佔用不釋放,避免了故障在分佈式系統中的蔓延
112.spring cloud 的核心組件有哪些?
l Eureka:服務註冊於發現
l Feign:基於動態代理機制,根據註解和選擇的機器,拼接請求 url 地址,發起請求
l Ribbon:實現負載均衡,從一個服務的多臺機器中選擇一臺
l Hystrix:提供線程池,不一樣的服務走不一樣的線程池,實現了不一樣服務調用的隔離,避免了服務雪崩的問題
l Zuul:網關管理,由 Zuul 網關轉發請求給對應的服務
113.爲何要使用 hibernate?
114.什麼是 ORM 框架?
115.hibernate 中如何在控制檯查看打印的 sql 語句?
116.hibernate 有幾種查詢方式?
117.hibernate 實體類能夠被定義爲 final 嗎?
118.在 hibernate 中使用 Integer 和 int 作映射有什麼區別?
119.hibernate 是如何工做的?
120.get()和 load()的區別?
121.說一下 hibernate 的緩存機制?
122.hibernate 對象有哪些狀態?
123.在 hibernate 中 getCurrentSession 和 openSession 的區別是什麼?
124.hibernate 實體類必需要有無參構造函數嗎?爲何?
125.mybatis 中 #{}和 ${}的區別是什麼?
l #{} 獲取參數的內容支持 索引獲取,param1 獲取指定位置參數, 而且 SQL 使用?佔位符
l ${} 字符串拼接不使用?,默認找${內容}內容的 get/set 方法,如 果寫數字,就是一個數字
126.mybatis 有幾種分頁方式?(4種)
http://www.javashuo.com/article/p-ajixgtna-dk.html
127.RowBounds 是一次性查詢所有結果嗎?爲何?
oracle 數據庫,查詢增長RowBounds限制查詢條數,默認是0到1000條
128.mybatis 邏輯分頁和物理分頁的區別是什麼?
邏輯分頁:內存開銷比較大,在數據量比較小的狀況下效率比物理分頁高;在數據量很大的狀況下,內存開銷過大,容易內存溢出,不建議使用
物理分頁:內存開銷比較小,在數據量比較小的狀況下效率比邏輯分頁仍是低,在數據量很大的狀況下,建議使用物理分頁
129.mybatis 是否支持延遲加載?延遲加載的原理是什麼?
http://www.javashuo.com/article/p-qlkugbfa-ca.html
130.說一下 mybatis 的一級緩存和二級緩存?
一級緩存:
l 同一個 SqlSession 對象調用同一個<select>時,只有第一次訪問
l 數據庫,第一次以後把查詢結果緩存到 SqlSession 緩存區(內存)中
l 緩存的是 statement 對象.(簡單記憶必須是用一個<select>)
l 在 myabtis 時一個<select>對應一個 statement 對象
l 有效範圍必須是同一個 SqlSession 對象
二級緩存:
SqlSessionFactory 緩存
5.1 又叫:二級緩存
5.2 有效範圍:同一個 factory 內哪一個 SqlSession 均可以獲取
5.3 何時使用二級緩存:
5.3.1 當數據頻繁被使用,不多被修改
5.4 使用二級緩存步驟
5.4.1 在 mapper.xml 中添加
5.4.2 若是不寫 readOnly=」true」須要把實體類序列化
5.5 當 SqlSession 對象 close()時或 commit()時會把 SqlSession 緩存 的數據刷(flush)到 SqlSessionFactory 緩存區中
131.mybatis 和 hibernate 的區別有哪些?
http://www.javashuo.com/article/p-aolcpyvz-bv.html
2.1 開發方面
在項目開發過程中,就速度而言:
hibernate開發中,sql語句已經被封裝,直接能夠使用,加快系統開發;
Mybatis 屬於半自動化,sql須要手工完成,稍微繁瑣;
可是,凡事都不是絕對的,若是對於龐大複雜的系統項目來講,發雜語句較多,選擇hibernate 就不是一個好方案。
2.2 sql優化方面
Hibernate 自動生成sql,有些語句較爲繁瑣,會多消耗一些性能;
Mybatis 手動編寫sql,能夠避免不須要的查詢,提升系統性能;
2.3 對象管理比對
Hibernate 是完整的對象-關係映射的框架,開發工程中,無需過多關注底層實現,只要去管理對象便可;
Mybatis 須要自行管理映射關係;
2.4 緩存方面
相同點: Hibernate和Mybatis的二級緩存除了採用系統默認的緩存機制外,均可以經過實現你本身的緩存或爲其餘第三方緩 存方案,建立適配器來徹底覆蓋緩存行爲。 不一樣點: Hibernate的二級緩存配置在SessionFactory生成的配置文件中進行詳細配置,而後再在具體的表-對象映射中配置是那種緩存。 MyBatis的二級緩存配置都是在每一個具體的表-對象映射中進行詳細配置,這樣針對不一樣的表能夠自定義不一樣的緩存機制。而且Mybatis能夠在命名空間中共享相同的緩存配置和實例,經過Cache-ref來實現。 |
比較:
Hibernate 具備良好的管理機制,用戶不須要關注SQL,若是二級緩存出現髒數據,系統會保存,;
Mybatis 在使用的時候要謹慎,避免緩存CAche 的使用。
1. Hibernate的DAO層開發比MyBatis簡單,Mybatis須要維護SQL和結果映射。
2. Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。
3. Hibernate數據庫移植性很好,MyBatis的數據庫移植性很差,不一樣的數據庫須要寫不一樣SQL。
4. Hibernate有更好的二級緩存機制,能夠使用第三方緩存。MyBatis自己提供的緩存機制不佳。
1. MyBatis能夠進行更爲細緻的SQL優化,能夠減小查詢字段。
2. MyBatis容易掌握,而Hibernate門檻較高。
Mybatis:小巧、方便、高效、簡單、直接、半自動化
Hibernate:強大、方便、高效、複雜、間接、全自動化
132.mybatis 有哪些執行器(Executor)?
SimpleExecutor:每執行一次update或select,就開啓一個Statement對象,用完馬上關閉Statement對象。
ReuseExecutor:執行update或select,以sql做爲key查找Statement對象,存在就使用,不存在就建立,用完後,不關閉Statement對象,而是放置於Map內,供下一次使用。簡言之,就是重複使用Statement對象。
BatchExecutor:執行update(沒有select,JDBC批處理不支持select),將全部sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每一個Statement對象都是addBatch()完畢後,等待逐一執行executeBatch()批處理。與JDBC批處理相同。
做用範圍:Executor的這些特色,都嚴格限制在SqlSession生命週期範圍內。
Mybatis中如何指定使用哪種Executor執行器?
答:在Mybatis配置文件中,能夠指定默認的ExecutorType執行器類型,也能夠手動給DefaultSqlSessionFactory的建立SqlSession的方法傳遞ExecutorType類型參數。
133.mybatis 分頁插件的實現原理是什麼?
https://www.jianshu.com/p/eed3f2e24b83
1. SQL 分頁
<select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper">
select * from student limit #{currIndex} , #{pageSize}
</select>
2. 使用攔截器分頁
建立攔截器,攔截mybatis接口方法id以ByPage結束的語句
String sql = (String) MetaObjectHandler.getValue("delegate.boundSql.sql");
//也能夠經過statementHandler直接獲取
//sql = statementHandler.getBoundSql().getSql();
//構建分頁功能的sql語句
String limitSql;
sql = sql.trim();
limitSql = sql + " limit " + (currPage - 1) * pageSize + "," + pageSize;
//將構建完成的分頁sql語句賦值個體'delegate.boundSql.sql',偷天換日 MetaObjectHandler.setValue("delegate.boundSql.sql", limitSql);
<configuration>
<plugins>
<plugin interceptor="com.autumn.interceptor.MyPageInterceptor">
<property name="limit" value="10"/>
<property name="dbType" value="mysql"/>
</plugin>
</plugins>
</configuration>
經過自定義插件的形式實現分頁,也是最好的,也叫作分頁攔截器。實現步驟以下:
插件支持MySQL和Oracle兩種數據庫,經過方法名關鍵字ListPage去匹配,有才進行分頁處理,而且不用在Mapping中寫分頁代碼。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="PageInfo" type="com.jsoft.testmybatis.util.PageInfo" />
</typeAliases>
<plugins>
<plugin interceptor="com.jsoft.testmybatis.util.PagePlugin">
<property name="dialect" value="mysql" />
<property name="pageSqlId" value=".*ListPage.*" />
</plugin>
</plugins>
</configuration>
3. RowBounds分頁
Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁,能夠在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也能夠使用分頁插件來完成物理分頁。
數據量小時,RowBounds不失爲一種好辦法。可是數據量大時,實現攔截器就頗有必要了。
mybatis接口加入RowBounds參數
(1)Dao:
public List queryUsersByPage(String userName, RowBounds rowBounds);
(2)Service:
@Override
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS)
publicList queryRolesByPage(String roleName,intstart,int limit) {
returnroleDao.queryRolesByPage(roleName,new RowBounds(start, limit));
}
分頁插件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,而後重寫sql,根據dialect方言,添加對應的物理分頁語句和物理分頁參數。
舉例:select * from student,攔截sql後重寫爲:select t.* from (select * from student)t limit 0,10
134.mybatis 如何編寫一個自定義插件?
http://www.javashuo.com/article/p-aubwqooz-cy.html
十4、RabbitMQ
135.rabbitmq 的使用場景有哪些?
136.rabbitmq 有哪些重要的角色?
137.rabbitmq 有哪些重要的組件?
138.rabbitmq 中 vhost 的做用是什麼?
139.rabbitmq 的消息是怎麼發送的?
140.rabbitmq 怎麼保證消息的穩定性?
141.rabbitmq 怎麼避免消息丟失?
142.要保證消息持久化成功的條件有哪些?
143.rabbitmq 持久化有什麼缺點?
144.rabbitmq 有幾種廣播類型?
145.rabbitmq 怎麼實現延遲消息隊列?
146.rabbitmq 集羣有什麼用?
147.rabbitmq 節點的類型有哪些?
148.rabbitmq 集羣搭建須要注意哪些問題?
149.rabbitmq 每一個節點是其餘節點的完整拷貝嗎?爲何?
150.rabbitmq 集羣中惟一一個磁盤節點崩潰了會發生什麼狀況?
151.rabbitmq 對集羣節點中止順序有要求嗎?
十5、Kafka
152.kafka 能夠脫離 zookeeper 單獨使用嗎?爲何?
kafka使用ZooKeeper用於管理、協調代理。每一個Kafka代理經過Zookeeper協調其餘Kafka代理。
當Kafka系統中新增了代理或某個代理失效時,Zookeeper服務將通知生產者和消費者。生產者與消費者據此開始與其餘代理協調工做。
Zookeeper在Kakfa中扮演的角色:Kafka將元數據信息保存在Zookeeper中,可是發送給Topic自己的數據是不會發到Zk上的
kafka使用zookeeper來實現動態的集羣擴展,不須要更改客戶端(producer和consumer)的配置。broker會在zookeeper註冊並保持相關的元數據(topic,partition信息等)更新。
n 而客戶端會在zookeeper上註冊相關的watcher。一旦zookeeper發生變化,客戶端能及時感知並做出相應調整。這樣就保證了添加或去除broker時,各broker間仍能自動實現負載均衡。這裏的客戶端指的是Kafka的消息生產端(Producer)和消息消費端(Consumer)
n Broker端使用zookeeper來註冊broker信息,以及監測partitionleader存活性.
n Consumer端使用zookeeper用來註冊consumer信息,其中包括consumer消費的partition列表等,同時也用來發現broker列表,並和partitionleader創建socket鏈接,並獲取消息.
n Zookeer和Producer沒有創建關係,只和Brokers、Consumers創建關係以實現負載均衡,即同一個ConsumerGroup中的Consumers能夠實現負載均衡(由於Producer是瞬態的,能夠發送後關閉,無需直接等待)
153.kafka 有幾種數據保留的策略?
154.kafka 同時設置了 7 天和 10G 清除數據,到第五天的時候消息達到了 10G,這個時候 kafka 將如何處理?
155.什麼狀況會致使 kafka 運行變慢?
156.使用 kafka 集羣須要注意什麼?
十6、Zookeeper
157.zookeeper 是什麼?
ZooKeeper由雅虎研究院開發,是Google Chubby的開源實現,後來託管到Apache,於2010年11月正式成爲Apache的頂級項目。
ZooKeeper是一個經典的分佈式數據一致性解決方案,致力於爲分佈式應用提供一個高性能、高可用,且具備嚴格順序訪問控制能力的分佈式協調服務。
分佈式應用程序能夠基於ZooKeeper實現數據發佈與訂閱、負載均衡、命名服務、分佈式協調與通知、集羣管理、Leader選舉、分佈式鎖、分佈式隊列等功能。
https://blog.csdn.net/lipinganq/article/details/81029499
158.zookeeper 都有哪些功能?
159.zookeeper 有幾種部署模式?
160.zookeeper 怎麼保證主從節點的狀態同步?
161.集羣中爲何要有主節點?
162.集羣中有 3 臺服務器,其中一個節點宕機,這個時候 zookeeper 還能夠使用嗎?
163.說一下 zookeeper 的通知機制?
164.數據庫的三範式是什麼?
l 第一範式:強調的是列的原子性,即數據庫表的每一列都是不可分割的原子數據項。
l 第二範式:要求實體的屬性徹底依賴於主關鍵字。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性。
l 第三範式:任何非主屬性不依賴於其它非主屬性。
165.一張自增表裏面總共有 7 條數據,刪除了最後 2 條數據,重啓 mysql 數據庫,又插入了一條數據,此時 id 是幾?
l 表類型若是是 MyISAM ,那 id 就是 8。
l 表類型若是是 InnoDB,那 id 就是 6。
166.如何獲取當前數據庫版本?
使用 select version() 獲取當前 MySQL 數據庫版本。
select version()
167.說一下 ACID 是什麼?
l Atomicity(原子性):一個事務(transaction)中的全部操做,或者所有完成,或者所有不完成,不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被恢復(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。即,事務不可分割、不可約簡。
l Consistency(一致性):在事務開始以前和事務結束之後,數據庫的完整性沒有被破壞。這表示寫入的資料必須徹底符合全部的預設約束、觸發器、級聯回滾等。
l Isolation(隔離性):數據庫容許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性能夠防止多個事務併發執行時因爲交叉執行而致使數據的不一致。事務隔離分爲不一樣級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
l Durability(持久性):事務處理結束後,對數據的修改就是永久的,即使系統故障也不會丟失。
168.char 和 varchar 的區別是什麼?
u char(n) :固定長度類型,好比訂閱 char(10),當你輸入"abc"三個字符的時候,它們佔的空間仍是 10 個字節,其餘 7 個是空字節。
u chat 優勢:效率高;缺點:佔用空間;適用場景:存儲密碼的 md5 值,固定長度的,使用 char 很是合適。
u varchar(n) :可變長度,存儲的值是每一個值佔用的字節再加上一個用來記錄其長度的字節的長度。
u 因此,從空間上考慮 varcahr 比較合適;從效率上考慮 char 比較合適,兩者使用須要權衡
169.float 和 double 的區別是什麼?
u float 最多能夠存儲 8 位的十進制數,並在內存中佔 4 字節。
u double 最可能夠存儲 16 位的十進制數,並在內存中佔 8 字節。
170.mysql 的內鏈接、左鏈接、右鏈接有什麼區別?
內鏈接關鍵字:inner join;左鏈接:left join;右鏈接:right join。內鏈接是把匹配的關聯數據顯示出來;左鏈接是左邊的表所有顯示出來,右邊的表顯示出符合條件的數據;右鏈接正好相反
171.mysql 索引是怎麼實現的?
索引是知足某種特定查找算法的數據結構,而這些數據結構會以某種方式指向數據,從而實現高效查找數據。具體來講 MySQL 中的索引,不一樣的數據引擎實現有所不一樣,但目前主流的數據庫引擎的索引都是 B+ 樹實現的,B+ 樹的搜索效率,能夠到達二分法的性能,找到數據區域以後就找到了完整的數據結構了,全部索引的性能也是更好的
172.怎麼驗證 mysql 的索引是否知足需求?
使用 explain 查看 SQL 是如何執行查詢語句的,從而分析你的索引是否知足需求。
explain 語法:
explain select*fromtablewhere type=1
173.說一下數據庫的事務隔離?
MySQL 的事務隔離是在 MySQL. ini 配置文件裏添加的,在文件的最後添加:
transaction-isolation=REPEATABLE-READ
可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。
u READ-UNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其餘事務讀取(會出現幻讀、髒讀、不可重複讀)。
u READ-COMMITTED:提交讀,一個事務提交後才能被其餘事務讀取到(會形成幻讀、不可重複讀)。
u REPEATABLE-READ:可重複讀,默認級別,保證屢次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(會形成幻讀)。
u SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止髒讀、不可重複讀、幻讀。
髒讀:表示一個事務可以讀取另外一個事務中還未提交的數據。好比,某個事務嘗試插入記錄 A,此時該事務還未提交,而後另外一個事務嘗試讀取到了記錄 A。
不可重複讀:是指在一個事務內,屢次讀同一數據。
幻讀:指同一個事務內屢次查詢返回的結果集不同。好比同一個事務 A 第一次查詢時候有 n 條記錄,可是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺。發生幻讀的緣由也是另一個事務新增或者刪除或者修改了第一個事務結果集裏面的數據,同一個記錄的數據內容被修改了,全部數據行的記錄就變多或者變少了
174.說一下 mysql 經常使用的引擎?
l InnoDB 引擎:InnoDB 引擎提供了對數據庫 acid 事務的支持,而且還提供了行級鎖和外鍵的約束,它的設計的目標就是處理大數據容量的數據庫系統。MySQL 運行的時候,InnoDB 會在內存中創建緩衝池,用於緩衝數據和索引。可是該引擎是不支持全文搜索,同時啓動也比較的慢,它是不會保存表的行數的,因此當進行 select count(*) from table 指令的時候,須要進行掃描全表。因爲鎖的粒度小,寫操做是不會鎖定全表的,因此在併發度較高的場景下使用會提高效率
l MyIASM 引擎:MySQL 的默認引擎,但不提供事務的支持,也不支持行級鎖和外鍵。所以當執行插入和更新語句時,即執行寫操做的時候須要鎖定這個表,因此會致使效率會下降。不過和 InnoDB 不一樣的是,MyIASM 引擎是保存了表的行數,因而當進行 select count(*) from table 語句時,能夠直接的讀取已經保存的值而不須要進行掃描全表。因此,若是表的讀操做遠遠多於寫操做時,而且不須要事務的支持的,能夠將 MyIASM 做爲數據庫引擎的首選
175.說一下 mysql 的行鎖和表鎖?
MyISAM 只支持表鎖,InnoDB 支持表鎖和行鎖,默認爲行鎖
表級鎖:開銷小,加鎖快,不會出現死鎖。鎖定粒度大,發生鎖衝突的機率最高,併發量最低
行級鎖:開銷大,加鎖慢,會出現死鎖。鎖力度小,發生鎖衝突的機率小,併發度最高
176.說一下樂觀鎖和悲觀鎖?
l 樂觀鎖:每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在提交更新的時候會判斷一下在此期間別人有沒有去更新這個數據
l 悲觀鎖:每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻止,直到這個鎖被釋放
u 數據庫的樂觀鎖須要本身實現,在表裏面添加一個 version 字段,每次修改爲功值加 1,這樣每次修改的時候先對比一下,本身擁有的 version 和數據庫如今的 version 是否一致,若是不一致就不修改,這樣就實現了樂觀鎖
177.mysql 問題排查都有哪些手段?
· 使用 show processlist 命令查看當前全部鏈接信息
· 使用 explain 命令查詢 SQL 語句執行計劃
· 開啓慢查詢日誌,查看慢查詢的 SQL
178.如何作 mysql 的性能優化?
· 爲搜索字段建立索引
· 避免使用 select *,列出須要查詢的字段
· 垂直分割分表
· 選擇正確的存儲引擎
179.redis 是什麼?都有哪些使用場景?
Redis是一個開源的 key—value型單線程數據庫,支持string、list、set、zset和hash類型數據。
默認端口:6379
默認數據庫數量:16
2、優勢:
1.nosql數據庫沒有關聯關係,數據結構簡單,拓展表比較容易
2.nosql讀取速度快,對較大數據處理快
3、適用場景:
1.數據高併發的讀寫
2.海量數據的讀寫
對擴展性要求高的數據
4、不適場景:
1.須要事務支持(非關係型數據庫)
2.基於sql結構化查詢儲存,關係複雜
5、應用場景
1.取最新N個數據的操做
好比典型的取你網站的最新文章,經過下面方式,咱們能夠將最新的5000條評論的ID放在Redis的List集合中,並將超出集合部分從數據庫獲取
· 使用LPUSH latest.comments<ID>命令,向list集合中插入數據
· 插入完成後再用LTRIM latest.comments 0 5000命令使其永遠只保存最近5000個ID
· 而後咱們在客戶端獲取某一頁評論時能夠用下面的邏輯(僞代碼)
2.排行榜應用,取TOP N操做
這個需求與上面需求的不一樣之處在於,前面操做以時間爲權重,這個是以某個條件爲權重,好比按頂的次數排序,這時候就須要咱們的sorted set出馬了,將你要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只須要執行一條ZADD命令便可。
3.須要精準設定過時時間的應用
好比你能夠把上面說到的sorted set的score值設置成過時時間的時間戳,那麼就能夠簡單地經過過時時間排序,定時清除過時數據了,不只是清除Redis中的過時數據,你徹底能夠把Redis裏這個過時時間當成是對數據庫中數據的索引,用Redis來找出哪些數據須要過時刪除,而後再精準地從數據庫中刪除相應的記錄。
4.計數器應用
Redis的命令都是原子性的,你能夠輕鬆地利用INCR,DECR命令來構建計數器系統。
5.Uniq操做,獲取某段時間全部數據排重值
這個使用Redis的set數據結構最合適了,只須要不斷地將數據往set中扔就好了,set意爲集合,因此會自動排重。
6.實時系統,反垃圾系統
經過上面說到的set功能,你能夠知道一個終端用戶是否進行了某個操做,能夠找到其操做的集合並進行分析統計對比等。沒有作不到,只有想不到。
7.Pub/Sub構建實時消息系統
Redis的Pub/Sub系統能夠構建實時的消息系統,好比不少用Pub/Sub構建的實時聊天系統的例子。
8.構建隊列系統
使用list能夠構建隊列系統,使用sorted set甚至能夠構建有優先級的隊列系統。
180.redis 有哪些功能?
https://blog.csdn.net/u010963948/article/details/79589710
181.redis 和 memecache 有什麼區別?
1)、存儲方式 Memecache把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小。 Redis有部份存在硬盤上,這樣能保證數據的持久性。
2)、數據支持類型 Memcache對數據類型支持相對簡單。 Redis有複雜的數據類型。
3)、使用底層模型不一樣它們之間底層實現方式以及與客戶端之間通訊的應用協議不同。 Redis直接本身構建了VM 機制,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。
182.redis 爲何是單線程的?
redis 核心就是若是個人數據全都在內存裏,我單線程的去操做就是效率最高的,爲何呢,由於多線程的本質就是 CPU 模擬出來多個線程的狀況,這種模擬出來的狀況就有一個代價,就是上下文的切換,對於一個內存的系統來講,它沒有上下文的切換就是效率最高的。redis 用單個CPU 綁定一塊內存的數據,而後針對這塊內存的數據進行屢次讀寫的時候,都是在一個CPU上完成的,因此它是單線程處理這個事。在內存的狀況下,這個方案就是最佳方案 .
183.什麼是緩存穿透?怎麼解決?
https://www.jianshu.com/p/400dd82389b4?from=groupmessage
184.redis 支持的數據類型有哪些?
Redis支持五種數據類型:
string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。
185.redis 支持的 java 客戶端都有哪些?
Redisson,Jedis,lettuce等等,官方推薦使用Redisson。
186.jedis 和 redisson 有哪些區別?
Jedis 和 Redisson 都是Java中對Redis操做的封裝。Jedis 只是簡單的封裝了 Redis 的API庫,能夠看做是Redis客戶端,它的方法和Redis 的命令很相似。Redisson 不只封裝了 redis ,還封裝了對更多數據結構的支持,以及鎖等功能,相比於Jedis 更加大。但Jedis相比於Redisson 更原生一些,更靈活。
Redis官方對Java 語言的封裝框架推薦的有十多種(Redis 官網),主要是Jedis 、Redisson。
187.怎麼保證緩存和數據庫數據的一致性?
https://blog.csdn.net/qq_28740207/article/details/80877079
188.redis 持久化有幾種方式?
http://www.javashuo.com/article/p-rxipfaem-cp.html
189.redis 怎麼實現分佈式鎖?
http://www.javashuo.com/article/p-bzdaslnp-eh.html
190.redis 分佈式鎖有什麼缺陷?
https://www.jianshu.com/p/6fba984cd9bd
191.redis 如何作內存優化?
http://www.javashuo.com/article/p-zlxkszfb-ca.html
192.redis 淘汰策略有哪些?
用於解決什麼問題呢?舉個例子
1)咱們都知道技術都是衍生於問題的。那咱們就來講說用來作什麼吧。
你們能夠想一想,當咱們的物理服務內存只有8G,可是數據卻有100G,如何慢慢的放在redis中呢?再加上公司近期資金不夠,不能擴展機器怎麼辦?
2)解決上述的問題,咱們就要引出一個redis的策略,便是標題。
淘汰策略
1)voltile-lru:從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
2)volatile-ttl:從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰
3)volatile-random:從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰
4)allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
5)allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
6)no-enviction(驅逐):禁止驅逐數據
解析
使用淘汰策略是能夠把上面的問題暫時頂過去,可是會出現一系列的問題。
1.內存是騰出來了,可是這樣緩存在其中的數據卻出去了,萬一我須要再次調用緩存中的數據又怎麼解決?
2.前段時間沒有訪問的,如今火起來了,個人緩存中沒有,一下壓力進入DB怎麼辦?
3.使用上面的解決方式,會暴露出問題也是沒辦法的,畢竟魚和熊掌不可兼得。咱們得先解決當下的問題不是。上面會總結出一個詞語緩存命中率
什麼事緩存命中率?
1)命中率就是緩存裏能夠查詢到的記錄數除以數據庫裏的總記錄數。命中率越低性能越高,反之越差。(大白話就是直接去數據庫查詢而不走緩存,這樣就增大了數據庫的壓力,查詢到數據庫中的值之後再存入緩存中。)
命中率低下的緣由也有不少,例如:
1.內存不足,淘汰掉了;
2.緩存服務器宕機;
193.redis 常見的性能問題有哪些?該如何解決?
https://blog.csdn.net/u011516796/article/details/50762573
194.說一下 jvm 的主要組成部分?及其做用?
· 類加載器(ClassLoader)
· 運行時數據區(Runtime Data Area)
· 執行引擎(Execution Engine)
· 本地庫接口(Native Interface)
組件的做用:首先經過類加載器(ClassLoader)會把 Java 代碼轉換成字節碼,運行時數據區(Runtime Data Area)再把字節碼加載到內存中,而字節碼文件只是 JVM 的一套指令集規範,並不能直接交個底層操做系統去執行,所以須要特定的命令解析器執行引擎(Execution Engine),將字節碼翻譯成底層系統指令,再交由 CPU 去執行,而這個過程當中須要調用其餘語言的本地庫接口(Native Interface)來實現整個程序的功能
195.說一下 jvm 運行時數據區?
不一樣虛擬機的運行時數據區可能略微有所不一樣,但都會聽從 Java 虛擬機規範, Java 虛擬機規範規定的區域分爲如下 5 個部分:
l 程序計數器(Program Counter Register):當前線程所執行的字節碼的行號指示器,字節碼解析器的工做是經過改變這個計數器的值,來選取下一條須要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能,都須要依賴這個計數器來完成
l Java 虛擬機棧(Java Virtual Machine Stacks):用於存儲局部變量表、操做數棧、動態連接、方法出口等信息
l 本地方法棧(Native Method Stack):與虛擬機棧的做用是同樣的,只不過虛擬機棧是服務 Java 方法的,而本地方法棧是爲虛擬機調用 Native 方法服務的
l Java 堆(Java Heap):Java 虛擬機中內存最大的一塊,是被全部線程共享的,幾乎全部的對象實例都在這裏分配內存
l 方法區(Methed Area):用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯後的代碼等數據
196.說一下堆棧的區別?
· 功能方面:堆是用來存放對象的,棧是用來執行程序的
· 共享性:堆是線程共享的,棧是線程私有的
· 空間大小:堆大小遠遠大於棧
197.隊列和棧是什麼?有什麼區別?
· 隊列和棧都是被用來預存儲數據的。
· 隊列容許先進先出檢索元素,但也有例外的狀況,Deque 接口容許從兩端檢索元素。
· 棧和隊列很類似,但它運行對元素進行後進先出進行檢索
198.什麼是雙親委派模型?
在介紹雙親委派模型以前先說下類加載器。對於任意一個類,都須要由加載它的類加載器和這個類自己一同確立在 JVM 中的惟一性,每個類加載器,都有一個獨立的類名稱空間。類加載器就是根據指定全限定名稱將 class 文件加載到 JVM 內存,而後再轉化爲 class 對象。
類加載器分類:
l 啓動類加載器(Bootstrap ClassLoader),是虛擬機自身的一部分,用來加載Java_HOME/lib/目錄中的,或者被 -Xbootclasspath 參數所指定的路徑中而且被虛擬機識別的類庫
l 其餘類加載器:
l 擴展類加載器(Extension ClassLoader):負責加載\lib\ext目錄或Java. ext. dirs系統變量指定的路徑中的全部類庫
l 應用程序類加載器(Application ClassLoader)。負責加載用戶類路徑(classpath)上的指定類庫,咱們能夠直接使用這個類加載器。通常狀況,若是咱們沒有自定義類加載器默認就是用這個加載器
雙親委派模型:若是一個類加載器收到了類加載的請求,它首先不會本身去加載這個類,而是把這個請求委派給父類加載器去完成,每一層的類加載器都是如此,這樣全部的加載請求都會被傳送到頂層的啓動類加載器中,只有當父加載沒法完成加載請求(它的搜索範圍中沒找到所需的類)時,子加載器纔會嘗試去加載類