Java知識點總結

Java知識點1、==和equals的區(qū)別基本類型比較==比較內(nèi)容 equals比較地址值引用類型比較==比較地址值 equals比較地址值在String類中equals比較內(nèi)容2、形參和實參的區(qū)別形參 是在定義函數(shù)名和函數(shù)體的時候使用的參數(shù),用來接受調(diào)用該函數(shù)時傳遞的參數(shù)實參 是在調(diào)用函數(shù)時傳遞的參數(shù)特點: 形參只有在被調(diào)用時才分配內(nèi)存單元,再調(diào)用結束時立即釋放所分配的內(nèi)存單元實參可以是常量 變量 函數(shù)等 必須有確定的值值傳遞:方法調(diào)用時,實參把他對應的值傳遞給對應的形參,方法中執(zhí)行形參的改變而不影響實參引用傳遞: 傳的是地址值,方法調(diào)用時 實參的引用被傳遞給方法中對應的形參 在方法中執(zhí)行對形參的操作就是對實參的操作3、final的特點Java關鍵字final有“這是無法改變的”或者“終態(tài)的”含義,它可以修飾非 抽象類、非抽象類成員方法和變量。final類不能被繼承,沒有子類,final類中的方法默認是final的。final方法不能被子類的方法覆蓋,但可以被繼承。final成員變量表示常量,只能被賦值一次,賦值后值不再改變。final不能用于修飾構造方法。4、final、finally、finallize的區(qū)別final 最終的不可改變的 修飾符finally 在try chech 中出現(xiàn) 代表一定執(zhí)行代碼塊finallize Object的方法 System類的gc方法在清理內(nèi)存是調(diào)用他用于回收垃圾5、android有哪些新集合,有什么特點Api=23 ArraySet 集合 實現(xiàn)Collection和set集合升序 不可重復SparseArrayApi=19ArrayMap 集合 實現(xiàn)Map集合 final不可被繼承鍵必須是引用類型底層是value數(shù)組 無序通過鍵的hashcode值找value- ArrayMap它不是一個適應大數(shù)據(jù)的數(shù)據(jù)結構,相比傳統(tǒng)的HashMap速度要慢,因為查找方法是二分法,并且當你刪除或者添加數(shù)據(jù)時,會對空間重新調(diào)整,在使用大量數(shù)據(jù)時,效率并不明顯,低于50%。所以ArrayMap是犧牲了時間換區(qū)空間。在寫手機app時,適時的使用ArrayMap,會給內(nèi)存使用帶來可觀的提升。- ArraySet- SparseArray1,SparseArray的原理是二分檢索法,也因此key的類型都是整型。2,(HashMap和SparseArray比較)當存儲大量數(shù)據(jù)(起碼上千個)的時候,優(yōu)先選擇HashMap。如果只有幾百個,用哪個區(qū)別不大。如果數(shù)量不多,優(yōu)先選擇SparseArray。3,SparseArray有自己的垃圾回收機制。(當數(shù)量不是很多的時候,這個不必關心。)- SparseBooleanArray- SparseIntArraySparseBooleanArray和SparseIntArray,其實看名字也知道,它們跟SparseArray極其類似,只是存儲類型加以限制了。SparseBooleanArray只能存儲boolean值,而SparseIntArray只能存儲integer類型的值。它們也同樣實現(xiàn)了Cloneable接口,可以直接調(diào)用clone方法,也同樣是以二分法為依據(jù)。- SparseLongArray6、新IO是什么,有什么特點新IO和傳統(tǒng)IO都是用于進行輸入/輸出,相比于傳統(tǒng)IO面向流的處理方式,新IO采用內(nèi)存映射文件來處理輸入/輸出,新IO將文件或文件的一段區(qū)域映射到內(nèi)存中,這樣就可以像訪問內(nèi)存一樣來訪問文件了,所以這種訪問方式既方便又快得多。新IO中的兩個核心對象:Channel(通道)和Buffer(緩沖)。Channel用于新IO的數(shù)據(jù)傳輸,相對于傳統(tǒng)IO中的InputStream和OutputStream,Channel提供了一個map()方法用來將一段數(shù)據(jù)映射成為一塊內(nèi)存。也就是在新IO中,改變了傳統(tǒng)IO面向流的處理而轉(zhuǎn)向面向塊的處理方式。Buffer是一個容器,它的本質(zhì)是一個數(shù)組。發(fā)送到Channel的所有對象以及從Channel取出的所有數(shù)據(jù)先存放到Buffer中。除了上面兩個核心對象外,新IO還提供了Charset類用于將Unicode字符串映射成字節(jié)序列以及逆映射操作。以及Selector類用于支持非阻塞式輸入輸出。java.nio.ByteBuffer字節(jié)的Bufferjava.nio.CharBuffer字符的Bufferjava.nio.ShortBuffer短整數(shù)的Bufferjava.nio.IntBuffer整數(shù)的Bufferjava.nio.LongBUffer長整數(shù)的Bufferjava.nio.FloatBuffer單精度的Bufferjava.nio.DoubleBuffer雙精度的Bufferallocate(int allocate)設置緩沖區(qū)大小put(int[] value)添加元素flip()重設緩沖區(qū)7、TreeSet是如何進行排序的?自然排序:要在自定義類中實現(xiàn)Comparerable接口 ,并且重寫compareTo方法比較器排序:在自定義類中實現(xiàn)Comparetor接口,重寫compare方法8、什么是線程線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。9、線程都有哪些狀態(tài)?新建->以創(chuàng)建 還未調(diào)用start方法就緒->調(diào)用start方法 還未搶占到cpu的執(zhí)行權執(zhí)行->搶占到cpu的執(zhí)行權執(zhí)行代碼阻塞->執(zhí)行過程中得其他線程 搶占了cpu死亡->線程執(zhí)行完畢10、什么是線程池? 線程池是指在初始化一個多線程應用程序過程中創(chuàng)建一個線程集合,然后在需要執(zhí)行新的任務時重用這些線程而不是新建一個線程 。線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創(chuàng)建線程后自動啟動這些任務。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優(yōu)先級運行,并處于多線程單元中。11、線程和進程的區(qū)別線程是指進程內(nèi)的一個執(zhí)行單元,也是進程內(nèi)的可調(diào)度實體.與進程的區(qū)別:(1)地址空間:進程內(nèi)的一個執(zhí)行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有自己獨立的地址空間;(2)資源擁有:進程是資源分配和擁有的單位,同一個進程內(nèi)的線程共享進程的資源(3)線程是處理器調(diào)度的基本單位,但進程不是. (4)二者均可并發(fā)執(zhí)行.進程和線程都是由操作系統(tǒng)所體會的程序運行的基本單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應用的并發(fā)性。進程和線程的區(qū)別在于:簡而言之,一個程序至少有一個進程,一個進程至少有一個線程. 線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高。 另外,進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。 線程在執(zhí)行過程中與進程還是有區(qū)別的。每個獨立的線程有一個程序運行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨立執(zhí)行,必須依存在應用程序中,由應用程序提供多個線程執(zhí)行控制。 從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統(tǒng)并沒有將多個線程看做多個獨立的應用,來實現(xiàn)進程的調(diào)度和管理以及資源分配。這就是進程和線程的重要區(qū)別。進程是具有一定獨立功能的程序關于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位. 線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源. 一個線程可以創(chuàng)建和撤銷另一個線程;同一個進程中的多個線程之間可以并發(fā)執(zhí)行.12、如何在Java中實現(xiàn)線程?1、繼承Thread類實現(xiàn)多線程繼承Thread類的方法盡管被我列為一種多線程實現(xiàn)方式,但Thread本質(zhì)上也是實現(xiàn)了Runnable接口的一個實例,它代表一個線程的實例,并且,啟動線程的唯一方法就是通過Thread類的start()實例方法。start()方法是一個native方法,它將啟動一個新線程,并執(zhí)行run()方法。這種方式實現(xiàn)多線程很簡單,通過自己的類直接extend Thread,并復寫run()方法,就可以啟動新線程并執(zhí)行自己定義的run()方法。2、實現(xiàn)Runnable接口方式實現(xiàn)多線程如果自己的類已經(jīng)extends另一個類,就無法直接extends Thread,此時,必須實現(xiàn)一個Runnable接口3、使用ExecutorService、Callable、Future實現(xiàn)有返回結果的多線程ExecutorService、Callable、Future這個對象實際上都是屬于Executor框架中的功能類??煞祷刂档娜蝿毡仨殞崿F(xiàn)Callable接口,類似的,無返回值的任務必須Runnable接口。執(zhí)行Callable任務后,可以獲取一個Future的對象,在該對象上調(diào)用get就可以獲取到Callable任務返回的Object了,再結合線程池接口ExecutorService就可以實現(xiàn)傳說中有返回結果的多線程了。 13、Thread 類中的 start() 和 run() 方法有什么區(qū)別?調(diào)用start方法方可啟動線程,而run方法只是thread的一個普通方法調(diào)用,還是在主線程里執(zhí)行。這兩個方法應該都比較熟悉,把需要并行處理的代碼放在run()方法中,start()方法啟動線程將自動調(diào)用 run()方法,這是由jvm的內(nèi)存機制規(guī)定的。并且run()方法必須是public訪問權限,返回值類型為void.。14、線程池的最大線程數(shù)是多少?答: 不同的任務類別應采用不同規(guī)模的線程池,任務類別可劃分為CPU密集型任務|密集型任務和混合型任務。[N代表CPU個數(shù)]對于CPU密集型任務: 線程池中線程個數(shù)應盡量少,如配置M+1個線程的線程池;對于IO密集型任務: 由于IO操作速度遠低于CPU速度,那么在運行這類任務時,CPU絕大多數(shù)時間處于空閑狀態(tài),那么線程池可以配置盡量多些的線程,以提高CPU利用率,如2*N;對于混合型任務: 可以拆分為CPU密集型任務和IO密集型任務,當這兩類任務執(zhí)行時間相差無幾時,通過拆分再執(zhí)行的吞吐率高于串行執(zhí)行的吞吐率,但若這兩類任務執(zhí)行時間有數(shù)據(jù)級的差距,那么沒有拆分的意義。15、HandlerThread是什么?HandlerThread = Handler + Thread + LooperHandlerThread是一個內(nèi)部有Looper的Thread1)HandlerThread本質(zhì)上是一個線程類,它繼承了Thread。2)HandlerThread有自己的內(nèi)部Looper對象,可以進行l(wèi)ooper循環(huán)。3)通過獲取HandlerThread的Looper對象傳遞給Handler對象,可以在handleMessae方法中執(zhí)行異步任務。4)優(yōu)點是不會有堵塞,減少了對性能的消耗。5)缺點是不能同時進行多任務處理,需要進行等待,處理效率較低。6)與線程池側重并發(fā)不同,HandlerThread是一個串行隊列,HandlerThread背后只有一個線程。16、HandlerThread 的原理HandlerThread繼承自Thread,因此在run()中的邏輯都是在子線程中運行的。接下來就是兩個關鍵的方法,run()和getLooper(): run()中可以看到是很簡單的創(chuàng)建Looper以及讓Looper工作的邏輯。 run()里面當mLooper創(chuàng)建完成后有個notifyAll(),getLooper()中有個wait(),這有什么用呢?因為的mLooper在一個線程中執(zhí)行創(chuàng)建,而我們的handler是在UI線程中調(diào)用getLooper()初始化的。 也就是說,我們必須等到mLooper創(chuàng)建完成,才能正確的返回。getLooper();wait(),notify()就是為了解決這兩個線程的同步問題。17、用 Runnable 還是 Thread ?實現(xiàn)Runnable接口比繼承Thread類所具有的優(yōu)勢:1):適合多個相同的程序代碼的線程去處理同一個資源2):可以避免java中的單繼承的限制3):增加程序的健壯性,代碼可以被多個線程共享,代碼和數(shù)據(jù)獨立18、Runnable 和 Callable 有什么不同?在Java5之后,任務分兩類:一類是實現(xiàn)了Runnable接口的類,一類是實現(xiàn)了Callable接口的類。兩者都可以被 ExecutorService執(zhí)行,但是Runnable任務沒有返回值,而Callable任務有返回值。并且Callable的call()方法只能通過ExecutorService的(task) 方法來執(zhí)行,并且返回一個,是表示任務等待完成的 Future。public interface Callable返回結果并且可能拋出異常的任務。實現(xiàn)者定義了一個不帶任何參數(shù)的叫做 call 的方法。Callable 接口類似于,兩者都是為那些其實例可能被另一個線程執(zhí)行的類設計的。但是 Runnable 不會返回結果,并且無法拋出經(jīng)過檢查的異常。類包含一些從其他普通形式轉(zhuǎn)換成 Callable 類的實用方法。Callable中的call()方法類似Runnable的run()方法,就是前者有返回值,后者沒有。當將一個Callable的對象傳遞給ExecutorService的submit方法,則該call方法自動在一個線程上執(zhí)行,并且會返回執(zhí)行結果Future對象。同樣,將Runnable的對象傳遞給ExecutorService的submit方法,則該run方法自動在一個線程上執(zhí)行,并且會返回執(zhí)行結果Future對象,但是在該Future對象上調(diào)用get方法,將返回null。19、使用多線程的優(yōu)缺點優(yōu)點(1)多線程技術使程序的響應速度更快 ,因為用戶界面可以在進行其它工作的同時一直處于活動狀態(tài);(2)當前沒有進行處理的任務時可以將處理器時間讓給其它任務;(3)占用大量處理時間的任務可以定期將處理器時間讓給其它任務;(4)可以隨時停止任務;(5)可以分別設置各個任務的優(yōu)先級以優(yōu)化性能。缺點(1)等候使用共享資源時造成程序的運行速度變慢。(2)對線程進行管理要求額外的 CPU開銷。(3)線程的死鎖。(4)對公有變量的同時讀或?qū)憽?0、wait()、notify()、notifyAll()的區(qū)別Object類里的方法,可以用來控制線程的狀態(tài)。這三個方法最終調(diào)用的都是jvm級的native方法。隨著jvm運行平臺的不同可能有些許差異。 如果對象調(diào)用了wait方法就會使持有該對象的線程把該對象的控制權交出去,然后處于等待狀態(tài)。 如果對象調(diào)用了notify方法就會通知某個正在等待這個對象的控制權的線程可以繼續(xù)運行。 如果對象調(diào)用了notifyAll方法就會通知所有等待這個對象控制權的線程繼續(xù)運行。21、wait() 與 Thread.sleep(long time) 的區(qū)別wait()方法睡眠沒有其他線程喚醒他就不會重新啟動釋放同步鎖不需要捕捉異常Thread.sleep(long time) 方法睡眠 會指定睡眠時間 自動喚醒不釋放同步鎖需要捕捉異常22、volatile關鍵字的作用操作數(shù)據(jù)對其他線程可見禁止重排序保證有序性23、join方法的作用當前線程調(diào)用其他線程的join(加入執(zhí)行)當前線程會等待加入的線程執(zhí)行完畢繼續(xù)執(zhí)行24、yield方法的作用Thread.yield()方法作用是:暫停當前正在執(zhí)行的線程對象,并執(zhí)行其他線程。yield()應該做的是讓當前運行線程回到可運行狀態(tài),以允許具有相同優(yōu)先級的其他線程獲得運行機會。因此,使用yield()的目的是讓相同優(yōu)先級的線程之間能適當?shù)妮嗈D(zhuǎn)執(zhí)行。但是,實際中無法保證yield()達到讓步目的,因為讓步的線程還有可能被線程調(diào)度程序再次選中。25、線程池的優(yōu)點1.減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷 2.如不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量線程而導致消耗完系統(tǒng)內(nèi)存以及”過度切換”。26、有幾種線程池,分別是什么?Java通過Executors提供四種線程池,分別為:newCachedThreadPool創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。newFixedThreadPool 創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待。newScheduledThreadPool 創(chuàng)建一個定長線程池,支持定時及周期性任務執(zhí)行。newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務,保證所有任務按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。27、如何關閉線程池?方法定義:public void shutdown()(1)線程池的狀態(tài)變成SHUTDOWN狀態(tài),此時不能再往線程池中添加新的任務,否則會拋出RejectedExecutionException異常。(2)線程池不會立刻退出,直到添加到線程池中的任務都已經(jīng)處理完成,才會退出。 注意這個函數(shù)不會等待提交的任務執(zhí)行完成,要想等待全部任務完成,可以調(diào)用:public boolean awaitTermination(longtimeout, TimeUnit unit)方法定義:public ListshutdownNow()

(1)線程池的狀態(tài)立刻變成STOP狀態(tài),此時不能再往線程池中添加新的任務。

(2)終止等待執(zhí)行的線程,并返回它們的列表;

(3)試圖停止所有正在執(zhí)行的線程,試圖終止的方法是調(diào)用Thread.interrupt(),但是大家知道,如果線程中沒有sleep 、wait、Condition、定時鎖等應用, interrupt()方法是無法中斷當前的線程的。所以,ShutdownNow()并不代表線程池就一定立即就能退出,它可能必須要等待所有正在執(zhí)行的任務都執(zhí)行完成了才能退出。

28、如何關閉線程?

29、1、 使用退出標志,使線程正常退出,也就是當run方法完成后線程終止。

30、2、 使用stop方法強行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發(fā)生不可預料的結果)。

31、3、 使用interrupt方法中斷線程。

32、4、 拋出異常

33、什么是 Executor 框架?

Eexecutor作為靈活且強大的異步執(zhí)行框架,其支持多種不同類型的任務執(zhí)行策略,提供了一種標準的方法將任務的提交過程和執(zhí)行過程解耦開發(fā),基于生產(chǎn)者-消費者模式,其提交任務的線程相當于生產(chǎn)者,執(zhí)行任務的線程相當于消費者,并用Runnable來表示任務,Executor的實現(xiàn)還提供了對生命周期的支持,以及統(tǒng)計信息收集,應用程序管理機制和性能監(jiān)視等機制。

30、Executors 類是什么?

Executors為Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable類提供了一些工具方法。

Executors可以用于方便的創(chuàng)建線程池。

31、Handler原理|如何進行線程間通信?

當創(chuàng)建Handler時將通過ThreadLocal在當前線程綁定一個Looper對象,而Looper持有MessageQueue對象。執(zhí)行Handler.sendMessage(Message)方法將一個待處理的Message插入到MessageQueue中,這時候通過Looper.loop()方法獲取到隊列中Message,然后再交由Handler.handleMessage(Message)來處理。

32、String、StringBuffer、StringBuilder的區(qū)別

1.可變與不可變

String類中使用字符數(shù)組保存字符串,如下就是,因為有“final”修飾符,所以可以知道string對象是不可變的。

StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數(shù)組保存字

符串,如下就是,可知這兩種對象都是可變的。

2.是否多線程安全

String中的對象是不可變的,也就可以理解為常量,顯然線程安全。

StringBuffer對方法加了同步鎖或者對調(diào)用的方法加了同步鎖,所以是線程安全的

StringBuilder并沒有對方法進行加同步鎖,所以是非線程安全的。

33、冒泡排序、選擇排序、二叉樹排序

冒泡排序:

相鄰的兩個數(shù)比較,將小數(shù)放在前面,大數(shù)放在后面

選擇排序:

每一從待排序的數(shù)據(jù)元素中選出最小的一個元素,存放在序列的起始位置,依次比較,直到全部待排序的數(shù)據(jù)元素排完。

二叉樹排序:

左子樹不為空,則左子樹上所有節(jié)點的值均小于它的根節(jié)點的值。

右子樹不為空,則右子樹上所有節(jié)點的值均大于它的根節(jié)點的值。

34、異常的繼承體系

35、介紹封裝、繼承、多態(tài)

封裝,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏

面向?qū)ο缶幊?(OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展。 繼承現(xiàn)有類 + 擴展

多態(tài)性(polymorphisn)是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據(jù)當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。

36、類與接口的區(qū)別

抽象類是用來捕捉子類的通用特性的 。它不能被實例化,只能被用作子類的超類。抽象類是被用來創(chuàng)建繼承層級里子類的模板。

接口是抽象方法的集合。如果一個類實現(xiàn)了某個接口,那么它就繼承了這個接口的抽象方法。這就像契約模式,如果實現(xiàn)了這個接口,那么就必須確保使用這些方法。接口只是一種形式,接口自身不能做任何事情。

37、接口能否寫方法體?

可以,java8的接口新特性中可以寫默認方法

38、集合子類的特點

Collection

|-->List:有序,可重復,有索引

|-->ArrayList:底層是數(shù)組數(shù)據(jù)結構(具有連續(xù)性,查詢元素速度快但是增刪元素速度低),是線程不同步的

|-->LinkList:底層是鏈表數(shù)據(jù)結構(查詢的速度稍慢,但是增刪的速度快),是線程不同步的

|-->Vector:底層是數(shù)組數(shù)據(jù)結構,是線程同步的,但是已經(jīng)被ArrayList替代。因為增刪和查詢的速度都非常慢,效率很低。

|-->Set:無序,不可以重復元素。Set接口的方法和Collection中的方法一致。Set接口中的方法只有迭代器。

|-->HashSet:底層數(shù)據(jù)結構式哈希表,哈希表這種結構,其實就是對哈希值的存儲。而且每個對象都有自己的哈希值,因為Object類中有一個方法為hashCode方法。

如何保證元素的唯一性呢?

通過判斷元素的hashCode方法,會判斷一次equals方法的返回值是否為true。

如果hashCode值不相同,就確定元素的哈希表中的位置,就不用在判斷equals了。

在哈希表中有一個桶結構,每一個桶都有一個哈希值,當哈希值相同,但是equals返回為false時,這些元素都存放在一個桶內(nèi)。

|-->TreeSet:可以對Set集合中的元素進行排序。

看到array就要想到數(shù)組,就要想到角標,就要想到查詢很快。

看到link就要想到鏈表,就要想到增刪很快,最好再想到addFirst(offerFirst)

看到hash就要想到hash表,就要想到元素的hashCode方法,和equals方法。

看到tree,就要想到二叉樹,就要想到排序,就要想到兩個接口 Comparable(Object obj)和Comparator(Objcet o1,Object o2)

Map集合中常見的三個子接口:

Map

|--Hashtable :底層數(shù)據(jù)結構是是哈希表結構,該集合是線程同步的,效率低

此類實現(xiàn)一個哈希表,該哈希表將鍵映射到相應的值。任何非 null 對象都可以 用作鍵或值用作鍵的對象必須實現(xiàn)hashCode 方法和 equals 方法

|--HashMap: 底層也是哈希表數(shù)據(jù)結構,并允許使用 null 值和 null 鍵,此集合線程是不同步? 效率高

|--TreeMap:? 底層是二叉樹數(shù)據(jù)結構,線程不同步,可以用于給Map集合中的鍵進行排序

不難發(fā)現(xiàn),Set集合的特點和Map集合的特點非常相似,其實,Set底層就是使用了Map集合,它的很多方法都是調(diào)用Map集合的。

39、List集合有幾種排序方式,Set集合有幾種排序方式,Map集合有幾種排序方式?

40、HashMap如何保證key的唯一性?

添加的元素都有一個 hashCode(哈希值),他們先比較哈希值,是否相同? 不相同的元素,添加進入 HashTable. 如果hashCode相同的話, 再去比較 equals()方法,如果也相同的話,JVM就認為數(shù)據(jù)已經(jīng)存在了,就不會添加數(shù)據(jù)!

41、介紹OSI參考模型和TCP/IP參考模型

OSI模型

TCP/ip模型

OSI 7層

應用層->包含大量人們普遍需要的協(xié)議

表示層->用于完成某些特定功能

會話層->允許不同機器上的用戶之間建立會話關系

傳輸層->實現(xiàn)網(wǎng)絡中不同主機上的用戶進程之間可靠的數(shù)據(jù)通信

網(wǎng)絡層->完成網(wǎng)絡中主機間的報文傳輸

數(shù)據(jù)鏈路層->如何在不可靠的物理線路上進行數(shù)據(jù)的可靠傳輸

物理層->完成相鄰結點之間原始比特流的傳輸

TCP/IP 4層

應用層->處理高層協(xié)議

傳輸層->在源結點和目的結點的兩個進程實體之間提供可靠的,端到端的數(shù)據(jù)傳輸

互連網(wǎng)層->處理上層發(fā)送請求,處理輸入數(shù)據(jù)報,處理ICMP報文

網(wǎng)絡接口層->涉及分組與網(wǎng)絡接口

42、如何解決并發(fā)線程的數(shù)據(jù)安全?

談到多線程,就涉及到共享數(shù)據(jù)安全問題,一般來說,解決共享數(shù)據(jù)安全問題有三種方式

①:在共享數(shù)據(jù)前加volatile修飾,且保證對共享數(shù)據(jù)的操作要是原子性的

②:java.util.concurrent.atomic下的AtomicInteger等類來包裝共享數(shù)據(jù)

③:鎖如靜態(tài)鎖synchronize、重入鎖ReentrantLock等

43、序列化機制和原理

對象序列化,將對象以二進制的形式保存在硬盤上

反序列化;將二進制的文件轉(zhuǎn)化為對象讀取

44、java如何進行序列化和反序列化?

? 序列化實現(xiàn)步驟:

(1)需要序列化的對象所屬類必須實現(xiàn)Serializable接口;

(2)構造FileOutputStream對象;

(3)構造ObjectOutputStream對象;

(4)使用ObjectOutputStream對象的writeObject()方法進行序列化;

(5)關閉ObjectOutputStream對象;

(6)關閉FileOutputStream對象;

(7)對序列化全程捕獲IOException;

? 反序列化實現(xiàn)步驟:

(1)需要序列化的對象所屬類必須實現(xiàn)Serializable接口;

(2)構造FileInputStream對象;

(3)構造ObjectInputStream對象;

(4)使用ObjectInputStream對象的readObject()方法進行序列化;

(5)關閉ObjectInputStream對象;

(6)關閉FileInputStream對象;

(7)對序列化全程捕獲ClassNotFoundException和IOException;

45、Http和Https的區(qū)別

1、https協(xié)議需要到ca申請證書,一般免費證書比較少,因而需要一定的費用

2、http是超文本傳輸協(xié)議,信息是文明傳輸,https則是具有安全性的ssl加密傳輸協(xié)議

3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80 后者是

440

4、https的連接很簡單,是無狀態(tài)的,https協(xié)議是由SSL+HTTP協(xié)議構建安的可進行

加密傳輸,身份認證的網(wǎng)絡協(xié)議,比http安全

46、TCP和UDP的區(qū)別

連接方面:UDP不需要與服務器建立連接,TCP需要與服務器建立連接,通過三次握手完成數(shù)據(jù)傳遞。

數(shù)據(jù)限制方面:UDP每個數(shù)據(jù)限制在64k,TCP沒有限制。

速度與安全方面:UDP速度快,但是不安全,TCP速度稍慢,是可靠協(xié)議,安全。

47、如何獲取IP地址信息?

一般獲取客戶端的IP地址的方法是:request.getRemoteAddr();但是在通過了Apache,Squid等反向代理軟件就不能獲取到客戶端的真實IP地址了。 可是,如果通過了多級反向代理的話,X-Forwarded-For的值并不止一個,而是一串IP值 多次反向代理后會有多個ip值,第一個ip才是真實ip

48、Socket如何保持長連接

方法1:應用層自己實現(xiàn)的心跳包

由應用程序自己發(fā)送心跳包來檢測連接是否正常,大致的方法是:服務器在一個 Timer事件中定時 向客戶端發(fā)送一個短小精悍的數(shù)據(jù)包,然后啟動一個低級別的線程,在該線程中不斷檢測客戶端的回應, 如果在一定時間內(nèi)沒有收到客戶端的回應,即認為客戶端已經(jīng)掉線;同樣,如果客戶端在一定時間內(nèi)沒 有收到服務器的心跳包,則認為連接不可用。

方法2:TCP的KeepAlive?;顧C制

因為要考慮到一個服務器通常會連接多個客戶端,因此由用戶在應用層自己實現(xiàn)心跳包,代碼較多 且稍顯復雜,而利用TCP/IP協(xié)議層為內(nèi)置的KeepAlive功能來實現(xiàn)心跳功能則簡單得多。 不論是服務端還是客戶端,一方開啟KeepAlive功能后,就會自動在規(guī)定時間內(nèi)向?qū)Ψ桨l(fā)送心跳包, 而另一方在收到心跳包后就會自動回復,以告訴對方我仍然在線。但是

開啟KeepAlive功能需要消耗額外的寬帶和流量,所以TCP協(xié)議層默認并不開啟KeepAlive功 能

KeepAlive設置不合理時可能會 因為短暫的網(wǎng)絡波動而斷開健康的TCP連接

49、Socket、TCP/IP、HTTP的區(qū)別

1、TCP/IP連接

TCP/IP是個協(xié)議組,可分為三個層次:網(wǎng)絡層、傳輸層和應用層。

在網(wǎng)絡層有IP協(xié)議、ICMP協(xié)議、ARP協(xié)議、RARP協(xié)議和BOOTP協(xié)議。

在傳輸層中有TCP協(xié)議與UDP協(xié)議。

在應用層有FTP、HTTP、TELNET、SMTP、DNS等協(xié)議。

因此,HTTP本身就是一個協(xié)議,是從Web服務器傳輸超文本到本地瀏覽器的傳送協(xié)議。

手機能夠使用聯(lián)網(wǎng)功能是因為手機底層實現(xiàn)了TCP/IP協(xié)議,可以使手機終端通過無線網(wǎng)絡建立TCP連接。TCP協(xié)議可以對上層網(wǎng)絡提供接口,使上層網(wǎng)絡數(shù)據(jù)的傳輸建立在“無差別”的網(wǎng)絡之上。

建立起一個TCP連接需要經(jīng)過“三次握手”:

第一次握手:客戶端發(fā)送syn包(syn=j)到服務器,并進入SYN_SEND狀態(tài),等待服務器確認;

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態(tài);

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務器進入ESTABLISHED狀態(tài),完成三次握手。

握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務器才正式開始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。斷開連接時服務器和客戶端均可以主動發(fā)起斷開TCP連接的請求,斷開過程需要經(jīng)過“四次握手”(過程就不細寫了,就是服務器和客戶端交互,最終確定斷開).

2、HTTP連接

HTTP協(xié)議即超文本傳送協(xié)議(Hypertext Transfer Protocol ),是Web聯(lián)網(wǎng)的基礎,也是手機聯(lián)網(wǎng)常用的協(xié)議之一,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應用。

HTTP連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務器回送響應,在請求結束后,會主動釋放連接。從建立連接到關閉連接的過程稱為“一次連接”。

1)在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求后,就自動釋放連接。

2)在HTTP 1.1中則可以在一次連接中處理多個請求,并且多個請求可以重疊進行,不需要等待一個請求結束后再發(fā)送下一個請求。

由于HTTP在每次請求結束后都會主動釋放連接,因此HTTP連接是一種“短連接”,要保持客戶端程序的在線狀態(tài),需要不斷地向服務器發(fā)起連接請求。通常的做法是即時不需要獲得任何數(shù)據(jù),客戶端也保持每隔一段固定的時間向服務器發(fā)送一次“保持連接”的請求,服務器在收到該請求后對客戶端進行回復,表明知道客戶端“在線”。若服務器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到服務器的回復,則認為網(wǎng)絡已經(jīng)斷開。

3、SOCKET原理

3.1套接字(socket)概念

套接字(socket)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡通信的基本操作單元。它是網(wǎng)絡通信過程中端點的抽象表示,包含進行網(wǎng)絡通信必須的五種信息:連接使用的協(xié)議,本地主機的IP地址,本地進程的協(xié)議端口,遠地主機的IP地址,遠地進程的協(xié)議端口。

應用層通過傳輸層進行數(shù)據(jù)通信時,TCP會遇到同時為多個應用程序進程提供并發(fā)服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個 TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應用程序進程和連接,許多計算機操作系統(tǒng)為應用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區(qū)分來自不同應用程序進程或網(wǎng)絡連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務。

3.2 建立socket連接

建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket ,另一個運行于服務器端,稱為ServerSocket 。

套接字之間的連接過程分為三個步驟:服務器監(jiān)聽,客戶端請求,連接確認。

服務器監(jiān)聽:服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡狀態(tài),等待客戶端的連接請求。

客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。

連接確認:當服務器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發(fā)給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。

4、SOCKET連接與TCP/IP連接

創(chuàng)建Socket連接時,可以指定使用的傳輸層協(xié)議,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP),當使用TCP協(xié)議進行連接時,該Socket連接就是一個TCP連接。

5、Socket連接與HTTP連接

由于通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容,直到雙方連接斷開。但在實際網(wǎng)絡應用中,客戶端到服務器之間的通信往往需要穿越多個中間節(jié)點,例如路由器、網(wǎng)關、防火墻等,大部分防火墻默認會關閉長時間處于非活躍狀態(tài)的連接而導致 Socket 連接斷連,因此需要通過輪詢告訴網(wǎng)絡,該連接處于活躍狀態(tài)。

而HTTP連接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發(fā)出請求后,服務器端才能回復數(shù)據(jù)。

很多情況下,需要服務器端主動向客戶端推送數(shù)據(jù),保持客戶端與服務器數(shù)據(jù)的實時與同步。此時若雙方建立的是Socket連接,服務器就可以直接將數(shù)據(jù)傳送給客戶端;若雙方建立的是HTTP連接,則服務器需要等到客戶端發(fā)送一次請求后才能將數(shù)據(jù)傳回給客戶端,因此,客戶端定時向服務器端發(fā)送連接請求,不僅可以保持在線,同時也是在“詢問”服務器是否有新的數(shù)據(jù),如果有就將數(shù)據(jù)傳給客戶端。

http協(xié)議是應用層的協(xié)義

一個是發(fā)動機(Socket),提供了網(wǎng)絡通信的能力

一個是轎車(Http),提供了具體的方式

兩個計算機之間的交流無非是兩個端口之間的數(shù)據(jù)通信,具體的數(shù)據(jù)會以什么樣的形式展現(xiàn)`是以不同的應用層協(xié)議來定義的`如HTTP`FTP`...

socket是對端口通信開發(fā)的工具,它要更底層一些 .

50、Socket如何實現(xiàn)流量控制和擁塞控制的實現(xiàn)機制

1. 利用滑動窗口實現(xiàn)流量控制

如果發(fā)送方把數(shù)據(jù)發(fā)送得過快,接收方可能會來不及接收,這就會造成數(shù)據(jù)的丟失。所謂流量控制就是讓發(fā)送方的發(fā)送速率不要太快,要讓接收方來得及接收

利用滑動窗口機制可以很方便地在TCP連接上實現(xiàn)對發(fā)送方的流量控制。

設A向B發(fā)送數(shù)據(jù)。在連接建立時,B告訴了A:“我的接收窗口是 rwnd = 400 ”(這里的 rwnd 表示 receiver window) 。因此,發(fā)送方的發(fā)送窗口不能超過接收方給 出的接收窗口的數(shù)值。

TCP的擁塞控制

擁塞控制:防止過多的數(shù)據(jù)注入到網(wǎng)絡中,這樣可以使網(wǎng)絡中的路由器或鏈路不致過載。擁塞控制所要做的都有一個前提:網(wǎng)絡能夠承受現(xiàn)有的網(wǎng)絡負荷。

幾種擁塞控制方法

慢開始( slow-start )、擁塞避免( congestion avoidance )、快重傳( fast retransmit )和快恢復( fast recovery )。

51、多線程如何同步

1.同步方法

即有synchronized關鍵字修飾的方法。

由于java的每個對象都有一個內(nèi)置鎖,當用此關鍵字修飾方法時,

內(nèi)置鎖會保護整個方法。在調(diào)用該方法前,需要獲得內(nèi)置鎖,否則就處于阻

塞狀態(tài)。

2.同步代碼塊

即有synchronized關鍵字修飾的語句塊。

被該關鍵字修飾的語句塊會自動被加上內(nèi)置鎖,從而實現(xiàn)同步

3.使用特殊域變量(volatile)實現(xiàn)線程同步

a.volatile關鍵字為域變量的訪問提供了一種免鎖機制,

b.使用volatile修飾域相當于告訴虛擬機該域可能會被其他線程更新,

c.因此每次使用該域就要重新計算,而不是使用寄存器中的值

d.volatile不會提供任何原子操作,它也不能用來修飾final類型的變量

4.使用重入鎖實現(xiàn)線程同步

在JavaSE5.0中新增了一個java.util.concurrent包來支持同步。

ReentrantLock類是可重入、互斥、實現(xiàn)了Lock接口的鎖,

它與使用synchronized方法和快具有相同的基本行為和語義,并且擴展了其

能力

ReenreantLock類的常用方法有:

ReentrantLock() : 創(chuàng)建一個ReentrantLock實例

lock() : 獲得鎖

unlock() : 釋放鎖

5. 使用局部變量實現(xiàn)線程同步

ThreadLocal與同步機制

ThreadLocal與同步機制都是為了解決多線程中相同變量的訪問沖突問題

前者采用以”空間換時間”的方法,后者采用以”時間換空間”的方式

52、tcp連接建立的時候3次握手的具體過程

第一次握手:

建立連接時,客戶端發(fā)送syn包(syn=j)到服務器,并進入SYN_SEND狀態(tài),等待服務器確認;

SYN:同步序列編號(Synchronize Sequence Numbers)

第二次握手:

服務器收到syn包,必須確認客戶的SYN(ack=j+1),

同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態(tài);

第三次握手:

客戶端收到服務器的SYN+ACK包,向服務器發(fā)送確認包ACK(ack=k+1),

此包發(fā)送完畢,客戶端和服務器進入ESTABLISHED狀態(tài),完成三次握手.

完成三次握手,客戶端與服務器開始傳送數(shù)據(jù)

53、tcp斷開連接的具體過程

(客戶機發(fā)起斷開請求)

四次斷開是由于tcp的半關閉造成的,即一方已經(jīng)斷開連接二另一方?jīng)]有斷開

1.客戶機發(fā)送一個帶有fin的包給服務器,然后進入fin_wait_1狀態(tài).而此時服務器處于close_wait狀態(tài)

2.服務器收到后,回應一個ack到客戶機.此時客戶機進入fin_wait_2狀態(tài)

3.服務器繼續(xù)回應一個Fin的包,服務器進入last_ack狀態(tài),而客戶機進入time_wait狀態(tài)

4.客戶機發(fā)送ack給服務器,客戶機進入cloesed狀態(tài).

最終雙方連接終止.

54、socket關閉釋放網(wǎng)絡資源的時候,數(shù)據(jù)還未傳輸完畢,如何解決?

解決方案一:

傳一個文件,建立一個連接,傳完文件后,立即關閉連接。

解決方案二:

在傳一個文件之前,先傳一個文件長度過去,再傳文件的數(shù)據(jù),傳完了關閉連接。

接收端,先接收文件長度,然后,按照文件長度來讀取數(shù)據(jù),

當,文件長度讀取完畢后,等待下次傳遞

55、什么是請求隊列?

消息隊列跟隊列本質(zhì)上是一個東西,因為功能不一樣所以名字有區(qū)別,首先隊列是一

種數(shù)據(jù)結構,特點就是先進先出,后今 后出,這跟堆棧剛好相反。最簡單的消息隊

列其實也是用隊列這種數(shù)據(jù)結構實現(xiàn)的。我們把消息按照先進先出的規(guī)則一個一個

的放進隊列里,這個過程叫做進隊,然后在隊頭一個一個取出來叫做出隊。

56、常用的HTTP方法有哪些?

57、HTTP請求報文與響應報文格式

HTTP請求報文與響應報文格式

請求報文包含三部分:

a、請求行:包含請求方法、URI、HTTP版本信息

b、請求首部字段

c、請求內(nèi)容實體

響應報文包含三部分:

a、狀態(tài)行:包含HTTP版本、狀態(tài)碼、狀態(tài)碼的原因短語

b、響應首部字段

c、響應內(nèi)容實體

58、常見的HTTP相應狀態(tài)碼

200:請求被正常處理

204:請求被受理但沒有資源可以返回

206:客戶端只是請求資源的一部分,服務器只對請求的部分資源執(zhí)行GET方法,

相應報文中通過Content-Range指定范圍的資源。

301:永久性重定向

302:臨時重定向

303:與302狀態(tài)碼有相似功能,只是它希望客戶端在請求一個URI的時候,能通

過GET方法重定向到另一個URI上

304:發(fā)送附帶條件的請求時,條件不滿足時返回,與重定向無關

307:臨時重定向,與302類似,只是強制要求使用POST方法

400:請求報文語法有誤,服務器無法識別

401:請求需要認證

403:請求的對應資源禁止被訪問

404:服務器無法找到對應資源

500:服務器內(nèi)部錯誤

503:服務器正忙

59、HTTP1.1版本新特性

默認持久連接,

節(jié)省通信量,只要客戶端和服務端任意一端沒有明確的斷開TCP連接,就可以發(fā)送多次HTTP請求

管線化

客戶端可以同時發(fā)送多個HTTP請求,而不用一個個等待響應

斷點續(xù)傳原理

其原理是:客戶端記錄下當前的下載進度,并在需要續(xù)傳時通知服務器本次需要下載的內(nèi)容片斷

60、常見HTTP首部字段

a、通用首部字段(請求報文與響應報文都會使用的首部字段)

Date:創(chuàng)建報文時間

Connection:連接的管理

Cache-Control:緩存的控制

Transfer-Encoding:報文主體的傳輸編碼方式

b、請求首部字段(請求報文會使用的首部字段)

Host:請求資源所在服務器

Accept:可處理的媒體類型

Accept-Charset:可接收的字符集

Accept-Encoding:可接受的內(nèi)容編碼

Accept-Language:可接受的自然語言

c、響應首部字段(響應報文會使用的首部字段)

Accept-Ranges:可接受的字節(jié)范圍

Location:令客戶端重新定向到的URI

Server:HTTP服務器的安裝信息

d、實體首部字段(請求報文與響應報文的的實體部分使用的首部字段)

Allow:資源可支持的HTTP方法

Content-Type:實體主類的類型

Content-Encoding:實體主體適用的編碼方式

Content-Language:實體主體的自然語言

Content-Length:實體主體的的字節(jié)數(shù)

Content-Range:實體主體的位置范圍,一般用于發(fā)出部分請求時使用

61、Http與Https優(yōu)缺點?

https:// 要比http://更加安全一些,也就是說HTTPS協(xié)議是由SSL+HTTP協(xié)議構

建的可進行加密傳輸、身份認證的網(wǎng)絡協(xié)議要比http協(xié)議安全。

1、https協(xié)議需要到ca申請證書,一般免費證書比較少,因而需要一定的費用

2、http是超文本傳輸協(xié)議,信息是文明傳輸,https則是具有安全性的ssl加密傳

輸協(xié)議

3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80

后者是440

4、https的連接很簡單,是無狀態(tài)的,https協(xié)議是由SSL+HTTP協(xié)議構建安的

可進行加密傳輸,身份認證的網(wǎng)絡協(xié)議,比http安全

62、什么是Http協(xié)議?

超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應用最為廣泛的一種網(wǎng)絡協(xié)議。所有的WWW文件都必須遵守這個標準。

63、說一下Http協(xié)議中302狀態(tài)

302重定向很容易被搜索引擎誤認為是利用多個域名指向同一網(wǎng)站,那么你的網(wǎng)站就會被封掉,罪名是“利用重復的內(nèi)容來干擾Google搜索結果的網(wǎng)站排名”。因為302重定向經(jīng)常被用于做url劫持,黑帽seo技術中,而且百度在處理302重定向技術還不成熟,經(jīng)常將它納入到黑帽seo的范疇中,而google對這方面識別處理就完善了許多。所以302重定向在現(xiàn)階段的搜索引擎技術中,還是容易導致網(wǎng)站降權的,盡量不用。但從seo、網(wǎng)站優(yōu)化方面來說是弊大于利

64、Http協(xié)議有什么組成?

HTTP協(xié)議采用了請求/響應模型。客戶端向服務器發(fā)送一個請求,請求頭包含請求的方法、URL、協(xié)議版本、以及包含請求修飾符、客戶信息和內(nèi)容的類似于MIME的消息結構。服務器以一個狀態(tài)行作為響應,響應的內(nèi)容包括消息協(xié)議的版本,成功或者錯誤編碼加上包含服務器信息、實體元信息以及可能的實體內(nèi)容。

65、Http協(xié)議中Http1.0與1.1區(qū)別?

1,HTTP/1.0協(xié)議使用非持久連接,即在非持久連接下,一個tcp連接只傳輸一個Web對象,;

2,HTTP/1.1默認使用持久連接(然而,HTTP/1.1協(xié)議的客戶機和服務器可以配置成使用非持久連接)。

在持久連接下,不必為每個Web對象的傳送建立一個新的連接,一個連接中可以傳輸多個對象!

66、Http優(yōu)化

利用負載均衡優(yōu)化和加速HTTP應用

利用HTTP Cache來優(yōu)化網(wǎng)站

67、Http協(xié)議有那些特征?

無連接:HTTP本身是無連接的,即交換HTTP報文前不需要建立HTTP連接

無狀態(tài):HTTP協(xié)議是無狀態(tài)的:數(shù)據(jù)傳輸過程中,并不保存任何歷史信息和狀態(tài)信息。無狀態(tài)特性簡化了服務器的設計,使服務器更容易支持大量并發(fā)的HTPP請求。

傳輸可靠性高:采用TCP作為運輸層協(xié)議(面向連接、可靠傳輸),即交換報文時需要預先建立TCP連接

兼容性好:支持B/S模式及C/S模式;

簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST

靈活:HTTP 允許傳輸任意類型的數(shù)據(jù)對象

68、什么是比特(Bit),什么是字節(jié)(Byte),什么是字符(Char),它們長度是多少,各有什么區(qū)別

Bit最小的二進制單位 ,是計算機的操作部分 取值0或者1

Byte是計算機操作數(shù)據(jù)的最小單位由8位bit組成 取值(-128-127)

Char是用戶的可讀寫的最小單位,在java里面由16位bit組成 取值(0-65535)

Bit 是最小單位 計算機 只能認識 0或者1

8個字節(jié) 是給計算機看的

字符 是看到的東西 一個字符=二個字節(jié)

69、什么是流,按照傳輸?shù)膯挝?分成哪兩種流,并且他們的父類叫什么

流是指數(shù)據(jù)的傳輸

字節(jié)流,字符流

字節(jié)流:InputStream OutputStream

字符流:Reader Writer

3.流按照傳輸?shù)姆较蚩梢苑譃槟膬煞N,分別舉例說明

答案

輸入輸出相對于程序

輸入流InputStream

,輸出流OutputStream

70、BufferedReader屬于哪種流,它主要是用來做什么的,它里面有那些經(jīng)典的方法

屬于處理流中的緩沖流,可以將讀取的內(nèi)容存在內(nèi)存里面,有readLine()方法

71、什么是節(jié)點流,什么是處理流,它們各有什么用處,處理流的創(chuàng)建有什么特征

節(jié)點流 直接與數(shù)據(jù)源相連,用于輸入或者輸出

處理流:在節(jié)點流的基礎上對之進行加工,進行一些功能的擴展

處理流的構造器必須要 傳入節(jié)點流的子類

72、如果我要打印出不同類型的數(shù)據(jù)到數(shù)據(jù)源,那么最適合的流是那個流,為什么

Printwriter 可以打印各種數(shù)據(jù)類型

73、怎么樣把我們控制臺的輸出改成輸出到一個文件里面,這個技術叫什么

SetOut(printWriter,printStream)重定向

74、怎么樣把輸出字節(jié)流轉(zhuǎn)換成輸出字符流,說出它的步驟

使用 轉(zhuǎn)換處理流OutputStreamWriter 可以將字節(jié)流轉(zhuǎn)為字符流

New OutputStreamWriter(new FileOutputStream(File file));

75、把包括基本類型在內(nèi)的數(shù)據(jù)和字符串按順序輸出到數(shù)據(jù)源,或者按照順序從數(shù)據(jù)源讀入,一般用哪兩個流

DataInputStream DataOutputStream

76、把一個對象寫入數(shù)據(jù)源或者從一個數(shù)據(jù)源讀出來,用哪兩個流

ObjectInputStream ObjectOutputStream

77、如果在對象序列化的時候不想給一個字段的數(shù)據(jù)保存在硬盤上面,采用那個關鍵字?

transient(短暫)關鍵字

78、在實現(xiàn)序列化接口是時候一般要生成一個serialVersionUID字段,它叫做版本標識,一般有什么用

簡單來說,Java的序列化機制是通過在運行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的字節(jié)流中的serialVersionUID與本地相應實體(類)的serialVersionUID進行比較,如果相同就認為是一致的,可以進行反序列化,否則就會出現(xiàn)序列化版本不一致的異常。

79、InputStream里的read()返回的是什么,read(byte[] data)是什么意思,返回的是什么值

返回的是所讀取的字節(jié)的int型(范圍0-255)

read(byte [ ] data)將讀取的字節(jié)儲存在這個數(shù)組

返回的就是傳入數(shù)組參數(shù)個數(shù)

Read 字節(jié)讀取字節(jié) 字符讀取字符

80、OutputStream里面的write()是什么意思,write(byte b[], int off, int len)這個方法里面的三個參數(shù)分別是什么意思

write將指定字節(jié)傳入數(shù)據(jù)源

Byte b[ ]是byte數(shù)組

b[off]是傳入的第一個字符

b[off+len-1]是傳入的最后的一個字符

len是實際長度

81、流一般需要不需要關閉,如果關閉的話在用什么方法,一般要在那個代碼塊里面關閉比較好,處理流是怎么關閉的,如果有多個流互相調(diào)用傳入是怎么關閉的?

流一旦打開就必須關閉,使用close方法

放入finally語句塊中(finally 語句一定會執(zhí)行)

調(diào)用的是處理流就關閉處理流

多個流互相調(diào)用只關閉最外層的流

82、說說你對io流的理解

Io流主要是用來處理輸入輸出問題,常用的io流有InputStream,

OutputStream,Reader,Writer等

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Java繼承關系初始化順序 父類的靜態(tài)變量-->父類的靜態(tài)代碼塊-->子類的靜態(tài)變量-->子類的靜態(tài)代碼快-->父...
    第六象限閱讀 2,261評論 0 9
  • 計算機網(wǎng)絡概述 網(wǎng)絡編程的實質(zhì)就是兩個(或多個)設備(例如計算機)之間的數(shù)據(jù)傳輸。 按照計算機網(wǎng)絡的定義,通過一定...
    蛋炒飯_By閱讀 1,373評論 0 10
  • 網(wǎng)絡編程 網(wǎng)絡編程對于很多的初學者來說,都是很向往的一種編程技能,但是很多的初學者卻因為很長一段時間無法進入網(wǎng)絡編...
    程序員歐陽閱讀 2,113評論 1 37
  • 覺得「意大利留學寶拉語言」不錯的話請關注 告訴大家一個好消息 周日23號我們在貴陽花果園中央商務區(qū)F2棟寶拉教育舉...
    色譜沙龍閱讀 337評論 0 0
  • 學期:第377期 隊呼:感謝二組 姓名:沈一寧 公司: 揚州日發(fā)干燥設備工程有限公司 【日精打卡第24天】 【...
    寧_79e3閱讀 235評論 0 1

友情鏈接更多精彩內(nèi)容