經典鏈接:
5.java設計模式
6.找工作攻略
9.各大排序算法總結
10.android校招總結
11.java基礎:http://blog.csdn.net/u013142781/article/category/6121646
1.自我介紹
2.挑一個最拿手的項目進行簡單介紹。
BInder機制的簡要理解;http://www.linuxidc.com/Linux/2012-07/66195.htm
內部類與靜態內部類的區別;
hashmap如何定位;先hash(key)%len定位數組中位置,再通過Entry.next遍歷鏈表,新來的元素總是鏈在最前面,table的大小為>=initialCapacity的2的n次冪。
多線程同步方法;http://blog.csdn.net/yanzhenjie1003/article/details/50992468-------synchronized,ReenTrantLock實現同步加鎖機制的區別:synchronized無法中斷一個正在等候獲得鎖的線程,也無法通過投票得到鎖,如果不想等下去,也就沒法得到鎖。所以JSR 166小組花時間為我們開發了java.util.concurrent.lock框架,當Lock鎖定的方法或者代碼塊發生異常的時候,它不會自動釋放鎖;它擁有與synchronized相同的并發性和內存語義,但是添加了類似鎖投票、定時鎖等候和可中斷鎖等候的一些特性。此外,它還提供了在激烈爭用情況下更佳的性能。(換句話說,當許多線程都想訪問共享資源時,JVM 可以花更少的時候來調度線程,把更多時間用在執行線程上。)
弱引用的場景;只具有弱引用的對象擁有更短暫的生命周期。在垃圾回收器線程掃描它 所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由于垃圾回收器是一個優先級很低的線程, 因此不一定會很快發現那些只具有弱引用的對象。
android內存泄漏之靜態內部類的使用:
非靜態的內部類或匿名類會隱式的持有一個他們外部類的引用,靜態內部類則不會。非靜態內部類,handler對象不釋放的話,它的activity也不會釋放,因為匿名類的非靜態實例持有一個隱式的外部類引用,因此activity將被泄漏。為了解決內存泄漏問題,handler的子類應該定義在一個新文件中或使用靜態內部類。靜態內部類不會隱式持有外部類的引用,所以不會導致它的activity泄漏。如果你需要在handler內部調用外部activity的方法,那么讓handler持有一個activity的弱引用是正確的解決方案。
到底什么時候使用軟引用,什么時候使用弱引用呢?
個人認為,如果只是想避免OutOfMemory異常的發生,則可以使用軟引用。如果對于應用的性能更在意,想盡快回收一些占用內存比較大的對象,則可以使用弱引用。還有就是可以根據對象是否經常使用來判斷。如果該對象可能會經常使用的,就盡量用軟引用。如果該對象不被使用的可能性更大些,就可以用弱引用。
http://blog.csdn.net/chenxiaofeng_/article/details/51492764
Java:
1.堆內存與棧內存:main()函數中的局部變量存儲在棧內存中,用new和malloc分配的是堆內存,全局變量存儲在堆內存。
2.HashMap與Hashtable的區別:大體相同,但HashMap允許空值,而且HashMap是非同步的,而HashTable是同步的。
3.protected:一個繼承的類可訪問受保護的成員,但不能訪問私有成員。
4.switch能否用string做參數?在 Java 7之前,switch 只能支持 byte、short、char、int或者其對應的封裝類以及 Enum 類型。在 Java 7中,String支持被加上了。
5.Object類有哪些公共方法?clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()
6.String, StringBuffer, StringBuilder的區別?String是字符串常量,StringBuffer線程安全,StringBuilder是線程不安全
7.try catch finally,try里有return,finally還執行么?任何執行try 或者catch中的return語句之前,都會先執行finally語句,如果finally存在的話。 如果finally中有return語句,那么程序就return了,所以finally中的return是一定會被return的, 編譯器把finally中的return實現為一個warning。
8.接口的意義:為什么要用接口 :用于處理多變的情況。接口在實際開發過程中最大好處是,你可以按照設計,先把接口寫好,然后分配大伙干活的時候,告訴a們去用寫好的接口去實現他們的具體功能,而告訴b們,去寫那些已經寫好但是沒有具體的代碼的接口,這樣可以提高工作效率。并且底層和應用也通過接口做了一個很明顯的分層。
10.抽象類存在的意義:有利于代碼的維護和重用,java面向對象的體現,當你對其中某個類進行修改時會受到父類的限制,這樣就會提醒開發人員有些東西不能進行隨意修改,這樣可以對比較重要的東西進行統一的限制,也算是一種保護,對維護會有很大的幫助。
11.內部類作用:
(1).內部類可以很好的實現隱藏,一般的非內部類,是不允許有 private 與protected權限的,但內部類可以
(2).內部類擁有外圍類的所有元素的訪問權限
(3).可是實現多重繼承
(4).可以避免修改接口而實現同一個類中兩種同名方法的調用。
12.子類能否重寫父類的靜態方法?當然不能,所謂靜態,就是在運行時,虛擬機已經認定此方法屬于哪個類。
13。JAVA虛擬機的特性?虛擬機中的執行引擎用來執行class文件中的字節碼指令,虛擬機在執行過程中, 要分配內存創建對象。當這些對象過時無用了,必須要自動清理這些無用的對象。清理對象回收內存的任務由垃圾收集器負責。
14.java的垃圾回收機制?Java 垃圾回收機制最基本的做法是分代回收。內存中的區域被劃分成不同的世代,對象根據其存活的時間被保存在對應世代的區域中。一般的實現是劃分成3個世代:年輕、年老和永久。內存的分配是發生在年輕世代中的。當一個對象存活 時間足夠長的時候,它就會被復制到年老世代中。對于不同的世代可以使用不同的垃圾回收算法。進行世代劃分的出發點是對應用中對象存活時間進行研究之后得出的統計規律。一般來說,一個應用中的大部分對象的存活時間都很短。 比如局部變量的存活時間就只在方法的執行過程中。基于這一點,對于年輕世代的垃圾回收算法就可以很有針對性。
15.進程和線程區別?個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以并發執行.進程和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。 線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。 但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。
16.Java中==和equals的區別,equals和hashCode的區別==是運算符,用于比較兩個變量是否相等。
equals,是Objec類的方法,用于比較兩個對象是否相等,默認Object類的equals方法是比較兩個對象的地址,跟==的結果一樣。
將對象放入到集合中時,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,如果不相等直接將該對象放入集合中。如果hashcode值相等,
然后再通過equals方法判斷要放入對象與集合中的任意一個對象是否相等,如果equals判斷不相等,直接將該元素放入到集合中,否則不放入。
17.ArrayList和HashMap的實現原理?ArrayLIst是可以動態擴容的數組,超出限制后增加一半容量,默認大小為10.HashMap以數組和鏈表實現,也是動態擴容,先定位數據元素,再遍歷鏈表
18.ArrayList與LinkedList區別?ArrayList相當于數組,方便查詢,不方便插入刪除,LinkedList相當于鏈表,方便插入刪除,不方便查詢。
19.C++中堆和棧的區別?
程序的內存分配:棧區由編譯器自動分配,存放函數的參數值局部變量,堆區由程序員分配,若程序員不釋放,程序結束時可能有os回收,棧是連續空間,空間小快,堆的空間不連續,空間大靈活慢。
申請后系統的響應 : 棧:只要棧的剩余空間大于所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。 堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時, 會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑結點鏈表 中刪除,并將該結點的空間分配給程序.
20.接口和抽象類的區別?
1).抽象類可以有構造方法,接口中不能有構造方法。
2).抽象類中可以有普通成員變量,而接口中不可以有。
3)抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
4)抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,并且默認即為public abstract類型。
5)抽象類中可以包含靜態方法(static),接口中不能包含靜態方法.
6)抽象類和接口中都可以包含靜態成員變量(static),抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認即為public static final類型。
7)一個類可以實現多個接口,但只能繼承一個抽象類。
①volatile輕量級,只能修飾變量。synchronized重量級,還可修飾方法
②volatile只能保證數據的可見性,不能用來同步,因為多個線程并發訪問volatile修飾的變量不會阻塞。
synchronized不僅保證可見性,而且還保證原子性,因為,只有獲得了鎖的線程才能進入臨界區,從而保證臨界區中的所有語句都全部執行。多個線程爭搶synchronized鎖對象時,會出現阻塞。
22.單例模式的寫法。
網絡:
TCP三次握手與四次握手
1.HTTP簡介:HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。HTTP是一個無狀態的協議。
2.HTTP協議的特點:
(1)簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由于HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
(2)靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
(3)無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間.
(4)無狀態:HTTP協議是無狀態協議。無狀態是指協議對于事務處理沒有記憶能力。缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
(5)支持客戶/服務器模式。支持基本認證和安全認證
3.HTTP工作原理:HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端。 HTTP協議采用了請求/響應模型。客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。 服務器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。
4.GET與POST請求的區別:GET 請求指定的頁面信息,并返回實體主體 POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
(1)GET提交的數據會放在URL之后,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中.
(2)GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
(3)GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。
(4)GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼.
5.HTTP狀態碼:
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求
6.常用狀態碼:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
7.URI與URL的區別:URI,是uniform resource identifier,統一資源標識符,用來唯一的標識一個資源。
URL是uniform resource locator,統一資源定位器,它是一種具體的URI,即URL可以用來標識一個資源,而且還指明了如何locate這個資源,還存放了資源的具體地址。
通過Cookies或Session保存狀態信息--Session機制是一種服務器端的機制,服務器使用一種類似于散列表的結構(也可能就是使用散列表)來保存信息。
當程序需要為某個客戶端的請求創建一個session的時候,服務器首先檢查這個客戶端的請求里是否已包含了一個session標識 - 稱為 session id,
如果已包含一個session id則說明以前已經為此客戶端創建過session,服務器就按照session id把這個 session檢索出來使用(如果檢索不到,可能會新建一個),
如果客戶端請求不包含session id,則為此客戶端創建一個session并且生成一個與此session相關聯的session id,session id的值應該是一個既不會重復,
又不容易被找到規律以仿造的字符串,這個session id將被在本次響應中返回給客戶端保存。
9.Cookie和Session的區別:
1)Cookie將狀態保存在客戶端,Session將狀態保存在服務器端;
2)Cookies是服務器在本地機器上存儲的小段文本并隨每一個請求發送至同一個服務器。Cookie最早在RFC2109中實現,后續RFC2965做了增強。網絡服務器用HTTP頭向客戶端發送cookies,在客戶終端,瀏覽器解析這些cookies并將它們保存為一個本地文件,它會自動將同一服務器的任何請求縛上這些cookies。Session并沒有在HTTP的協議中定義;
3)Session是針對每一個用戶的,變量的值保存在服務器上,用一個sessionID來區分是哪個用戶session變量,這個值是通過用戶的瀏覽器在訪問的時候返回給服務器,當客戶禁用cookie時,這個值也可能設置為由get來返回給服務器;
4)就安全性來說:當你訪問一個使用session 的站點,同時在自己機子上建立一個cookie,建議在服務器端的SESSION機制更安全些。因為它不會任意讀取客戶存儲的信息。
10.HTTP應用
(1):斷點續傳的原理:HTTP協議的GET方法,支持只請求某個資源的某一部分;
206 Partial Content 部分內容響應;
Range 請求的資源范圍;
Content-Range 響應的資源范圍;
在連接斷開重連時,客戶端只請求該資源未下載的部分,而不是重新請求整個資源,來實現斷點續傳。
分塊請求資源實例:
Eg1:Range: bytes=306302- :請求這個資源從306302個字節到末尾的部分;
Eg2:Content-Range: bytes 306302-604047/604048:響應中指示攜帶的是該資源的第306302-604047的字節,該資源共604048個字節;
客戶端通過并發的請求相同資源的不同片段,來實現對某個資源的并發分塊下載。從而達到快速下載的目的。目前流行的FlashGet和迅雷基本都是這個原理。
(2):多線程下載的原理
下載工具開啟多個發出HTTP請求的線程;每個http請求只請求資源文件的一部分:Content-Range: bytes 20000-40000/47000;合并每個線程下載的文件
(3)http代理
http代理服務器
代理服務器英文全稱是Proxy Server,其功能就是代理網絡用戶去取得網絡信息。形象的說:它是網絡信息的中轉站。
代理服務器是介于瀏覽器和Web服務器之間的一臺服務器,有了它之后,瀏覽器不是直接到Web服務器去取回網頁而是向代理服務器發出請求,
Request信號會先送到代理服務器,由代理服務器來取回瀏覽器所需要的信息并傳送給你的瀏覽器。
而且,大部分代理服務器都具有緩沖的功能,就好象一個大的Cache,它有很大的存儲空間,它不斷將新取得數據儲存到它本機的存儲器上,
如果瀏覽器所請求的數據在它本機的存儲器上已經存在而且是最新的,那么它就不重新從Web服務器取數據,而直接將存儲器上的數據傳送給用戶的瀏覽器,
這樣就能顯著提高瀏覽速度和效率。更重要的是:Proxy Server(代理服務器)是Internet鏈路級網關所提供的一種重要的安全功能,它的工作主要在開放系統互聯(OSI)模型的對話層。
http代理服務器的主要功能:
1)突破自身IP訪問限制,訪問國外站點。如:教育網、169網等網絡用戶可以通過代理訪問國外網站;
2)訪問一些單位或團體內部資源,如某大學FTP(前提是該代理地址在該資源的允許訪問范圍之內),使用教育網內地址段免費代理服務器,就可以用于對教育 網開放的各類FTP下載上傳,以及各類資料查詢共享等服務;
3)突破中國電信的IP封鎖:中國電信用戶有很多網站是被限制訪問的,這種限制是人為的,不同Serve對地址的封鎖是不同的。所以不能訪問時可以換一個國外的代理服務器試試;
4)提高訪問速度:通常代理服務器都設置一個較大的硬盤緩沖區,當有外界的信息通過時,同時也將其保存到緩沖區中,當其他用戶再訪問相同的信息時,則直接由緩沖區中取出信息,傳給用戶,以提高訪問速度;
5)隱藏真實IP:上網者也可以通過這種方法隱藏自己的IP,免受攻擊。
對于客戶端瀏覽器而言,http代理服務器相當于服務器。
而對于Web服務器而言,http代理服務器又擔當了客戶端的角色。
11.HTTPS的優點:客戶端產生的密鑰只有客戶端和服務器端能得到; 加密的數據只有客戶端和服務器端才能得到明文;客戶端到服務端的通信是安全的。
12.TCP與UDP的區別:TCP是可靠數據傳輸協議,UDP是一個面向無連接的協議。采用該協議不需要兩個應用程序先建立連接。UDP協議不提供差錯恢復,不能提供數據重傳,因此該協議傳輸數據安全性差。是否先建立連接是重點
1)、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
2)、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保證可靠交付
3)、TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的 UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
4)、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5)、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
6)、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
android:
2.handler機制? handler是更新UI的機制,也是消息處理的機制,每一個線程里都含有一個Looper對象和一個MessageQueue數據結構,在應用程序中可以定義Handler的子類來接收Looper所送出的消息, Looper是Handler和MessageQueue之間的橋梁,循環取出MessageQueue里的message,交給相應的handler進行處理,handler是message的主要處理者,負責將message添加到消息隊列以及對消息隊列中消息進行處理, 也可解決多線程并發問題。handler負責發送消息,looper負責接收handler發送的消息并直接把消息會傳給handler自己,MessageQueue就是一個存儲消息的容器。
3.Binder機制?Binder是Android系統中的一種IPC進程間通信結構。 Binder的整個設計是C/S結構,客戶端進程通過獲取服務端進程的代理,并通過向這個代理接口方法中讀寫數據來完成進程間的數據通信。 Android之所以選擇Binder,我覺得有2個方面的原因。 1是安全,每個進程都會被Android系統分配UID和PID,不像傳統的在數據里加入UID,這就讓那些惡意進程無法直接和其他進程通信,進程間通信的安全性得到提升。 2是高效,像Socket之類的IPC每次數據拷貝都需要2次,而Binder只要1次,在手機這種資源緊張的情況下很重要。
4.避免OOM方法總結?
介紹)強引用:如果一個對象具有強引用,垃圾回收器絕對不會回收它。
軟引用:如果一個對象只具有軟引用,內存足夠時,垃圾回收器就不會回收它;知道虛擬機報告內存不夠時,垃圾回收器才會對它進行回收。
弱引用:一旦發現了只具有弱引用的對象,無論內存空間是否足夠,垃圾回收器都會回收。
虛引用:主要用來跟蹤對象被垃圾回收器回收的活動,虛引用必須和引用隊列聯合使用,當垃圾回收器準備回收一個對象時,發現它還有虛引用,就會在回收對象內存之前將虛引用加入到與之關聯的引用隊列中。
解決方法)釋放強引用:使用完對象后將對象置空,只有當這個內存空間不被任何對象引用的時候,垃圾回收器才會去回收。1.Object obj = new Object();2.obj = null;
使用軟引用:封裝強引用,解決內存吃緊的問題。1.String str = "hello"; 2.SoftReferencesr = new SoftReference(str);
使用弱引用:隨時取得某個對象信息,但不影響該對象的垃圾回收則使用弱引用。1.String str = "hello"; 2.WeakReferencews = new WeakReference(str);
圖像處理)---在內存中壓縮圖片---使用完圖片后回收圖片所占內存---降低要顯示的圖片色彩質量---查詢圖片信息時不把圖片加載到內存中。
測試
2.API測試
3.白盒黑盒灰盒測試
4.接口測試
5.sql注入原理