網(wǎng)絡
http header ,Cookie和Session的區(qū)別?分別是用于什么場景?優(yōu)缺點?

session 在服務器端,cookie 在客戶端(瀏覽器)
session 的運行依賴 session id,而 session id 是存在 cookie 中的,也就是說,如果瀏覽器禁用了 cookie ,同時 session 也會失效(但是可以通過其它方式實現(xiàn),比如在 url 中傳遞 session_id)
http1.0、1.1和http2.0區(qū)別
HTTP1.0和HTTP1.1的一些區(qū)別
1.緩存處理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires來做為緩存判斷的標準,HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。
2.帶寬優(yōu)化及網(wǎng)絡連接的使用,HTTP1.0中,不支持斷點續(xù)傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發(fā)者自由的選擇以便于充分利用帶寬和連接。 錯誤通知的管理,在HTTP1.1中新增了24個錯誤狀態(tài)響應碼,如409(Conflict)表示請求的資源與資源的當前狀態(tài)發(fā)生沖突;410(Gone)表示服務器上的某個資源被永久性的刪除。
3.Host頭處理,在HTTP1.0中認為每臺服務器都綁定一個唯一的IP地址,因此,請求消息中的URL并沒有傳遞主機名(hostname)。HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。
4.長連接,HTTP 1.1支持長連接(PersistentConnection)和請求的流水線(Pipelining)處理,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲,在HTTP1.1中默認開啟Connection: keep-alive,一定程度上彌補了HTTP1.0每次請求都要創(chuàng)建連接的缺點。
HTTP2.0和HTTP1.X相比的新特性
1.新的二進制格式(Binary Format)HTTP1.x的解析是基于文本存在缺陷,HTTP2.0的協(xié)議解析決定采用二進制格式。
2.header壓縮,HTTP1.x的header帶有大量信息,而且每次都要重復發(fā)送,HTTP2.0使用encoder來減少需要傳輸?shù)膆eader大小,通訊雙方各自cache一份header fields表,既避免了重復header的傳輸,又減小了需要傳輸?shù)拇笮 ?/p>
3.多路復用(MultiPlexing),讓所有數(shù)據(jù)流共用同一個連接,可以更有效地使用 TCP 連接。
4.服務端推送(server push),提前緩存可能需要的文件。
http協(xié)議? POST和GET的區(qū)別
GET:從服務器上獲取數(shù)據(jù),也就是所謂的查,僅僅是獲取服務器資源,不進行修改。
POST:向服務器提交數(shù)據(jù),這就涉及到了數(shù)據(jù)的更新,也就是更改服務器的數(shù)據(jù)。
PUT:PUT的英文含義是放置,也就是向服務器新添加數(shù)據(jù),就是所謂的增。
DELETE:從字面意思也能看出,這種方式就是刪除服務器數(shù)據(jù)的過程。
get參數(shù)有長度限制(受限于url長度,具體的數(shù)值取決于瀏覽器和服務器的限制),而post無限制。GET的所有參數(shù)全部包裝在URL中,明文顯示,且服務器的訪問日志會記錄,非常不安全,GET方法是冪等、可緩存的(除非有 Cache-ControlHeader的約束),POST的URL中只有資源路徑,不包含參數(shù),參數(shù)封裝在二進制的數(shù)據(jù)體中,服務器也不會記錄參數(shù),相對安全。所有涉及用戶隱私的數(shù)據(jù)都要用POST傳輸,POST不冪等,(大部分實現(xiàn))不可緩存。
TCP三次握手、四次揮手
建立連接協(xié)議(三次握手):
1.第一次握手:客戶端發(fā)送syn包(syn=x)的數(shù)據(jù)包到服務器,并進入SYN_SEND狀態(tài),等待服務器確認;
2.第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發(fā)送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態(tài);
3.第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發(fā)送確認包ACK(ack=y+1),此包發(fā)送完畢,客戶端和服務器進入ESTABLISHED狀態(tài),完成三次握手。
握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務器才正式開始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP連接都將被一直保持下去。
連接終止協(xié)議(四次握手)
由于TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數(shù)據(jù)發(fā)送任務后就能發(fā)送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數(shù)據(jù)流動,一個TCP連接在收到一個FIN后仍能發(fā)送數(shù)據(jù)。首先進行關閉的一方將執(zhí)行主動關閉,而另一方執(zhí)行被動關閉。
1.第一次揮手:主動關閉方發(fā)送一個FIN,用來關閉主動方到被動關閉方的數(shù)據(jù)傳送,也就是主動關閉方告訴被動關閉方:我已經(jīng)不會再給你發(fā)數(shù)據(jù)了(當然,在fin包之前發(fā)送出去的數(shù)據(jù),如果沒有收到對應的ack確認報文,主動關閉方依然會重發(fā)這些數(shù)據(jù)),但是,此時主動關閉方還可以接受數(shù)據(jù)。
2.第二次揮手:被動關閉方收到FIN包后,發(fā)送一個ACK給對方,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號, SYN 和 FIN 都有seq序號)。
3.第三次揮手:被動關閉方發(fā)送一個FIN,用來關閉被動關閉方到主動關閉方的數(shù)據(jù)傳送,也就是告訴主動關閉方,我的數(shù)據(jù)也發(fā)送完了,不會再給你發(fā)數(shù)據(jù)了。
4.第四次揮手:主動關閉方收到FIN后,發(fā)送一個ACK給被動關閉方,確認序號為收到序號+1,至此,完成四次揮手。
http keep alive http://a280606790.iteye.com/blog/1095085
1、什么是Keep-Alive模式?
我們知道HTTP協(xié)議采用“請求-應答”模式,當使用普通模式,即非KeepAlive模式時,每個請求/應答客戶和服務器都要新建一個連接,完成 之后立即斷開連接(HTTP協(xié)議為無連接的協(xié)議);當使用Keep-Alive模式(又稱持久連接、連接重用)時,Keep-Alive功能使客戶端到服 務器端的連接持續(xù)有效,當出現(xiàn)對服務器的后繼請求時,Keep-Alive功能避免了建立或者重新建立連接。http 1.0中默認是關閉的,需要在http頭加入"Connection:? Keep-Alive",才能啟用Keep-Alive;http 1.1中默認啟用Keep-Alive,如果加入"Connection:? close? ",才關閉。目前大部分瀏覽器都是用http1.1協(xié)議,也就是說默認都會發(fā)起Keep-Alive的連接請求了,所以是否能完成一個完整的Keep- Alive連接就看服務器設置情況。
2、啟用Keep-Alive的優(yōu)點
從上面的分析來看,啟用Keep-Alive模式肯定更高效,性能更高。因為避免了建立/釋放連接的開銷。
3、回到我們的問題(即如何判斷消息內(nèi)容/長度的大小?)
Keep-Alive模式,客戶端如何判斷請求所得到的響應數(shù)據(jù)已經(jīng)接收完成(或者說如何知道服務器已經(jīng)發(fā)生完了數(shù)據(jù))?我們已經(jīng)知道 了,Keep-Alive模式發(fā)送玩數(shù)據(jù)HTTP服務器不會自動斷開連接,所有不能再使用返回EOF(-1)來判斷(當然你一定要這樣使用也沒有辦法,可 以想象那效率是何等的低)!下面我介紹兩種來判斷方法。
3.1、使用消息首部字段Conent-Length
故名思意,Conent-Length表示實體內(nèi)容長度,客戶端(服務器)可以根據(jù)這個值來判斷數(shù)據(jù)是否接收完成。但是如果消息中沒有Conent-Length,那該如何來判斷呢?又在什么情況下會沒有Conent-Length呢?請繼續(xù)往下看……
3.2、使用消息首部字段Transfer-Encoding
當客戶端向服務器請求一個靜態(tài)頁面或者一張圖片時,服務器可以很清楚的知道內(nèi)容大小,然后通過Content-length消息首部字段告訴客戶端 需要接收多少數(shù)據(jù)。但是如果是動態(tài)頁面等時,服務器是不可能預先知道內(nèi)容大小,這時就可以使用Transfer-Encoding:chunk模式來傳輸 數(shù)據(jù)了。即如果要一邊產(chǎn)生數(shù)據(jù),一邊發(fā)給客戶端,服務器就需要使用"Transfer-Encoding:? chunked"這樣的方式來代替Content-Length。
Linux
https://blog.csdn.net/xiaomingdetianxia/article/details/77894371
一行shell殺死進程
kill -s 9 `ps -ef | grep i2c_no_log_fan | grep -v "grep" | awk '{print $2}'`
查看某一進程下面所有線程的性能指標(top -p 4361 -H)ps -eLf 查看所有所有進程的所有線程
一個文件中,id列/行 統(tǒng)計數(shù)值出現(xiàn)的次數(shù)并排序 http://blog.csdn.net/xunmengpiaoyun/article/details/27174501
cat datafile? | awk '{print $1}'? |? sort | uniq -c | sort -k 1 -n -r | wc -l > result.txt
使用sed,awk,acc等技術(shù)取出test.txt第二行第二列的字段,并追加到text.text的最后(不能用>>)
Java
https://blog.csdn.net/as6757uyy65uy75/article/details/79370686
什么是多態(tài)
方法要有繼承,要有重寫;對象要有父類引用指向子類對象
java類的成員初始化順序和初始化塊知識
屬性、方法、構(gòu)造方法和自由塊都是類中的成員,在創(chuàng)建類的對象時,類中各成員的執(zhí)行順序:
1.父類靜態(tài)成員和靜態(tài)初始化快,按在代碼中出現(xiàn)的順序依次執(zhí)行。
2.子類靜態(tài)成員和靜態(tài)初始化塊,按在代碼中出現(xiàn)的順序依次執(zhí)行。
3. 父類的實例成員和實例初始化塊,按在代碼中出現(xiàn)的順序依次執(zhí)行。
4.執(zhí)行父類的構(gòu)造方法。
5.子類實例成員和實例初始化塊,按在代碼中出現(xiàn)的順序依次執(zhí)行。
6.執(zhí)行子類的構(gòu)造方法。
修飾符有四種:public、protected、默認、private。
public:表示所有其他類都可以訪問。
protected:當前類或子類可以訪問,同時相同包內(nèi)的其他類也可以訪問protected成員;
default :默認(沒有修飾符):表示本包內(nèi)可以使用
private:表示的是在本類內(nèi)可以使用;其子類不能訪問,更不能允許跨包訪問。
Volatile的作用?Synchronized修飾靜態(tài)變量和普通變量的區(qū)別?java線程池的實現(xiàn)原理?
靜態(tài)變量,非靜態(tài)變量
用static修飾的變量叫靜態(tài)變量。靜態(tài)變量不需要new出對象引用來調(diào)用,它可以直接用類名直接調(diào)用。當然用對象引用也能調(diào)它,只是不需要。
非靜態(tài)變量則必須用對象引用進行調(diào)用。
靜態(tài)變量在內(nèi)存空間中只有一份,也永遠只有一份。大家共享。
非靜態(tài)變量只要new出一個對象引用就會在內(nèi)存中分配一份空間給它。
并且他兩的存放地點不一樣,靜態(tài)變量存放在??臻g。非靜態(tài)變量存放在堆空間里。
Java try里面有return語句,finally是否會執(zhí)行,是在return前還是return后執(zhí)行:finally語句是在try的return語句執(zhí)行之后,return返回之前執(zhí)行。
多線程的適用場景?實現(xiàn)方法?
線程或者說多線程,是我們處理多任務的強大工具。線程和進程是不同的,每個進程都是一個獨立運行的程序,擁有自己的變量,且不同進程間的變量不能共享;而線程是運行在進程內(nèi)部的,每個正在運行的進程至少有一個線程,而且不同的線程之間可以在進程范圍內(nèi)共享數(shù)據(jù)。也就是說進程有自己獨立的存儲空間,而線程是和它所屬的進程內(nèi)的其他線程共享一個存儲空間。線程的使用可以使我們能夠并行地處理一些事情。線程通過并行的處理給用戶帶來更好的使用體驗,比如你使用的郵件系統(tǒng)(outlook、Thunderbird、foxmail等),你當然不希望它們在收取新郵件的時候,導致你連已經(jīng)收下來的郵件都無法閱讀,而只能等待收取郵件操作執(zhí)行完畢。這正是線程的意義所在。
實現(xiàn)線程的方式有四種:
https://www.cnblogs.com/itzyz/p/11077091.html
繼承java.lang.Thread類,并重寫它的run()方法,將線程的執(zhí)行主體放入其中。
實現(xiàn)java.lang.Runnable接口,實現(xiàn)它的run()方法,并將線程的執(zhí)行主體放入其中。
實現(xiàn)Callable接口通過FutureTask包裝器來創(chuàng)建Thread線程
使用ExecutorService、Callable、Future實現(xiàn)有返回結(jié)果的線程
實際題目:有4000個任務,需要快速處理,怎么用多線程的知識進行處理?
方案一:Redis集群,將任務數(shù)據(jù)相關內(nèi)容提前發(fā)布到redis,到了一定時間把流量打開,這時候緩存已經(jīng)準備好了。使用servlet,springMVC,多開出一些節(jié)點來滿足高并發(fā)的開銷
方案二:分布式系統(tǒng),MAS,reactive,eventsourcing,CQRS。并發(fā)意味著數(shù)據(jù)競爭+線程之間的時間上無序。VertX或者Akka
java 線程狀態(tài)類型:
1. 新建狀態(tài)(New):新創(chuàng)建了一個線程對象。
2. 就緒狀態(tài)(Runnable):線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權(quán)。
3. 運行狀態(tài)(Running):就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼。
4. 阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因為某種原因放棄CPU使用權(quán),暫時停止運行。直到線程進入就緒狀態(tài),才有機會轉(zhuǎn)到運行狀態(tài)。阻塞的情況分三種:
(一)、等待阻塞:運行的線程執(zhí)行wait()方法,JVM會把該線程放入等待池中。
(二)、同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。
(三)、其他阻塞:運行的線程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。當sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。
5. 死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。
死鎖的四個必要條件?
程序中必須同時滿足以下四個條件才會引發(fā)死鎖:
互斥(Mutual exclusion):
線程所使用的資源中至少有一個是不能共享的,它在同一時刻只能由一個線程使用。
持有與等待(Hold and wait):
至少有一個線程已經(jīng)持有了資源,并且正在等待獲取其他的線程所持有的資源。
非搶占式(No pre-emption):
如果一個線程已經(jīng)持有了某個資源,那么在這個線程釋放這個資源之前,別的線程不能把它搶奪過去使用。
循環(huán)等待(Circular wait):
假設有N個線程在運行,第一個線程持有了一個資源,并且正在等待獲取第二個線程持有的資源,而第二個線程正在等待獲取第三個線程持有的資源,依此類推……第N個線程正在等待獲取第一個線程持有的資源,由此形成一個循環(huán)等待。
wait和sleep的區(qū)別。哪一個會釋放對象鎖?
1、對于sleep()方法,我們首先要知道該方法是屬于Thread類中的。而wait()方法,則是屬于Object類中的。
2、在調(diào)用sleep()方法的過程中,線程不會釋放對象鎖。而當調(diào)用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調(diào)用notify()方法后本線程才進入對象鎖定池準備獲取對象鎖進入運行狀態(tài)。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用(使用范圍)
synchronized(x){
x.notify()
//或者wait()
}
4、sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
Java集合框架的基礎接口有哪些?
Collection為集合層級的根接口。一個集合代表一組對象,這些對象即為它的元素。Java平臺不提供這個接口任何直接的實現(xiàn)。
Set是一個不能包含重復元素的集合。這個接口對數(shù)學集合抽象進行建模,被用來代表集合,就如一副牌。
set集合的三種遍歷方式:1.利用迭代器進行 ,迭代遍歷:
Set<Object> sets = new HashSet<Object>();
Iterator<Object> it = set.iterator();
while (it.hasNext()) {
? String str = (String)it.next();
? System.out.println(str);
}
2.for循環(huán)遍歷:
for (String str : sets) {
? ? ? System.out.println(str);
}
3.Set<Object> set = new HashSet<Object>();
foreach循環(huán)遍歷:
for (Object obj: sets) {
? ? ? if(obj instanceof Integer){
? ? ? ? ? ? ? ? int aa= (Integer)obj;
? ? ? ? ? ? }else if(obj instanceof String){
? ? ? ? ? ? ? String aa = (String)obj
? ? ? ? ? ? }
? ? ? ? ? ? ? ……..
}
List是一個有序集合,可以包含重復元素。你可以通過它的索引來訪問任何元素。List更像長度動態(tài)變換的數(shù)組。
Map是一個將key映射到value的對象.一個Map不能包含重復的key:每個key最多只能映射一個value。
方法一:在for循環(huán)中使用entries實現(xiàn)Map的遍歷:
/*** 最常見也是大多數(shù)情況下用的最多的,一般在鍵值對都需要使用
*/Map map =newHashMap();
map.put("熊大", "棕色");
map.put("熊二", "黃色");for(Map.Entry entry : map.entrySet()){
? ? String mapKey = entry.getKey();
? ? String mapValue = entry.getValue();
? ? System.out.println(mapKey+":"+mapValue);
}
方法二:在for循環(huán)中遍歷key或者values,一般適用于只需要map中的key或者value時使用,在性能上比使用entrySet較好;
Map map =newHashMap();
map.put("熊大", "棕色");
map.put("熊二", "黃色");//keyfor(String key : map.keySet()){
? ? System.out.println(key);
}//valuefor(String value : map.values()){
? ? System.out.println(value);
}
方法三:通過Iterator遍歷;
Iterator> entries = map.entrySet().iterator();while(entries.hasNext()){
? ? Entry entry = entries.next();
? ? String key = entry.getKey();
? ? String value = entry.getValue();
? ? System.out.println(key+":"+value);
}
方法四:通過鍵找值遍歷,這種方式的效率比較低,因為本身從鍵取值是耗時的操作;
for(String key : map.keySet()){
? ? String value = map.get(key);
? ? System.out.println(key+":"+value);
}
Map的一般用法:
1.聲明一個Map,Map map = new HashMap();
2 .向map中放值 ,注意: map是key-value的形式存放的,如:map.put("sa","dd");
3 .從map中取值,String str = map.get("sa").toString,結(jié)果是: str = "dd';
一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。
hashtable和hashmap區(qū)別,concurrenthashmap是如何保證線程安全的
HashMap的實現(xiàn)原理
HashMap在Map.Entry靜態(tài)內(nèi)部類實現(xiàn)中存儲key-value對。HashMap使用哈希算法,在put和get方法中,它使用hashCode()和equals()方法。當我們通過傳遞key-value對調(diào)用put方法的時候,HashMap使用Key hashCode()和哈希算法來找出存儲key-value對的索引。Entry存儲在LinkedList中,所以如果存在entry,它使用equals()方法來檢查傳遞的key是否已經(jīng)存在,如果存在,它會覆蓋value,如果不存在,它會創(chuàng)建一個新的entry然后保存。當我們通過傳遞key調(diào)用get方法時,它再次使用hashCode()來找到數(shù)組中的索引,然后使用equals()方法找出正確的Entry,然后返回它的值
hashmap的用法
==和equal的區(qū)別
==比較的是對象的地址,也就是是否是同一個對象;equal比較的是對象的值。
多線程死鎖的原因及解決辦法
http://m.itdecent.cn/p/1b2f63a45476
JVM內(nèi)存分配和優(yōu)化方案。一個tomcat應用總是觸發(fā)full GC,可能情況及如何改正
什么時候會觸發(fā)GC?
>>當Eden區(qū)和From Survivor區(qū)滿時;
>>調(diào)用System.gc時,系統(tǒng)建議執(zhí)行Full GC,但是不必然執(zhí)行
>>年老代空間不足
>>方法區(qū)空間不足
>>通過Minor GC后進入老年代的平均大小大于老年代的可用內(nèi)存 >>由Eden區(qū)、From Space區(qū)向To Space區(qū)復制時,對象大小大于To Space可用內(nèi)存,則把該對象轉(zhuǎn)存到老年代,且老年代的可用內(nèi)存小于該對象大小
Java線程終止方法
在 Java 中有以下 3 種方法可以終止正在運行的線程:
1.使用退出標志,使線程正常退出,也就是當 run() 方法完成后線程中止。
2.控制循環(huán)條件和判斷條件的標識符來結(jié)束掉線程
3.使用 interrupt 方法中斷線程。
String、StringBuffer、StringBuilder
String類中使用字符數(shù)組保存字符串,如下就是,因為有“final”修飾符,所以可以知道string對象是不可變的。StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串,如下就是,可知這兩種對象都是可變的。
String中的對象是不可變的,也就可以理解為常量,顯然線程安全。StringBuffer對方法加了同步鎖或者對調(diào)用的方法加了同步鎖,所以是線程安全的。StringBuilder并沒有對方法進行加同步鎖,所以是非線程安全的。
Spring框架特點
Spring最根本的使命:簡化Java開發(fā)。
控制反轉(zhuǎn)(IOC):Spring使用控制反轉(zhuǎn)技術(shù)實現(xiàn)了松耦合。依賴被注入到對象,而不是創(chuàng)建或?qū)ふ乙蕾噷ο?。負責實例化,定位,配置應用程序中的對象以及建立這些對象間的依賴。get、set方式注入。
面向切面編程(AOP): Spring支持面向切面編程,同時把應用的業(yè)務邏輯與系統(tǒng)的服務分離開來。
Spring的DispatcherServlet作用
Spring Validator作用:校驗器,Spring框架的 validator 組件,是個輔助組件,在進行數(shù)據(jù)的完整性和有效性非常有用
Spring接口的標簽注解有哪些?
@Service用于標注業(yè)務層組件
@Controller用于標注控制層組件(如struts中的action)
@Repository用于標注數(shù)據(jù)訪問組件,即DAO組件
@Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注。
controller的注解有哪些?
@RequestMapping注解是web應用程序中最常被用到的注解之一,作用就是映射URL路徑,將http的請求地址映射到控制器(controller)類的處理方法上。
@RequestMapping注解可以定義在控制器類上,也可以定義在類里面的方法上。
@Autowired? spring可以自動幫你把bean里面引用的對象的setter/getter方法省略,它會自動幫你set/get
Spring是如何調(diào)用到DAO層的
JVM 類加載順序(內(nèi)存劃分、垃圾回收機制)
static 關鍵字?
設計模式用過哪些或者知道哪些
java assert斷言
Java在默認條件下是不啟用的,要啟用就需要在編譯、運行時加上相關的關鍵字
1.可以在預計正常情況下程序不會到達的地方放置斷言 :assert false
2.斷言可以用于檢查傳遞給私有方法的參數(shù)。(對于公有方法,因為是提供給外部的接口,所以必須在方法中有相應的參數(shù)檢驗才能保證代碼的健壯性)
3.使用斷言測試方法執(zhí)行的前置條件和后置條件
4.使用斷言檢查類的不變狀態(tài),確保任何情況下,某個變量的狀態(tài)必須滿足。(如age屬性應大于0小于某個合適值)
如何解析json
運維
nginx 的原理
memchached/redis的區(qū)別
移動端
移動app 碎片化即兼容性測試,cpu、內(nèi)存、耗電、流量等如何測試
Android Fragment和Activity的區(qū)別?
Android 進程優(yōu)先級 舉例子
service 和activity交互的方法
自定義view 有哪些方法重寫,分別干嘛
內(nèi)存溢出 內(nèi)存泄露舉例
listview的優(yōu)化(contentview,加載過程優(yōu)化)與模式改變(上拉,下滑 右滑)
android四種加載模式
操作系統(tǒng)
堆和棧里分別存了什么?
MOCK是如何做的
其他
如何在Java中發(fā)送HTTP GET/POST請求:
1.Java原生HttpURLConnection
2.Apache的HttpClient庫
ioc如何解耦:
簡單來說就是把復雜系統(tǒng)分解成相互合作的對象,這些對象類通過封裝以后,內(nèi)部實現(xiàn)對外部是透明的,從而降低了解決問題的復雜度,而且可以靈活地被重用和擴展。
解耦后能保障業(yè)務不相互干擾嗎?
空指針出現(xiàn)的條件?
1.調(diào)用空對象的實例方法。
2.訪問或修改空對象的字段。
3.將null的長度看作是一個數(shù)組。
4.訪問或修改null的插槽,就像它是一個數(shù)組一樣。
5.如同Throwable值一樣拋出null。
內(nèi)存溢出出現(xiàn)的條件?
接口自動化框架的整體思路
hashmap如何遍歷,如何傳值?
通過Map.keySet遍歷key和value
通過Map.entrySet使用iterator遍歷key和value
通過Map.entrySet遍歷key和value
通過Map.values()遍歷所有的value,但不能遍歷key
壓測如何準備數(shù)據(jù),目標是什么?
java里面的鎖 1.公平鎖 / 非公平鎖 2.可重入鎖 / 不可重入鎖 3.獨享鎖 / 共享鎖 4.互斥鎖 / 讀寫鎖 5.樂觀鎖 / 悲觀鎖 6.分段鎖 7.偏向鎖 / 輕量級鎖 / 重量級鎖 8.自旋鎖
JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意方法和屬性;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為java語言的反射機制。
介紹一下springmvc
核心架構(gòu)的具體流程步驟如下:
1、首先用戶發(fā)送請求——>DispatcherServlet,前端控制器收到請求后自己不進行處理,而是委托給其他的解析器進行處理,作為統(tǒng)一訪問點,進行全局的流程控制;
2、DispatcherServlet——>HandlerMapping,HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象,通過這種策略模式,很容易添加新的映射策略;
3、DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持很多類型的處理器;
4、HandlerAdapter——>處理器功能處理方法的調(diào)用,HandlerAdapter將會根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法,完成功能處理;并返回一個ModelAndView對象(包含模型數(shù)據(jù)、邏輯視圖名);
5、ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver將把邏輯視圖名解析為具體的View,通過這種策略模式,很容易更換其他視圖技術(shù);
6、View——>渲染,View會根據(jù)傳進來的Model模型數(shù)據(jù)進行渲染,此處的Model實際是一個Map數(shù)據(jù)結(jié)構(gòu),因此很容易支持其他視圖技術(shù);
7、返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結(jié)束。
數(shù)據(jù)庫
數(shù)據(jù)庫的四大特性
1. 原子性(Atomicity)
原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾。失敗回滾的操作事務,將不能對事物有任何影響。
2. 一致性(Consistency)
一致性是指事務必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
3. 隔離性(Isolation)
隔離性是指當多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如同時訪問一張表,數(shù)據(jù)庫每一個用戶開啟的事務,不能被其他事務所做的操作干擾,多個并發(fā)事務之間,應當相互隔離。
4. 持久性(Durability)
持久性是指事務的操作,一旦提交,對于數(shù)據(jù)庫中數(shù)據(jù)的改變是永久性的,即使數(shù)據(jù)庫發(fā)生故障也不能丟失已提交事務所完成的改變。
數(shù)據(jù)表中添加一個字段的標準SQL語句寫法為:
alter table ?表名 ?add (字段 ?字段類型) ?[?default ?'輸入默認值']? [null/not null] ?;
舉例:ALTER TABLE employee ?ADD ?spbh varchar(20) NOT NULL Default 0
意思就是在表employee 中加入 字段spbh,該字段的類型是varchar,大小20,并且不允許為空,初始默認值是0。
登錄中,密碼如何加密傳輸
前端代碼加密,后端代碼解密。RSA算法
MySQL中存儲引擎及區(qū)別
InnoDB和MyISAM
寫一個sql語句,查詢兩個關聯(lián)表中的信息,結(jié)果有多行,只輸出一行
mysql的一些概念,如事物、實例、會話:事務(transaction):簡單理解就是一個業(yè)務需求的最小處理單位。會話(session):可以包含N個事務。MySQL實例是線程和內(nèi)存組成,實例才是真正用于操作數(shù)據(jù)庫文件的,一個實例(instance)可以操作多個數(shù)據(jù)庫,故一個會話(session,在操作系統(tǒng)概念里,會話即是線程)可以操作一個實例上的多個數(shù)據(jù)庫。
數(shù)據(jù)庫的四種連表方式
?1)內(nèi)連接:相當于select a.*,b.* from a,b where a.id = b.id
? select ? a.*,b.* ? from ? a ? inner ? join ? b ? ? on ? a.id=b.parent_id ? ?
2)左連接:左表的挨個信息去查詢,查不到則將右邊控制為null進行顯示
? select ? a.*,b.* ? from ? a ? left ? join ? b ? ? on ? a.id=b.parent_id ?
3) 右連接:右表的挨個信息去查詢,查不到則將左邊控制為null進行顯示
? select ? a.*,b.* ? from ? a ? right ? join ? b ? ? on ? a.id=b.parent_id ? ?
4)全連接:
select ? a.*,b.* ? from ? a ? full ? join ? b ? ? on ? a.id=b.parent_id?
數(shù)據(jù)字典意義:數(shù)據(jù)字典通過對數(shù)據(jù)項和數(shù)據(jù)結(jié)構(gòu)的定義來描述數(shù)據(jù)流、數(shù)據(jù)存儲的邏輯內(nèi)容
寬表意義,怎么和代碼結(jié)合
MySql的慢SQL:可以設置slow/long-time-query查看,原因可能是沒有索引,兩個表join時候產(chǎn)生笛卡爾積,鎖或死鎖,單次查詢數(shù)據(jù)量過大。
索引是存儲的表中一個特定列的值數(shù)據(jù)結(jié)構(gòu)(最常見的是B-Tree)使用索引的全部意義就是通過縮小一張表中需要查詢的記錄/行的數(shù)目來加快搜索的速度。
數(shù)據(jù)庫索引的類型 MYSQL數(shù)據(jù)庫索引類型包括普通索引,唯一索引,主鍵索引與組合索引 索引分為聚簇索引和非聚簇索引兩種,聚簇索引是按照數(shù)據(jù)存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對于單行的檢索很快
數(shù)據(jù)庫的鎖 簡單的數(shù)據(jù)庫鎖的大致類型有三種: 共享(S)鎖:多個事務可封鎖一個共享頁;任何事務都不能修改該頁; 通常是該頁被讀取完畢,S鎖立即被釋放。 排它(X)鎖:僅允許一個事務封鎖此頁;其他任何事務必須等到X鎖被釋放才能對該頁進行訪問;X鎖一直到事務結(jié)束才能被釋放。 更新(U)鎖:用來預定要對此頁施加X鎖,它允許其他事務讀,但不允許再施加U鎖或X鎖;當被讀取的頁將要被更新時,則升級為X鎖;U鎖一直到事務結(jié)束時才能被釋放。
為什么要使用MQ?
MQ是一個互聯(lián)網(wǎng)架構(gòu)中常見的解耦利器。
什么時候不使用MQ?上游實時關注執(zhí)行結(jié)果
什么時候使用MQ?
1)數(shù)據(jù)驅(qū)動的任務依賴
2)上游不關心多下游執(zhí)行結(jié)果
3)異步返回執(zhí)行時間長
JDBC與Mybatis區(qū)別
1)從層次上看,JDBC是較底層的持久層操作方式,而Hibernate和MyBatis都是在JDBC的基礎上進行了封裝使其更加方便程序員對持久層的操作。
2)從功能上看,JDBC就是簡單的建立數(shù)據(jù)庫連接,然后創(chuàng)建statement,將sql語句傳給statement去執(zhí)行,如果是有返回結(jié)果的查詢語句,會將查詢結(jié)果放到ResultSet對象中,通過對ResultSet對象的遍歷操作來獲取數(shù)據(jù);Hibernate是將數(shù)據(jù)庫中的數(shù)據(jù)表映射為持久層的Java對象,對sql語句進行修改和優(yōu)化比較困難;MyBatis是將sql語句中的輸入?yún)?shù)和輸出參數(shù)映射為java對象,sql修改和優(yōu)化比較方便.
3)從使用上看,如果進行底層編程,而且對性能要求極高的話,應該采用JDBC的方式;如果要對數(shù)據(jù)庫進行完整性控制的話建議使用Hibernate;如果要靈活使用sql語句的話建議采用MyBatis框架。
https://blog.csdn.net/weixin_47555380/article/details/107822353
java 跨平臺特性怎么實現(xiàn)的?
主要得益于Java虛擬機(JVM),JVM解釋器在運行Java應用時根據(jù)當前平臺進行解釋,解釋成符合當前平臺規(guī)范的機器碼,所以可以實現(xiàn)同樣的應用在不同平臺上都能運行。
java 為什么那么定義多報錯類型
把不同業(yè)務場景產(chǎn)生的異常,? 定義成不同的類型,方便定位錯誤