基礎部分:
statement和PreparedStatement的區別
statement是針對一次性存取操做時用的對象
PreparedStatement是針對批量存取效率高,
由於PreparedStatement是預編譯 而 statement是每次執行相關數據庫都要進行一次sql編譯前端
XML的解析方式?
DOM和SAX
DOM解析是一行一行來解析因此效率低,可是不耗內存
SAX解析是一會兒所有加載到內存中,效率高,可是耗內存java
mysql的索引構建?
1)普通索引:index
容許出現相同的索引內容mysql
2)惟一索引:unique
不能夠出現相同的值,但能夠有null值正則表達式
3)主鍵索引:primary_key
不能夠有相同的值,且不能夠有null值,一個表只能有一個primary_key索引redis
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);spring
2)CREATE INDEX 可對錶增長普通索引或UNIQUE索引---注意!只能添加普通索引和惟一索引
好比: CREATE INDEX 索引名 ON 表名 (字段名)
CREATE UNIQUE INDEX 索引名 ON 表名 (字段名) sql
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的執行流程?