[轉]面試總結


基礎部分:
statement和PreparedStatement的區別
statement是針對一次性存取操作時用的對象
PreparedStatement是針對批量存取效率高,
因為PreparedStatement是預編譯 而 statement是每次執行相關數據庫都要進行一次sql編譯

XML的解析方式?
DOM和SAX
DOM解析是一行一行來解析所以效率低,但是不耗內存
SAX解析是一下子全部加載到內存中,效率高,但是耗內存

mysql的索引構建?
1)普通索引:index
允許出現相同的索引內容

2)唯一索引:unique
不可以出現相同的值,但可以有null值

3)主鍵索引:primary_key
不可以有相同的值,且不可以有null值,一個表只能有一個primary_key索引

4)全文索引:fulltext
全文索引可以針對值中的某個單詞

索引的創建:
1)ALTER TABLE 適用於表創建完畢后添加索引
ALTER TABLE 表名 ADD 索引類型(index,unique,primary_kry,fullText)索引名(字段名);
索引名字可以不要,不要索引名的話,當前索引名就是該字段名,
比如: ALTER TABLE student ADD INDEX name (sname);
或 ALTER TABLE student ADD INDEX (sname);

2)CREATE INDEX 可對表增加普通索引或UNIQUE索引---注意!只能添加普通索引和唯一索引
比如: CREATE INDEX 索引名 ON 表名 (字段名)
CREATE UNIQUE INDEX 索引名 ON 表名 (字段名)

3)還可以在創建表的時候添加索引
CREATE TABLE `test1` (
`id` smallint(5) UNSIGNED AUTO_INCREMENT NOT NULL, -- 注意,下面創建了主鍵索引,這里就不用創建了
`username` varchar(64) NOT NULL COMMENT '用戶名',
`nickname` varchar(50) NOT NULL COMMENT '昵稱/姓名',
`intro` text,
PRIMARY KEY (`id`),
UNIQUE KEY `unique1` (`username`), -- 索引名稱,可要可不要,不要就是和列名一樣
KEY `index1` (`nickname`),
FULLTEXT KEY `intro` (`intro`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='后台用戶表';

索引的刪除:
1) DROP INDEX 索引名 ON 表名
2) ALTER TABLE 表名 DROP INDEX 索引名
-- 這兩句都是等價的,都是刪除掉表中的索引;

ALTER TABLE 表名 DROP PRIMARY KEY -- 刪除主鍵索引,注意主鍵索引只能用這種方式刪除

查看索引:
show index from 表名; \G;

組合索引與前綴索引: 注意!這兩種稱呼是對建立索引技巧的一種稱呼,並非索引的類型;
組合索引:
多個字段使用一個索引,如果sql查詢語句中where條件有索引值中的第一個字段,則會使用該索引,反之不會

前綴索引:
如果索引列長度過長,這種列索引時將會產生很大的索引文件,不便於操作,可以使用前綴索引方式進行索引
比如:一個字段的長度是50,但是一般這個字段中的數據不會有那么長,那我們創建索引的時候可以 字段名(估計長度)

單列索引與組合索引的區別:
單列索引適用於單個字段的查詢,比如查詢條件后只有一個字段,那mysql會很快的根據索引查詢到結果,
但是如果查詢條件有多個,那mysql只會去它認為最有效的那個索引進行查詢,其他的條件還是會全表掃描,速度慢
組合索引適用於多個字段的查詢,比如查詢條件后面有多個字段,那mysql將無需任何掃描直接查詢到結果,
但是查詢條件中只有索引中其他字段卻沒有第一個字段的時候,是用不到這個索引的;

什么語句會不走索引?
查詢條件的字段參與運算的不走索引 比如: WHERE 'age'+10=30
查詢條件模糊查詢中占位符在左邊的不走索引,比如: WHERE 'uname' LIKE '%康%'
正則表達式不參與索引
查詢條件中字符串與數字的比較不走索引, 比如: WHERE 'a'=1
查詢條件中帶OR的也不走索引 比如: WHERE dname='xxx' or loc='xx' or deptno=45
如果mysql估計全表掃描比使用索引快,也不會走索引

數組部分:
數組的初始長度:
基本數據類型的數組長度為0,引用數據類型的長度為null

集合部分:
說說集合?
答:集合分為單列集合和雙列集合。
單列集合的頂層是Collection接口,包括List和Set集合。

List集合又包括ArrayList、LinkedList 特點是元素可重復,有序,有索引,可以通過索引來操作元素
ArrayList底層采用的是數組結構,線程不安全,效率高,查詢快,增刪慢,初始長度10
LinkedList集合的底層采用的是鏈表數據結構,線程不安全,增刪快,查詢慢。

Set集合的特點元素是無序的,元素不可以重復。包括HashSet和TreeSet。
HashSet的底層數據結構是哈希表,線程不安全,效率高。使用hashCode和equals來判斷元素唯一性,先判斷hashCode后判斷equals
TreeSet的底層數據結構是二叉樹,線程不安全,效率高。能夠給元素進行排序。

雙列集合的頂層接口是Map,該集合存儲的是鍵值對,一對一對的往里存,而且要保證鍵的唯一性。包括Hashtable、HashMap、TreeMap。

Hashtable的底層數據結構是哈希表,不可以存儲null鍵和null值,線程安全,效率低。被HashMap替代

HashMap的底層數據結構是哈希表,可以存儲null鍵和null值,線程不安全,效率高。依據是hashCode和equals來保證鍵的唯一性的。

TreeMap的底層數據結構是二叉樹,線程不安全,能夠給集合中的鍵排序。


ArrayList集合元素去重的方法?
答: 先創建個Set集合hashSet,然后再創建個新的list,
用for循環遍歷之前有元素的list,在for循環內嵌套一個if判斷,
用list.get()索引取出每一個元素,在if表達式中使用該元素往Set集合中添加,
如果添加進去會返回true,那就會進入if中,然后用新創建的list添加這個元素,
等遍歷完之前的list后,新創建的list中就是去重后的元素

第二種方法是用LinkedHashSet的元素有序而且去重的特性

線程部分:
多線程的用法一般有哪幾種?
答: 1.繼承Thread類 2.實現Runnable接口 3.線程池

這兩種方式的區別?或者說那個更好?
(1)繼承Thread類的優點:代碼簡單,能夠直接使用Thread類的方法.缺點:擴展性差,因為java只支持單繼承
(2)實現Runnable接口的優點:擴展性強,更靈活些.缺點:代碼比較復雜點,不能直接使用Thread類的方法

線程的狀態:
新建,就緒,運行(運行時可能阻塞與等待).死亡

sleep和wait的區別?
答:(1)sleep是讓線程睡眠,必須給相應的睡眠時間,不需要喚醒,時間到了會自動醒來,休眠時不放棄Cpu的執行權。
(2)wait的是讓線程等待,可以傳參也可以不傳參,傳參是在指定的時間后等待,需要被喚醒。等待的時候放棄cpu的執行權。

什么時候會出現安全性?
答: 多線程,並發,操作同一數據。

項目部分:
項目介紹:
我們這個商城是一個B2C平台,項目用的是SOA構架,分為表現層和服務層,表現層負責與前端的交互,服務層負責與數據庫的交互,
表現層與服務層的之間的通信用的是DUBBO,注冊中心用的是zookeper;
我們用Nginx服務器做的負載均衡與反向代理,用戶在一個請求過來先進入Nginx服務器,Nginx服務器會根據各個應用服務器的訪問壓力
來把請求分配給相對空閑的應用服務器上,如果需要響應給用戶的數據在redis中有,就會直接從redis中獲取數據並響應給用戶
如果需要響應給用戶的數據redis中沒有,那表現層就會去注冊中心的服務列表找相應的服務,找到需要調用的服務后,zookeper會把該服務
的地址發給表現層,表現層接着拿着這個地址去直接找服務並調用服務,接着服務層會與數據庫交互.
我在項目中負責的是商品模塊與商城首頁的動態展示.


你們項目中有沒有用到單例多例的地方?常見的單例和多例說下?
答:暫時沒有答案

技術部分:
框架部分:
springMVC:
springMVC是什么?
是個表現層框架

springMVC的執行流程?
(1)發送請求到前端控制器; (2)前端控制器請求處理器映射器查找Handler; (3)處理器映射器向前端控制器返回Handler
(4)前端控制器拿着Handler調用處理器適配器來執行; (5)處理器執行完Handler后返回一個ModelAndView給適配器;
(6)處理器適配器又會把ModelAndView交給前端控制器; (7)前端控制器會請求視圖解析器來解析視圖(根據邏輯視圖名來解析)
(8)解析完畢后會向前端控制器返回View; (9)前端控制器進行視圖渲染(視圖渲染是將模型數據填充到request作用域中)
(10)前端控制器向用戶響應結果

springMVC中的controller是單例還是多例?
默認是單例,可以通過在@controller之前加上@scope("prototype")來改變成多例;
一般如果不在controller中定義非靜態成員變量的話就不用改

spring:
spring是什么?
簡單來說,Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。

說下IOC?
IOC就是控制反轉,是把對象的創建權利交給了spring這個容器來管理;降低了組件之間的耦合性,提高了程序的靈活性和可維護性;
就是通過配置文件(XML或.properties)指定需要實例化的JAVA類(類名的完整字符串)

IOC在項目中的具體應用?
IOC模式將耦合代碼從程序中移出,放到統一的XML文件中管理。由IOC容器通過配置文件來管理對象的生命周期、依賴關系等

IOC用的什么設計模式?
工廠模式


說下AOP?
AOP就是面向切面編程,可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一的添加功能的一種技術
把散落在程序中的公共部分提取出來,做成切面類這樣的好處在於,代碼的可重用,一旦涉及到該功能的需求發生變化,
只要修改該切面類的代碼就行,不用要到處修改; 實現調用某個方法之前或/和之后,自動執行一系列自定義的語句 AOP底層是代理機制
主要的功能是:日志記錄,性能統計,安全控制,事務處理,異常處理等等。

AOP在項目中的具體應用?
權限攔截,日志記錄,事物處理,異常處理,數據庫連接

AOP用的什么設計模式?
動態代理模式

DI的依賴注入放式有哪幾種
接口注入, setter注入, 構造方法注入

mybatis:

mybatis是什么?
是一個優秀的持久層框架; 它支持定制化SQL,存儲過程以及高級映射;

mybatis的緩存機制?
MyBatis的緩存分為一級緩存和二級緩存,
一級緩存放在session里面,默認就有,二級緩存放在它的命名空間里,默認是打開的,
使用二級緩存屬性類需要實現Serializable序列化接口(可用來保存對象的狀態),可在它的映射文件中配置<cache/>

mybatis的好處是什么?
mybatis的好處是對jdbc做了個簡單的封裝,相對更加輕量級
把SQL語句放在了單獨的XML文件中編寫,解決了jdbc的SQL硬編碼問題,使用更加靈活,便於維護

其他部分:
freemarker:
介紹:
freemarker是一款用java語言編寫的模板引擎;完全免費;
它可以基於模板技術生成各種文本如:HTML,jsp等

優點:
可以徹底的分離表現層和業務邏輯, 可以提高開發效率,
可以讓開發過程中人員分工更明確,前端人員只需要專心開發界面,后端開發人員專注系統,負責頁面准備要顯示的數據

原理:
模板+數據模型
模板負責數據在頁面中的表現,數據模型負責邏輯的處理,最終生成的頁面就是模板+數據模型

使用步驟:
(1)初始化freemaker配置 (2)創建數據模型 (3)加載模板文件 (4)顯示生成后的數據(也就是頁面)

常用的freemarker的幾個標簽?

redis:
介紹:
redis是C語言編寫的,它是一個可基於內存也可持久化的日志型,Key-Value數據庫;非關系型數據庫
redis為了保證效率,數據都是緩存在內存中; 也可以持久化在磁盤中,當數據發生改變時,會周期性的把更新的數據寫入磁盤

可用場景:
消息隊列,數據堆棧,數據緩存等

數據緩存的數據快照機制:
redis有數據快照,開發人員可以通過配置文件定制數據快照的時間間隔,redis會將數據快照自動存放在磁盤中;
如果服務器突然停止服務,redis也很少會出現數據丟失

redis的數據類型:
共5種:string(字符串),hash(哈希表),list(列表),set(集合)及zset(有序集合)
redis中值的類型還支持:字符串列表,無序不重復的字符串集合,有序不重復的字符串集合,鍵、值都為字符串的哈希表

項目中哪里用到了redis? 怎么用的? 集群是怎么搭建的?
保存用戶session(可以實現session共享); 保存購物車(未登錄保存到cookie,登陸后把cookie中購物車保存到redis,刪除本地cookie購物車);
有關商品,熱銷,推薦排序的隊列,通常存放在Redis之中

redis的使用方式:
java有個jar包,傑迪斯 調用set 或 push 放入數據

redis怎么存儲一對多?
使用list列表存儲

Dubbo:
介紹:
Dubbo是一款遠程調用技術,一般用來做SOA架構中表現層與服務層的通信

哪里用到了Dubbo? 怎么使用?
在表現層與服務層通信的時候用到的,在xml文件中配置

Dubbo的底層是什么?
socket

調用關系:
服務容器負責啟動,加載,運行服務提供者。
服務提供者在啟動時,向注冊中心注冊自己提供的服務。
服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者。
服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心

采用了什么設計模式?
工廠模式, 裝飾着模式, 觀察者模式, 代理模式

zookeper:
介紹:
是注冊中心

哪里用到了zookeper? 怎么用?
在表現層與服務層通信的時候


ActivMQ:
介紹:
是一個消息隊列,有兩個通知模式,點對點和廣播訂閱

哪里用到的? 怎么用?
solr索引庫的更新

並發問題:
悲觀鎖與樂觀鎖:
悲觀鎖:

樂觀鎖:
使用數據版本,這是樂觀鎖的一種實現方式,就是為數據增加版本標識;
一般是往數據庫的表中增加一個數字類型的字段(version);
當讀取數據時,將version字段一起讀出,數據每更新一次,對這個version的值加1
當提交跟新時,判斷數據表中對應的version值與第一次取出來的version值是否一致,
如果一致則跟新,如果不一致則認為是過期數據,不允許跟新

目前沒有答案的問題
為什么你們電商項目用redis而不用memcache?

redis的執行流程?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM