面試:第六章:面試題收集

//面向?qū)ο螅?br>面向?qū)ο蟮奶卣鳎?抽象性 2繼承 3封裝 4多態(tài)性
多態(tài)性的四種體現(xiàn):1接口和接口的繼承 2類和類的繼承 3重載 4重寫
重載在同一個類里同名形參列表不同,重寫在實現(xiàn)類里面。

jvm:是Java Virtual Machine(Java虛擬機)的縮寫,是整個Java實現(xiàn)跨平臺的最核心的部分。JVM是Java平臺的基礎。
所有Java程序先編譯為.class文件。
內(nèi)存泄露與溢出的區(qū)別:
1內(nèi)存泄露是指被分配出去的內(nèi)存無法收回了。
2內(nèi)存溢出是指程序要求的內(nèi)存超過了系統(tǒng)所能分配的范圍。
3內(nèi)存溢出是提供的內(nèi)存不夠,內(nèi)存泄漏是無法在提供內(nèi)存資源。

GC線程是守護線程
GC是不確定的,當監(jiān)控的對象確定為不可達時就有責任回收,但并不保證一定會運行。
Java理論上不會存在內(nèi)存泄漏。
伊甸園,對象最初誕生的區(qū)域。
幸存者樂園,從伊甸園幸存的對象會挪到這里。
終生頤養(yǎng)園,足夠老的幸存對象的歸宿。

什么是JVM,什么是JDK,什么是JRE
JVM:Java Virtual Machine(Java虛擬機的縮寫)
JRE:java runtime environment(Java運行環(huán)境的縮寫)光有JVM還不能讓class文件執(zhí)行,還需要類庫lib。
可以認為JDK目錄里面jre目錄里有兩個文件夾,可以認為bin就是jvm,lib就是所需的類庫。jvm和類庫lib合起來就是JRE
JDK:java development kit(java開發(fā)工具包)
JDK包含JRE,JRE包含JVM。

Java程序從源文件創(chuàng)建到程序運行要經(jīng)過兩大步驟:1、源文件由編譯器編譯成字節(jié)碼(ByteCode)  2、字節(jié)碼由java虛擬機解釋運行

JVM中類的加載是由ClassLoader和它的子類來實現(xiàn)的,Java ClassLoader是一個很重要的JAVA運行時系統(tǒng)組件。它負責在運行時查找和裝入類文件的類。

雙親委派機制,ClassLoader類加載器用來加載類到虛擬機中,java文件經(jīng)過編譯器編譯后轉換成java.lang.Class類的一個實例。
某個特定的類加載器在接到加載類的請求時,首先將加載任務委托給父類加載器,依次遞歸,如果可以完成成功返回,無法完成才自己去加載。

多線程與鎖的問題:
實現(xiàn)多線程的方法有四種:1繼承Thread類 2實現(xiàn)Runnable接口 3實現(xiàn)Callable接口通過FutrueTask包裝器來創(chuàng)建Thread線程 4線程池比如ExectorService。

樂觀鎖和悲觀鎖
樂觀鎖:取數(shù)據(jù)的時候默認沒有其他人去跟新這個數(shù)據(jù),不會上鎖,提高吞吐量。
悲觀鎖:默認上鎖,如果數(shù)據(jù)間經(jīng)常沖突就比較適合。

臟讀就是指當一個事務正在訪問數(shù)據(jù),并且對數(shù)據(jù)進行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時,另外一個事務也訪問這個數(shù)據(jù),然后使用了這
個數(shù)據(jù)。因為這個數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另外一個事務讀到的這個數(shù)據(jù)是臟數(shù)據(jù)(Dirty Data),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。

不可重復讀是指在一個事務內(nèi),多次讀同一數(shù)據(jù)。在這個事務還沒有結束時,另外一個事務也訪問該同一數(shù)據(jù)。那么,在第一個事務中的兩次讀數(shù)據(jù)之間,由于第二個事務的修改,那么第一個事務兩次讀到的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個事務內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復讀。

抽象類(abstract class)和接口(interface)有什么異同?
抽象類:
1.抽象類中可以定義構造器
2.可以有抽象方法和具體方法
3.接口中的成員全都是public的
4.抽象類中可以定義成員變量
5.有抽象方法的類必須被聲明為抽象類,而抽象類未必要有抽象方法
6.抽象類中可以包含靜態(tài)方法
7.一個類只能繼承一個抽象類
接口:
1.接口中不能定義構造器
2.方法全部都是抽象方法
3.抽象類中的成員可以是 private、默認、protected、public
4.接口中定義的成員變量實際上都是常量
5.接口中不能有靜態(tài)方法
6.一個類可以實現(xiàn)多個接口
相同:
1.不能夠?qū)嵗?br>2.可以將抽象類和接口類型作為引用類型
3.一個類如果繼承了某個抽象類或者實現(xiàn)了某個接口都需要對其中的抽象方法全部進行實現(xiàn),否則該類仍然需要
被聲明為抽象類

 闡述靜態(tài)變量和實例變量的區(qū)別?
靜態(tài)變量: 是被 static 修飾符修飾的變量,也稱為類變量,它屬于類,不屬于類的任何一個對象,一個類不管創(chuàng)建多少個對象,靜態(tài)變量在內(nèi)存中有且僅有一個拷貝;
實例變量: 必須依存于某一實例,需要先創(chuàng)建對象然后通過對象才能訪問到它。靜態(tài)變量可以實現(xiàn)讓多個對
象共享內(nèi)存。

==和equals的區(qū)別?
equals和== 最大的區(qū)別是一個是方法一個是運算符。  
==:如果比較的對象是基本數(shù)據(jù)類型,則比較的是數(shù)值是否相等;如果比較的是引用數(shù)據(jù)類型,則比較的是對象
的地址值是否相等。
equals():用來比較方法兩個對象的內(nèi)容是否相等。
注意:equals 方法不能用于基本數(shù)據(jù)類型的變量,如果沒有對 equals 方法進行重寫,則比較的是引用類型的變
量所指向的對象的地址。

break和continue的區(qū)別?
break和continue都是用來控制循環(huán)的語句。
break用于完全結束一個循環(huán),跳出循環(huán)體執(zhí)行循環(huán)后面的語句。
continue用于跳過本次循環(huán),執(zhí)行下次循環(huán)。

Java中實現(xiàn)多態(tài)的機制是什么?
靠的是父類或接口定義的引用變量可以指向子類或具體實現(xiàn)類的實例對象,而程序調(diào)用的方法在運行期才動
態(tài)綁定,就是引用變量所指向的具體實例對象的方法,也就是內(nèi)存里正在運行的那個對象的方法,而不是引用變
量的類型中定義的方法。

throw和throws的區(qū)別
throw:
1)throw語句用在方法體內(nèi),表示拋出異常,由方法體內(nèi)的語句處理。
2)throw是具體向外拋出異常的動作,所以它拋出的是一個異常實例,執(zhí)行throw一定是拋出了某種異常。
throws:
1)throws語句是用在方法聲明后面,表示如果拋出異常,由該方法的調(diào)用者來進行異常的處理。
2)throws主要是聲明這個方法會拋出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。
3)throws表示出現(xiàn)異常的一種可能性,并不一定會發(fā)生這種異常。

final、finally、finalize的區(qū)別?
1)final:用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,被其修飾的類不可繼承。
2)finally:異常處理語句結構的一部分,表示總是執(zhí)行。
3)finalize:Object類的一個方法,在垃圾回收器執(zhí)行的時候會調(diào)用被回收對象的此方法,可以覆蓋此方法
提供垃圾收集時的其他資源回收,例如關閉文件等。該方法更像是一個對象生命周期的臨終方法,當該方法
被系統(tǒng)調(diào)用則代表該對象即將“死亡”,但是需要注意的是,我們主動行為上去調(diào)用該方法并不會導致該對
象“死亡”,這是一個被動的方法(其實就是回調(diào)方法),不需要我們調(diào)用。

String 、StringBuilder 、StringBuffer的區(qū)別?
Java平臺提供了兩種類型的字符串:String和StringBuffer/StringBuilder,它們都可以儲存和操作字符串,區(qū)別
如下。
1)String是只讀字符串,也就意味著String引用的字符串內(nèi)容是不能被改變的。初學者可能會有這樣的誤解: 如上,字符串str明明是可以改變的呀!其實不然,str僅僅是一個引用對象,它指向一個字符串對象“abc”。第
二行代碼的含義是讓 str 重新指向了一個新的字符串“bcd”對象,而“abc”對象并沒有任何改變,只不過該對象已
經(jīng)成為一個不可及對象罷了。
2)StringBuffer/StringBuilder 表示的字符串對象可以直接進行修改。
3)StringBuilder是Java5中引入的,它和 StringBuffer的方法完全相同,區(qū)別在于它是在單線程環(huán)境下使用的,
因為它的所有方法都沒有被synchronized修飾,因此它的效率理論上也比StringBuffer要高。

Java中有幾種類型的流
按照流的方向:輸入流(inputStream)和輸出流(outputStream)。
按照實現(xiàn)功能分:節(jié)點流(可以從或向一個特定的地方(節(jié)點)讀寫數(shù)據(jù)。如 FileReader)和處理流(是對一個
已存在的流的連接和封裝,通過所封裝的流的功能調(diào)用實現(xiàn)數(shù)據(jù)讀寫。如BufferedReader。處理流的構造方法總是要
帶一個其他的流對象做參數(shù)。一個流對象經(jīng)過其他流的多次包裝,稱為流的鏈接。)
按照處理數(shù)據(jù)的單位:字節(jié)流和字符流。字節(jié)流繼承于 InputStream 和 OutputStream,字符流繼承于
InputStreamReader 和OutputStreamWriter。

字節(jié)流和字符流的區(qū)別
字節(jié)流可以處理所有類型數(shù)
據(jù),如:圖片,MP3,AVI 視頻文件,而字符流只能處理字符數(shù)據(jù)。只要是處理純文本數(shù)據(jù),就要優(yōu)先考慮使用字符
流,除此之外都用字節(jié)流。字節(jié)流主要是操作 byte類型數(shù)據(jù),以 byte 數(shù)組為準,主要操作類就是OutputStream、
InputStream

什么是java序列化,如何實現(xiàn)java序列化?實現(xiàn) Serializable 接口
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內(nèi)容進行流化??梢詫α骰蟮膶ο筮M行讀
寫操作,也可將流化后的對象傳輸于網(wǎng)絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發(fā)的問題。

java集合類:集合類型主要有3種:set(集)、list(列表)和map(映射)。
List總結,所有的List中只能容納單個不同類型的對象組成的表,可以有相同的元素,基于Array的List(Vector,ArrayList)適合查詢,而LinkedList(鏈表)適合添加,刪除操作。
Set總結,Set實現(xiàn)的基礎是Map(HashMap);Set中的元素是不能重復的,

多線程基礎:
1繼承Thread類創(chuàng)建線程,寫run方法,然后new Thread,.start();
2實現(xiàn)Runnable接口創(chuàng)建線程,重寫run方法,new Thread,.start();
3通過Callable和FutureTask創(chuàng)建線程
4通過線程池創(chuàng)建線程
同步的實現(xiàn)方面有兩種,分別是 synchronized,wait與 notify
wait():使一個線程處于等待狀態(tài),并且釋放所持有的對象的 lock
sleep():使一個正在運行的線程處于睡眠狀態(tài),是一個靜態(tài)方法
notify():喚醒一個處于等待狀態(tài)的線程
最大的不同是在等待時wait會釋放鎖,而sleep一直持有鎖。wait通常被用于線程間交互,sleep通常被用于暫
停執(zhí)行。
線程池就是事先將多個線程對象放到一個容器中,當使用的時候就不用new線程而是直接去池中拿線程即可,節(jié)
省了開辟子線程的時間,提高的代碼執(zhí)行效率。

在有些情況下死鎖是可以避免的。兩種用于避免死鎖的技術: 加鎖順序/加鎖時限

進程就是一段程序的執(zhí)行過程,線程時進程的一個執(zhí)行單位。

啟動一個線程是調(diào)用 start()方法

說說你對Java中反射的理解
反射機制指的是程序在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法。

動態(tài)代理(以下稱代理),利用Java的反射技術(Java Reflection),在運行時創(chuàng)建一個實現(xiàn)某些給定接口的新類(也稱“動態(tài)代理類”)及其實例(對象)
代理的是接口(Interfaces),不是類(Class),更不是抽象類。
反射的官方定義是這樣的:在運行狀態(tài)中,對于任意的一個類,都能夠知道這個類的所有屬性和方法,對任意一個對象都能夠通過反射機制調(diào)用一個類的任意方法,這種動態(tài)獲取類信息及動態(tài)調(diào)用類對象方法的功能稱為java的反射機制。

設計模式有哪些 :工廠模式/單例模式
單例模式分為懶漢式和餓漢式
餓漢式直接創(chuàng)建對象,私有化構造器。懶漢式聲明變量,私有化構造器,提供對外方法。
工廠模式,建立一個工廠類,對實現(xiàn)了同一接口的一些類進行實例的創(chuàng)建。

棧stack:由系統(tǒng)自動分配,堆heap:需要程序員自己申請。
通常我們定義一個基本數(shù)據(jù)類型的變量,一個對象的引用,還有就是函數(shù)調(diào)用的現(xiàn)場保存都使用 JVM 中的???br>間;而通過new關鍵字和構造器創(chuàng)建的對象則放在堆空間

是基本類型(primitive types), 共有8種,即int, short, long, byte, float, double, boolean, char

原生jdbc操作數(shù)據(jù)庫流程?
第一步:Class.forName()加載數(shù)據(jù)庫連接驅(qū)動;
第二步:DriverManager.getConnection()獲取數(shù)據(jù)連接對象;
第三步:根據(jù)SQL獲取sql會話對象
第四步:執(zhí)行SQL處理結果集,執(zhí)行SQL前如果有參數(shù)值就設置參數(shù)值setXXX();
第五步:關閉結果集、關閉會話、關閉連接。

Http 協(xié)議 (超文本傳輸協(xié)議)
HTTP是一個客戶端和服務器端請求和應答的標準(TCP)。
由HTTP客戶端發(fā)起一個請求,建立一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器則在那個端口監(jiān)聽客戶端發(fā)送過來的請求。一旦收到請求,服務器(向客戶端)發(fā)回一個狀態(tài)行,比如"HTTP/1.1 200 OK",和(響應的)消息,消息的消息體可能是請求的文件、錯誤消息、或者其它一些信息。

同步交互:指發(fā)送一個請求,需要等待返回,然后才能夠發(fā)送下一個請求,有個等待過程;
異步交互:指發(fā)送一個請求,不需要等待返回,隨時可以再發(fā)送下一個請求,即不需要等待。 區(qū)別:一個需要等待,一個不需要等待,在部分情況下,我們的項目開發(fā)中都會優(yōu)先選擇不需要等待的異步交互方式。

http常見的狀態(tài)碼
200 OK      //客戶端請求成功
302 found 重定向
400 Bad Request  //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經(jīng)授權
403 Forbidden  //服務器收到請求,但是拒絕提供服務
404 Not Found  //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發(fā)生不可預期的錯誤
503 Server Unavailable  //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常

GET和POST的區(qū)別?
1. GET請求的數(shù)據(jù)會附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭中),以?分割URL和傳輸數(shù)據(jù),參數(shù)之間
以&相連,如:login.action?name=zhagnsan&password=123456。POST把提交的數(shù)據(jù)則放置在是HTTP包的包
體中。
2. GET方式提交的數(shù)據(jù)最多只能是1024字節(jié),理論上POST沒有限制,可傳較大量的數(shù)據(jù)。
3.POST的安全性要比GET的安全性高。

http中重定向和請求轉發(fā)的區(qū)別?
本質(zhì)區(qū)別:轉發(fā)是服務器行為,重定向是客戶端行為。
重定向兩次請求

Cookie和Session的區(qū)別
Cookie 是 web 服務器發(fā)送給瀏覽器的一塊信息,瀏覽器會在本地一個文件中給每個 web 服務器存儲 cookie。
Session 是存儲在 web 服務器端的一塊信息。

1、無論客戶端做怎樣的設置,session都能夠正常工作。當客戶端禁用cookie時將無法使用cookie。
2、在存儲的數(shù)據(jù)量方面:session能夠存儲任意的java對象,cookie只能存儲String類型的對象。

分布式如何實現(xiàn)session共享
在單點登錄中,如果cookie被禁用了怎么辦?
單點登錄的原理是后端生成一個 session ID,然后設置到 cookie,后面的所有請求瀏覽器都會帶上 cookie,
然后服務端從 cookie 里獲取 session ID,再查詢到用戶信息。所以,保持登錄的關鍵不是 cookie,而是通過
cookie 保存和傳輸?shù)?session ID,其本質(zhì)是能獲取用戶信息的數(shù)據(jù)。除了 cookie,還通常使用 HTTP 請求頭來傳
輸。但是這個請求頭瀏覽器不會像 cookie 一樣自動攜帶,需要手工處理。

什么是jsp,什么是Servlet?jsp和Servlet有什么區(qū)別?
jsp本質(zhì)上就是一個Servlet,它是Servlet的一種特殊形式(由SUN公司推出),每個jsp頁面都是一個servlet
實例。
Servlet是由 Java提供用于開發(fā) web服務器應用程序的一個組件,運行在服務端,由servlet 容器管理,用來生
成動態(tài)內(nèi)容。一個 servlet 實例是實現(xiàn)了特殊接口 Servlet 的 Java 類,所有自定義的 servlet 均必須實現(xiàn) Servlet 接
口。

區(qū)別:
jsp是html頁面中內(nèi)嵌的Java代碼,側重頁面顯示;  
Servlet是html代碼和Java代碼分離,側重邏輯控制

jsp有哪些域?qū)ο蠛蛢?nèi)置對象及他們的作用?
內(nèi)置對象:page/exception/application/pagecontext/session/config/request/response
四大域?qū)ο螅?br>(1)pageContext  page域-指當前頁面,在當前jsp頁面有效,跳到其它頁面失效
(2)request request域-指一次請求范圍內(nèi)有效,從http請求到服務器處理結束,返回響應的整個過程。
在這個過程中使用forward(請求轉發(fā))方式跳轉多個jsp,在這些頁面里你都可以使用這個變量
(3)session session域-指當前會話有效范圍,瀏覽器從打開到關閉過程中,轉發(fā)、重定向均可以使用
(4)application context域-指只能在同一個web中使用,服務器未關閉或者重啟,數(shù)據(jù)就有效

什么是xml,使用xml的優(yōu)缺點,xml的解析器有哪幾種,分別有什么區(qū)別?
xml是一種可擴展性標記語言,支持自定義標簽
優(yōu)點:用于配置文件,格式統(tǒng)一,符合標準
缺點:xml文件格式復雜,數(shù)據(jù)傳輸占流量

Xml常用解析器有2種,分別是:DOM和SAX;

Ajax是一種創(chuàng)建交互式網(wǎng)頁應用的的網(wǎng)頁開發(fā)技術;Asynchronous JavaScript and XML”的縮寫。
Ajax的優(yōu)勢:
通過異步模式,提升了用戶體驗。
優(yōu)化了瀏覽器和服務器之間的傳輸,減少不必要的數(shù)據(jù)往返,減少了帶寬占用。
Ajax引擎在客戶端運行,承擔了一部分本來由服務器承擔的工作,從而減少了大用戶量下的服務器負載。
Ajax的最大特點:
可以實現(xiàn)局部刷新,在不更新整個頁面的前提下維護數(shù)據(jù),提升用戶體驗度。

jsonp原理
JavaScript是一種在Web開發(fā)中經(jīng)常使用的前端動態(tài)腳本技術。在JavaScript中,有一個很重要的安全性限制,
被稱為“Same-Origin Policy”(同源策略)。這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的
限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。

jsonp 的最基本的原理是:動態(tài)添加一個<script>標簽,使用 script 標簽的 src 屬性沒有跨域的限制的特點實現(xiàn)跨域。首先在客戶端注冊一個 callback, 然后把 callback 的名字傳給服務器。此時,服務器先生成 json 數(shù)
據(jù)。 然后以 javascript 語法的方式,生成一個 function , function 名字就是傳遞上來的參數(shù) jsonp。最后將
json 數(shù)據(jù)直接以入?yún)⒌姆绞剑胖玫?function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。
客戶端瀏覽器,解析script標簽,并執(zhí)行返回的 javascript 文檔,此時數(shù)據(jù)作為參數(shù),傳入到了客戶端預先定義
好的 callback 函數(shù)里。

常用的Linux命令
列出文件列表:ls 【參數(shù) -a -l】
創(chuàng)建目錄和移除目錄:mkdir  rmdir
用于顯示文件后幾行內(nèi)容:tail
打包:tar -xvf
打包并壓縮:tar -zcvf
查找字符串:grep
顯示當前所在目錄:pwd
創(chuàng)建空文件:touch
編輯器:vim  vi
列出文件列表:ls 【參數(shù) -a -l】
創(chuàng)建目錄和移除目錄:mkdir  rmdir
用于顯示文件后幾行內(nèi)容:tail
打包:tar -xvf
打包并壓縮:tar -zcvf
查找字符串:grep
顯示當前所在目錄:pwd
創(chuàng)建空文件:touch
編輯器:vim  vi

Mybatis 框架中的mapper 方式中的 # 也能很大程度的防止sql注入($無法防止sql注
入)。

Mysql性能優(yōu)化
1、當只要一行數(shù)據(jù)時使用limit 1
3. 用not exists代替not in
4. 對操作符的優(yōu)化,盡量不采用不利于索引的操作符
如:in    not in    is null    is not null    <>  等

在千萬級的數(shù)據(jù)庫查詢中,如何提高效率?
使用explain sql 來分析sql語句

1)數(shù)據(jù)庫設計方面
a. 對查詢進行優(yōu)化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。  
b. 應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描
c. 并不是所有索引對查詢都有效,SQL是根據(jù)表中數(shù)據(jù)來進行查詢優(yōu)化的,當索引列有大量數(shù)據(jù)重復時,查詢
可能不會去利用索引
d. 索引并不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的
效率
e. 應盡可能的避免更新索引數(shù)據(jù)列
f. 盡量使用數(shù)字型字段

Spring 框架就像一個家族,有眾多衍生產(chǎn)品例如 boot、security、jpa等等。但他們的基礎都是Spring 的ioc和 aop,ioc 提供了依賴注入的容器, aop解決了面向橫切面的編程,然后在此兩者的基礎上實現(xiàn)了其他延伸產(chǎn)品的高級功能。

Spring MVC提供了一種輕度耦合的方式來開發(fā)web應用。它是Spring的一個模塊,是一個web框架。

Spring Boot實現(xiàn)了自動配置,降低了項目搭建的復雜度。它主要是為了解決使用Spring框架需要進行大量的配置太麻煩的問題,所以它并不是用來替代Spring的解決方案,而是和Spring框架緊密結合用于提升Spring開發(fā)者體驗的工具。

Spring 是一個“引擎”;

Spring MVC 是基于Spring的一個 MVC 框架;

Spring Boot 是基于Spring4的條件注冊的一套快速開發(fā)整合包。

SpringMVC的工作原理
a. 用戶向服務器發(fā)送請求,請求被springMVC前端控制器DispatchServlet捕獲;  
b. DispatcherServle對請求URL進行解析,得到請求資源標識符(URL),然后根據(jù)該URL調(diào)用HandlerMapping
將請求映射到處理器HandlerExcutionChain;
c. DispatchServlet根據(jù)獲得Handler選擇一個合適的HandlerAdapter適配器處理;
d. Handler對數(shù)據(jù)處理完成以后將返回一個ModelAndView()對象給DisPatchServlet;
e. Handler 返回的 ModelAndView()只是一個邏輯視圖并不是一個正式的視圖,DispatcherSevlet 通過
ViewResolver試圖解析器將邏輯視圖轉化為真正的視圖View;
h. DispatcherServle 通過 model 解析出 ModelAndView()中的參數(shù)進行解析最終展現(xiàn)出完整的 view 并返回給
客戶端;

開啟注解處理器和適配器
 springmvc.xml 中通過開啟 <mvc:annotation-driven>來實現(xiàn)注解處  
理器和適配器的開啟。

如何解決get和post亂碼問題?
解決 post 請求亂碼:我們可以在 web.xml 里邊配置一個 CharacterEncodingFilter 過濾器。 設置為 utf-8.  
解決 get 請求的亂碼:有兩種方法。對于 get 請求中文參數(shù)出現(xiàn)亂碼解決方法有兩個:  
1. 修改 tomcat 配置文件添加編碼與工程編碼一致。  
2. 另 外 一 種 方 法 對 參 數(shù) 進 行 重 新 編 碼 String userName = New
String(Request.getParameter(“userName”).getBytes(“ISO8859-1”), “utf-8”);

談談你對Spring的理解
Spring是一個開源框架,為簡化企業(yè)級應用開發(fā)而生。Spring是一個IOC和AOP容器框架。

在Spring容器中為一個bean配置依賴注入有三種方式:
· 使用屬性的setter方法注入  這是最常用的方式;
· 使用構造器注入;
· 使用Filed注入(用于注解方式).

Spring容器的主要核心是:
控制反轉(IOC)
依賴注入(DI)面向切面編程(AOP),在面向?qū)ο缶幊蹋╫op)思想中,我們將事物縱向抽成一個個的對象。而在面向切面編程
中,我們將一個個的對象某些類似的方面橫向抽成一個切面,對這個切面進行一些如權限控制、事物管理,記錄日志等
公用操作處理的過程就是面向切面編程的思想。AOP底層是動態(tài)代理

Spring中的設計模式
1單例模式 2模板方式模式 3前端控制器模式 4試圖幫助 5依賴注入 6工廠模式

簡單介紹一下Spring bean的生命周期
1bean定義 2bean初始化 3bean調(diào)用 4bean銷毀

spring結構
(1)核心容器:包括Core、Beans、Context、EL模塊。
(2)AOP、Aspects模塊:

Spring能幫我們做什么?
Spring能幫我們根據(jù)配置文件創(chuàng)建及組裝對象之間的依賴關系
Spring 面向切面編程能幫助我們無耦合的實現(xiàn)日志記錄,性能統(tǒng)計,安全控制
Spring能非常簡單的幫我們管理數(shù)據(jù)庫事務
Spring還能與第三方數(shù)據(jù)庫訪問框架(如Hibernate、JPA)無縫集成
Spring還能與第三方Web(如Struts、JSF)框架無縫集成

Spring配置文件有什么作用?
Spring配置文件是個XML 文件,這個文件包含了類信息,描述了如何配置它們,以及如何相互調(diào)用。

 什么是Spring IOC 容器
IOC 控制反轉:Spring IOC 負責創(chuàng)建對象,管理對象。通過依賴注入(DI),裝配對象,配置對象,并且管理這
些對象的整個生命周期。

 IOC的優(yōu)點是什么?
IOC 或 依賴注入把應用的代碼量降到最低。它使應用容易測試

什么是Spring的依賴注入?
,spring提出了依賴注入的思想,即依賴類不由程序員實例化,而
是通過 spring 容器幫我們 new 指定實例并且將實例注入到需要該對象的類中。依賴注入的另一種說法是“控制反
轉”

Mybatis中#和$的區(qū)別?
#相當于對數(shù)據(jù) 加上 雙引號,$相當于直接顯示數(shù)據(jù)
 #方式能夠很大程度防止sql注入。
.$方式無法防止Sql注入
$方式一般用于傳入數(shù)據(jù)庫對象
一般能用#的就別用$.

Mybatis的編程步驟是什么樣的?
1、創(chuàng)建SqlSessionFactory
2、通過SqlSessionFactory創(chuàng)建 SqlSession
3、通過sqlsession執(zhí)行數(shù)據(jù)庫操作
4、調(diào)用session.commit()提交事務
5、調(diào)用session.close()關閉會話

使用MyBatis的mapper接口調(diào)用時有哪些要求?
1. Mapper接口方法名和mapper.xml中定義的每個sql的id相同
2. Mapper接口方法的輸入?yún)?shù)類型和mapper.xml中定義的每個sql 的parameterType的類型相同
3. Mapper接口方法的輸出參數(shù)類型和mapper.xml中定義的每個sql的resultType的類型相同
4. Mapper.xml文件中的namespace即是mapper接口的類路徑。

MyBatis的動態(tài)SQL是基于OGNL表達式的,它可以幫助我們方便的在SQL語句中實現(xiàn)某些邏輯。
MyBatis中用于實現(xiàn)動態(tài)SQL的元素標簽主要有:

if
where
set
choose(when,otherwise)
trim
foreach

Redis的特點?
內(nèi)存高速緩存數(shù)據(jù)庫
該軟件使用C語言編寫,典型的NoSQL數(shù)據(jù)庫服務器,Redis是一
個key-value存儲系統(tǒng),它支持豐富的數(shù)據(jù)類型,如:string、list、set、zset(sorted set)、hash。
Redis為了達到最快的讀寫速度將數(shù)據(jù)都讀到內(nèi)存中,并通過異步的方式將數(shù)據(jù)寫入磁盤。所以redis具有快速和
數(shù)據(jù)持久化的特征。

Redis常見的性能問題都有哪些?
(1)、Master寫內(nèi)存快照,save命令調(diào)度rdbSave函數(shù),會阻塞主線程的工作,當快照比較大時對性能影響是
非常大的,會間斷性暫停服務,所以Master最好不要寫內(nèi)存快照。
(2)、Master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會
不斷增大,AOF文件過大會影響Master重啟的恢復速度。Master最好不要做任何持久化工作,包括內(nèi)存快照和AOF
日志文件,特別是不要啟用內(nèi)存快照做持久化,如果數(shù)據(jù)比較關鍵,某個Slave開啟AOF備份數(shù)據(jù),策略為每秒同步一
次。
(3)、Master調(diào)用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會占大量的CPU和內(nèi)存資源,導致服
務load過高,出現(xiàn)短暫服務暫?,F(xiàn)象。
(4)、Redis 主從復制的性能問題,為了主從復制的速度和連接的穩(wěn)定性,Slave 和 Master 最好在同一個局域
網(wǎng)內(nèi)

Redis最適合的場景有哪些?
(1)、會話緩存(Session Cache)
(2)、全頁緩存(FPC)
(3)、隊列
(4)、排行榜/計數(shù)器
(5)、發(fā)布/訂閱

Redis的數(shù)據(jù)結構有五種
String——字符串
String 數(shù)據(jù)結構是簡單的 key-value 類型,value 不僅可以是 String,也可以是數(shù)字(當數(shù)字類型用 Long 可
以表示的時候encoding 就是整型,其他都存儲在 sdshdr 當做字符串)。
 Hash——字典
在 Memcached 中,我們經(jīng)常將一些結構化的信息打包成 hashmap,在客戶端序列化后存儲為一個字符串的值
(一般是 JSON 格式),比如用戶的昵稱、年齡、性別、積分等。
 List——列表
List 說白了就是鏈表(redis 使用雙端鏈表實現(xiàn)的 List),相信學過數(shù)據(jù)結構知識的人都應該能理解其結構。
Set——集合
Set 就是一個集合,集合的概念就是一堆不重復值的組合。利用 Redis 提供的 Set 數(shù)據(jù)結構,可以存儲一些集
合性的數(shù)據(jù)。
Sorted Set——有序集合
和Sets相比,Sorted Sets是將 Set 中的元素增加了一個權重參數(shù) score,使得集合中的元素能夠按 score 進
行有序排列

Redis的優(yōu)缺點
a) 性能極高 – Redis 能支持超過 100K+ 每秒的讀寫頻率。
b) 豐富的數(shù)據(jù)類型 – Redis 支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets數(shù)據(jù)類型操作。
 c) 原子 – Redis 的所有操作都是原子性的,同時 Redis 還支持對幾個操作全并后的原子性執(zhí)行。

Redis的持久化
RDB 持久化:該機制可以在指定的時間間隔內(nèi)生成數(shù)據(jù)集的時間點快照
AOF 持久化:記錄服務器執(zhí)行的所有寫操作命令

消息隊列 ActiveMQ 如何使用ActiveMQ解決分布式事務?
在互聯(lián)網(wǎng)應用中,基本都會有用戶注冊的功能。在注冊的同時,我們會做出如下操作:
1. 收集用戶錄入信息,保存到數(shù)據(jù)庫
2. 向用戶的手機或郵箱發(fā)送驗證碼
等等…

但是在分布式架構中,用戶和發(fā)送驗證碼是兩個獨立的服務,它們都有各自的數(shù)據(jù)庫,那么就不能通過本地事物
保證操作的原子性。這時我們就需要用到ActiveMQ(消息隊列)來為我們實現(xiàn)這個需求。
 
在用戶進行注冊操作的時候,我們?yōu)樵摬僮鲃?chuàng)建一條消息,當用戶信息保存成功時,把這條消息發(fā)送到消息隊列。
驗證碼系統(tǒng)會監(jiān)聽消息,一旦接受到消息,就會給該用戶發(fā)送驗證碼。

1.如何防止消息重復發(fā)送?
解決方法很簡單:增加消息狀態(tài)表。通俗來說就是一個賬本,用來記錄消息的處理狀態(tài),每次處理消息之前,都去
狀態(tài)表中查詢一次,如果已經(jīng)有相同的消息存在,那么不處理,可以防止重復發(fā)送。

Dubbo
dubbo reference注解問題
@Reference 只能在 springbean 實例對應的當前類中使用

dubbo的啟動流程
1服務端開始啟動,向注冊中心(zookeeper)進行注冊
2消費者向注冊中心訂閱服務端自己所需要的服務
3注冊中心接收到會以(notify)通知方式通知消費者
4消費者開始向服務端消費自己所需要的服務
5同時,異步的向監(jiān)控中心記錄下有多少服務端在啟動,多少消費者在消費。

Dubbo的客戶端和服務端有三種連接方式,分別是:廣播,直連和使用zookeeper注冊中心

Dubbo注冊中心和廣播注冊中心配置類似,不過需要指定注冊中心類型和注冊中心地址,這個時候就不是把服務
信息進行廣播了,而是告訴給注冊中心進行管理,這個時候我們就需要有一個注冊中心。
官方推薦使用zookeeper作為注冊中心。

調(diào)用關系說明:
1)服務容器負責啟動,加載,運行服務提供者。
2)服務提供者在啟動時,向注冊中心注冊自己提供的服務。
3)服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
4)注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者。
5)服務消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調(diào)用,如果調(diào)用失敗,再選另一臺
調(diào)用。
6)服務消費者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。

Nginx反向代理為什么能夠提升服務器性能?
對于后端是動態(tài)服務來說,Nginx 有個好處是它會把 Request 在讀取完整之前 buffer 住,這樣交給后端的就是一個完整的 HTTP  
請求,從而提高后端的效率,而不是斷斷續(xù)續(xù)的傳遞(互聯(lián)網(wǎng)上連接速度一般比較慢)。 同樣,Nginx 也可以把
response 給 buffer 住,同樣也是減輕后端的壓力。

負載均衡策略
1、輪詢:這種是默認的策略,把每個請求按順序逐一分配到不同的server,如果server掛掉,能自動剔除。
2、最少連接:把請求分配到連接數(shù)最少的server
3、權重:使用weight來指定server訪問比率
4、ip_hash:每個請求會按照訪問ip的hash值分配,這樣同一客戶端連續(xù)的Web請求都會被分發(fā)到同一server進行處理,可以解決session的問題。

Zookeeper
簡單介紹一下zookeeper以及zookeeper的原理
ZooKeeper 是一個分布式的,開放源碼的分布式應用程序協(xié)調(diào)服務
ZooKeeper 的目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的接口和性能高效、 功能穩(wěn)定的系統(tǒng)提供給用戶

znode節(jié)點每個代表一個屬性,包含當前版本,數(shù)據(jù)版本,建立時間和修改時間等

 

Activity 工作流
工作流是將一組任務組織起來以完成某個經(jīng)營過程:定義了任務的觸
發(fā)順序和觸發(fā)條件,每個任務可以由一個或多個軟件系統(tǒng)完成,也可以由一個或一組人完成,還可以由一個或多個人
與軟件系統(tǒng)協(xié)作完。

tomcat集群
單一服務器終究無法滿足需要處理的負荷量
修改 tomcat1, tomcat2 的 server.xml 文件添加集群內(nèi)容

在 web 開發(fā)中,如果對象被保存在了 Session 中,tomcat 在重啟時要把 Session 對 象序列化到硬盤,這個對象就必須實現(xiàn) Serializable 接口。如果對象要經(jīng)過分布式系統(tǒng)進行 網(wǎng)絡傳輸或通過 rmi 等遠程調(diào)用,這就需要在網(wǎng)絡上傳輸對象,被傳輸?shù)膶ο缶捅仨殞崿F(xiàn) Serializable 接口。
 
Java中的String,StringBuilder,StringBuffer三者的區(qū)別
速度快慢為:StringBuilder > StringBuffer > String
String最慢的原因:String為字符串常量,而StringBuilder和StringBuffer均為字符串變量,即String對象一旦創(chuàng)建之后該對象是不可更改的,但后兩者的對象是變量,是可以更改的。
在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的(StringBuffer中很多方法可以帶有synchronized關鍵字)
String:適用于少量的字符串操作的情況
StringBuilder:適用于單線程下在字符緩沖區(qū)進行大量操作的情況
StringBuffer:適用多線程下在字符緩沖區(qū)進行大量操作的情況

elasticSearch
倒排索引是搜索引擎的基石,也是Elasticsearch能實現(xiàn)快速全文搜索的根本。歸納起來,主要是對一個文檔內(nèi)容做兩步操作:分詞、建立“單詞-文檔”列表

線程安全性概念
線程安全:就是多線程訪問時,采用了加鎖機制,當一個線程訪問該類的某個數(shù)據(jù)時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程才可使用。不會出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)污染。
相反地,
線程不安全:就是不提供數(shù)據(jù)訪問保護,有可能出現(xiàn)多個線程先后更改數(shù)據(jù)造成所得的數(shù)據(jù)是臟數(shù)據(jù)。

Java基礎——6種常用類講解
一、System類
二、Runtime類
三、Date類和SimpleDateFormat
四、Calendar類
五、Math類
六、Random類

Java常用的八種排序算法與代碼實現(xiàn)
1.直接插入排序 2.希爾排序 3.簡單選擇排序 4.堆排序 5.冒泡排序 6.快速排序 7.歸并排序 8.基數(shù)排序
總結:
一、穩(wěn)定性:
 穩(wěn)定:冒泡排序、插入排序、歸并排序和基數(shù)排序
不穩(wěn)定:選擇排序、快速排序、希爾排序、堆排序
二、平均時間復雜度
O(n^2):直接插入排序,簡單選擇排序,冒泡排序。
在數(shù)據(jù)規(guī)模較小時(9W內(nèi)),直接插入排序,簡單選擇排序差不多。當數(shù)據(jù)較大時,冒泡排序算法的時間代價最高。性能為O(n^2)的算法基本上是相鄰元素進行比較,基本上都是穩(wěn)定的。
O(nlogn):快速排序,歸并排序,希爾排序,堆排序。
其中,快排是最好的, 其次是歸并和希爾,堆排序在數(shù)據(jù)量很大時效果明顯。
三、排序算法的選擇
1.數(shù)據(jù)規(guī)模較小
1)待排序列基本序的情況下,可以選擇直接插入排序;
2)對穩(wěn)定性不作要求宜用簡單選擇排序,對穩(wěn)定性有要求宜用插入或冒泡
2.數(shù)據(jù)規(guī)模不是很大
1)完全可以用內(nèi)存空間,序列雜亂無序,對穩(wěn)定性沒有要求,快速排序,此時要付出log(N)的額外空間。
2)序列本身可能有序,對穩(wěn)定性有要求,空間允許下,宜用歸并排序
3.數(shù)據(jù)規(guī)模很大
1)對穩(wěn)定性有求,則可考慮歸并排序。2)對穩(wěn)定性沒要求,宜用堆排序
4.序列初始基本有序(正序),宜用直接插入,冒泡

servlet的生命周期
1.加載和實例化
2.初始化
3.請求處理
4.服務終止

tcp是網(wǎng)絡傳輸協(xié)議
http是超文本傳輸協(xié)議

關系型數(shù)據(jù)庫
增刪改查

Servlet的生命周期
1.創(chuàng)建Servlet對象,通過服務器反射機制創(chuàng)建Servlet對象,第一次請求時才會創(chuàng)建。(默認)
2,調(diào)用Servlet對象的init()方法,初始化Servlet的信息,init()方法只會在創(chuàng)建后被調(diào)用一次;
3,響應請求,調(diào)用service()或者是doGet(),doPost()方法來處理請求,這些方法是運行的在多線程狀態(tài)下的。
4,? 在長時間沒有被調(diào)用或者是服務器關閉時,會調(diào)用destroy()方法來銷毀Servlet對象。

Java中的四個核心技術思想
虛擬機
API
類裝載器的體系結構
class文件

 


簡歷:
用explain分析查詢語句,查看type查看連接使用了哪些類別,有無使用索引,system/const/eq_ref/ref/range/index/all
mysql通過 主從復制(Master-Slave)的方式來同步數(shù)據(jù),再通過讀寫分離(MySQL-Proxy)來提升數(shù)據(jù)庫的并發(fā)負載能力 這樣的方案來進行部署與實施的。
讀寫分離,基本的原理是讓主數(shù)據(jù)庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫處理SELECT查詢操作。數(shù)據(jù)庫復制被用來把事務性操作導致的變更同步到集群中的從數(shù)據(jù)庫。
EXPLAIN可以幫助開發(fā)人員分析SQL問題,explain顯示了mysql如何使用索引來處理select語句以及連接表,可以幫助選擇更好的索引和寫出更優(yōu)化的查詢語句。
使用方法,在select語句前加上Explain就可以了
使用方式主要是樂觀鎖和悲觀鎖。

1. 什么是spring?
java企業(yè)級應用的開源開發(fā)框架

2. 使用Spring框架的好處是什么?
輕量級/控制反轉IOC,不用去創(chuàng)建對象等/面向切面編程AOP,將業(yè)務邏輯和系統(tǒng)服務分開/有容器管理對象生命周期和配置/有MVC框架,web框架的替代品/事務管理/統(tǒng)一的一場管理

9. 解釋對象/關系映射集成模塊
契合mybatis,支持主流的ORM框架

10.  解釋WEB 模塊
透明的處理各種請求

13.  什么是Spring IOC 容器?
負責創(chuàng)建對象,管理配置對象

14.  IOC的優(yōu)點是什么?
將代碼量降到最低,容易測試

17. 一個Spring的應用看起來象什么?
一個定義了功能的接口,實現(xiàn)各種,包括屬性,方法等

18. 什么是Spring的依賴注入?
DI是IOC的一個方面,不用主動去創(chuàng)建對象

19.  有哪些不同類型的IOC(依賴注入)方式?
構造器注入,setter注入

24. 你怎樣定義類的作用域?
在<bean>標簽里面定義

27. 解釋Spring框架中bean的生命周期
實例化,調(diào)用,銷毀

51.  解釋AOP
面向切面的編程,將業(yè)務邏輯和系統(tǒng)服務分開

64. 什么是Spring的MVC框架?
配備的構建Web應用的全功能MVC框架,清晰的將業(yè)務邏輯和控制邏輯分開。

65. DispatcherServlet
用來處理所有的http請求和響應。

67. 什么是Spring MVC框架的控制器?
控制器提供訪問應用程序的行為,這個行為通過服務接口實現(xiàn),控制視圖解析器解析然后呈現(xiàn)一個完整的視圖


spring的工作原理:有IOC反轉控制,AOP面向切面編程,利用了反射,在運行時動態(tài)的去創(chuàng)建對象,調(diào)用對象的方法,就是讓對象與對象(模塊與模塊)之間的關系沒有通過代碼來關聯(lián),都是通過配置類說明管理


mybatis定制了sql存儲過程和高級映射
使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預定義的配置類的實例獲得。

 

 

項目一
采用了SpringBoot+Dubbo+Zookeeper作為底層架構,Dubbo是作為服務之間的通信,Zookeeper作為注冊中心。
采用了SOA分布式架構,為不同模塊定義接口,功能模塊有很多,例如后臺管理模塊,經(jīng)銷商模塊,訂單模塊,購物車模塊,前臺系統(tǒng),支付模塊,搜索模塊等
該系統(tǒng)用mybatis處理數(shù)據(jù)庫層的操作,后臺的頁面用了easyui來做,里面一些功能是有表的就用了easyui的分頁插件查詢,后端控制的用的是mybatis的PageHelper分頁。
將數(shù)據(jù)封裝傳輸?shù)巾撁骘@示。用了pagehelper的工具類將其封裝。
redis是key-value型數(shù)據(jù)庫
使用 Redis 做為緩存服務器,提高系統(tǒng)訪問率。Redis分布式鎖,同一時間下只有一個線程能使用相應的代碼塊。當多個進程不在同一個系統(tǒng)中,用分布式鎖控制多個進程對資源的訪問。
使用es先將數(shù)據(jù)庫已存在的商品列表分詞封裝,放進es數(shù)據(jù)庫里,大大提高了商品檢索效率。如果后臺管理添加了新的產(chǎn)品信息,更新數(shù)據(jù)庫時附帶插入新的es數(shù)據(jù)
使用了nginx反向代理,通過輪詢的方式實現(xiàn)負載均衡,提高了系統(tǒng)并發(fā)處理能力。
用了fastfds插件整合在后臺模塊的model里,用來儲存商品的圖片信息,頭像信息等。提高了圖片的處理能力,在linux上配置好相應的儲存節(jié)點
后臺管理模塊:
商品列表管理,簡單的增刪改查按鈕,多級分類連級不同的屬性展示不同的商品列表,編輯spu屬性用了easyui的dialog配合動態(tài)網(wǎng)格增加刪除行列來修改屬性值,提交后數(shù)據(jù)庫修改
spu管理是具體的商品詳情管理,同樣三級連級屬性查詢,一件商品有很多的屬性,例如用了fastfds儲存圖片信息等
這里面還有庫存管理sku屬性,添加相應的規(guī)格屬性和數(shù)量,也是用dialog,提交就修改數(shù)據(jù)庫
物資詳情頁顯示,后臺提取封裝每個類型產(chǎn)品的屬性作為篩選條件,條件動態(tài)展示,
篩選用了面包屑,還用進去單獨產(chǎn)品頁可以進行屬性挑選,不同的產(chǎn)品不同的條件,根據(jù)產(chǎn)品的spu屬性決定,會提示是否有庫存
搜索模塊用了es,es是一個nosql數(shù)據(jù)庫,動態(tài)的將數(shù)據(jù)庫的產(chǎn)品數(shù)據(jù)封裝分詞放進去,通過全頁查詢可以查詢出關鍵字產(chǎn)品。