編輯:關於Android編程
在牛客(一個很多筆試面試交流的平台,感覺每天一套可以萌萌哒(☆_☆))上看到一個大神,簡直是offer收割機TAT,其面經中好多東西都是基礎,覺得自己有必要總結並學習我不懂的模塊,趁我還有時間,加油!!
ps:大部分內容都是網上查找的,有侵權的話,立刪(m(_ _)m)
------------------------------
1、Volley 是 Google 推出的 Android 異步網絡請求框架和圖片加載框架。Volley 的特點:特別適合數據量小,通信頻繁的網絡操作,防止OOM發生,listview,每行都是從網絡上獲取的一個圖片和幾行文本,使用Volleyvcfrx/O1xLuwo6zH68fzvau74bfFvfjH68fzttPB0KOszfjC58frx/OzybmmuvOjrCDH68fzvau74bG7u7q05r34Y2FjaGWjrL3T18XN+MLntfe2yM/fs8y9q7SmwO24w8frx/OjrLKiveLO9sr9vt2hozxiciAvPg0KPGEgaHJlZj0="http://blog.csdn.net/guolin_blog/article/details/17482095">http://blog.csdn.net/guolin_blog/article/details/17482095 其他的,未看
2、九種基本數據類型的大小,以及他們的封裝類。
3、Switch能否用string做參數?(整數表達式可以是int基本類型或Integer包裝類型,由於,byte,short,char都可以隱含轉換為int所以可以,而long、float、double類型不符合switch的語法規定,並且不能被隱式轉換成int類型,所以,它們不能作用於swtich語句中。注意:String類型是Java7開始支持的。)
4、equals與==的區別
==可以用來比較基本類型和引用類型,判斷內容和內存地址;
equals只能用來比較引用類型,它只判斷內容。
5、Object有哪些公用方法?
方法equals測試的是兩個對象是否相等,
方法clone進行對象拷貝,
方法getClass返回和當前對象相關的Class對象,
方法notify,notifyall,wait都是用來對給定對象進行線程同步的.
6、 Java的四種引用,強弱軟虛,用到的場景。
強引用就是我們平常使用對象的方式,它就不會被垃圾回收器回收。即使當前內存空間不足,JVM 也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程序異常終止。當方法運行完之後,變量不存在了,所以它們指向的對象都會被JVM回收。
但如果想中斷強引用和某個對象之間的關聯,可以顯式地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該對象。
軟引用通過 SoftReference 創建,在使用軟引用時,如果內存的空間足夠,軟引用就能繼續被使用,而不會被垃圾回收器回收,只有在內存不足時,軟引用才會被垃圾回收器回收。軟引用的這種特性使得它很適合用來解決 OOM 問題,實現緩存機制,例如:圖片緩存、網頁緩存等等……軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被JVM回收,這個軟引用就會被加入到與之關聯的引用隊列中。
弱引用的對象擁有的生命周期更短暫。因為當 JVM 進行垃圾回收,一旦發現弱引用對象,無論當前內存空間是否充足,都會將弱引用回收。不過由於垃圾回收器是一個優先級較低的線程,所以並不一定能迅速發現弱引用對象。
弱引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被JVM回收,這個弱引用就會被加入到與之關聯的引用隊列中。
虛引用並不會影響對象的生命周期。如果一個對象僅持有虛引用,那麼它相當於沒有引用,在任何時候都可能被垃圾回收器回收。虛引用必須和引用隊列關聯使用,當垃圾回收器准備回收一個對象時,如果發現它還有虛引用,就會把這個虛引用加入到與之 關聯的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發現某個虛引用已經被加入到引用隊列,那麼就可以在所引用的對象的內存被回收之前采取必要的行動。
假設你現在持有一個 String——”hello” 的虛引用 pr,那麼當垃圾回收器回收 hello 的時候,就會把虛引用放入引用隊列 queue 之中,然後完成回收。簡單來說,就是讓你知道對象被回收了。
7、 Hashcode的作用。
Java采用了哈希表的原理。哈希算法也稱為散列算法,是將數據依特定算法直接指定到一個地址上。這樣一來,當集合要添加新的元素時,先調用這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。如果這個位置上沒有元素,它就可以 直接存儲在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了,就調用它的equals方法與新元素進行比較,相同的話就不存了;不相同,也就是發生了Hash key相同導致沖突的情況,那麼就在這個Hash key的地方產生一個鏈表,將所有產生相同hashcode的對象放到這個單鏈表上去,串在一起。所以這裡存在一個沖突解決的問題(很少出現)。這樣一來實際調用equals方法的次數就大大降低了,幾乎只需要一兩次。
所以,Java對於eqauls方法和hashCode方法是這樣規定的:
1、如果兩個對象相等,那麼它們的hashCode值一定要相等;
2、如果兩個對象的hashCode相等,它們並不一定相等。
8、ArrayList、LinkedList、Vector的區別。
ArrayList內部是通過數組實現的。數組的缺點是每個元素之間不能有間隔,當數組大小不滿足時需要增加存儲能力,就要講已經有數組的數據復制到新的存儲空間中。當從ArrayList的中間位置插入或者刪除元素時,需要對數組進行復制、移動、代價比較高。因此,它適合隨機查找和遍歷,不適合插入和刪除。
Vector數組實現的,線程安全級別。它支持線程的同步,即某一時刻只有一個線程能夠寫Vector,避免多線程同時寫而引起的不一致性,但實現同步需要很高的花費,因此,訪問它比訪問ArrayList慢。同時Vector查詢數據有迭代器,有枚舉,有get(int index),有indexOf(int index)四種方式,而ArrayList卻沒有枚舉。
LinkedList是用鏈表結構存儲數據的,很適合數據的動態插入和刪除,隨機訪問和遍歷速度比較慢。另外,他還提供了List接口中沒有定義的方法,專門用於操作表頭和表尾元素,可以當作堆棧、隊列和雙向隊列使用。
9、String、StringBuffer與StringBuilder的區別。
StringBuffer(緩存)線程安全的可變字符序列。一個類似於 String 的字符串緩沖區,但不能修改,但通過某些方法調用可以改變該序列的長度和內容。
可將字符串緩沖區安全地用於多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然後將該字符串的字符追加或插入到字符串緩沖區中。append 方法始終將這些字符添加到緩沖區的末端;而 insert 方法則在指定的點添加字符。
StringBuilder一般使用在方法內部來完成類似”+”功能,因為是線程不安全的,所以用完以後可以丟棄.StringBuffer要用在全局變量中
1.如果要操作少量的數據用 = String ,字符+成一句話,用string快
2.單線程操作字符串緩沖區 下操作大量數據 = StringBuilder (不安全)
3.多線程操作字符串緩沖區 下操作大量數據 = StringBuffer (線程安全)
10、Map、Set、List、Queue、Stack的特點與用法。
1) Collection:每個位置只能保存一個元素(對象)
1.1) List必須保持元素特定的順序,有序可重復,順序索引
1.2) Set不能有重復元素,用equals判斷
1.3) Queue保持一個隊列(先進先出)的順序
2) Map:一組成對的”鍵值對”對象,像一個小型數據庫。我們可以通過”鍵”找到該鍵對應的”值”
用於保存具有”映射關系”的數據,因此Map集合裡保存著兩組值,一組值用於保存Map裡的key,另外一組值用於保存Map裡的value。key和value都可以是任何引用類型的數據。Map的key不允
許重復,即同一個Map對象的任何兩個key通過equals方法比較結果總是返回false。
關於Map,我們要從代碼復用的角度去理解,java是先實現了Map,然後通過包裝了一個所有value都為null的Map就實現了Set集合
11、HashMap和HashTable和ConcurrentHashMap的區別
HashMap是非同步,並可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行);不能保證隨著時間的推移Map中的元素次序是不變的。
而Hashtable是同步,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable;即任一時刻只有一個線程能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢。;單線程環境下它比HashMap要慢。與 HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或者值為空Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
ConcurrentHashMap是使用了鎖分段技術技術來保證線程安全的。
鎖分段技術:首先將數據分成一段一段的存儲,然後給每一段數據配一把鎖,當一個線程占用鎖訪問其中一個段數據的時候,其他段的數據也能被其他線程訪問。
12、TreeMap、HashMap、LindedHashMap的區別
Map主要用於存儲健值對,根據鍵得到值,因此不允許鍵重復,但允許值重復。
Hashmap 是一個最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數據的順序是完全隨機的。HashMap最多只允許一條記錄的鍵為Null;不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數據的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以在構造時用帶參數,按照應用次數排序。在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比LinkedHashMap慢,因為LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。
TreeMap實現SortMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。
一般情況下,我們用的最多的是HashMap,HashMap裡面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。
TreeMap取出來的是排序後的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。
LinkedHashMap 是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那麼用LinkedHashMap可以實現,它還可以按讀取順序來排列。
13、Collection包結構,與Collections的區別
Collection是集合類的上級接口,子接口主要有Set 和List、Map。
Collections是針對集合類的一個幫助類,各種有關集合操作的靜態多態方法,提供了操作集合的工具方法:一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
14、 try catch finally,try裡有return,finally還執行麼?(執行)
finally塊的語句在try或catch中的return語句執行之後返回之前執行且finally裡的修改語句可能影響也可能不影響try或catch中 return已經確定的返回值,若finally裡也有return語句則覆蓋try或catch中的return語句直接返回。除非調用system.exit()讓程序退出或斷電等因素致使程序中止,否則,無論任何因素,finally塊都一定會執行!!
15、 Excption與Error包結構。OOM你遇到過哪些情況,SOF你遇到過哪些情況。
Java將可拋出(Throwable)的結構分為三種類型: 被檢查的異常(Checked Exception),運行時異常(RuntimeException)和錯誤(Error)。
Out Of Memory(OOM):引起OOM主要有2個原因,分別是內存洩漏和內存溢出(即堆溢出和棧溢出)。
Stack Over Flow(SOF):(堆)棧溢出主要發生在遞歸的調用中 。
OOM和SOF:遞歸調用可以導致棧溢出,不斷創建對象可以導致堆溢出。
16、Java面向對象的三個特征與含義。
封裝性:它是將類的一些敏感信息隱藏在類的類部,不讓外界直接訪問到,但是可以通過getter()和setter()間接訪問。
繼承性:子類通過一種方式來接受父類所有的公有的,受保護的成員變量和成員方法。
多態性:程序在運行的過程中,同一種類型在不同的條件下表現不同的結果,這種不定狀態的表現形式稱為多態性。
17、Override和Overload的含義和區別
區別:重寫(Override)是父類與子類之間多態性的一種表現,而重載(Overload)是一個類中多態性的一種表現。如果在子類中定義某方法與其
重寫(Override):父類有相同的名稱和參數,我們說該方法被重寫 (Override)。子類的對象使用這個方法時,將調用子類中的定義,而父類中的定義如同被屏蔽了。
重載(Overload):如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型或有不同的參數次序,則稱為方法的重載(Overload)。
18. interface與abstract類的區別。
Java中可以有靜態實例變量、靜態方法、靜態塊,當然也可以有靜態類,但是用static不能修飾頂級類,只能修飾內部類。
靜態內部類和非靜態內部類究竟有什麼區別呢?
內部靜態類不需要有指向外部類的引用,因為用static聲明的靜態內部類變成了外部類,但是非靜態內部類需要持有對外部類的引用;
非靜態內部類能夠訪問外部類的靜態和非靜態成員(數據成員和成員函數),但是靜態內部類只能訪問外部類的靜態成員(數據成員和成員函數);
非靜態內部類不能脫離外部類實體被創建,但是非靜態內部類可以訪問外部類的數據和函數,因為它就在外部類裡面;
如果在方法中定義的內部類要想訪問方法中的參數,那麼必須在參數前加上final關鍵字。
20. Java多態的實現原理 [24]。
解析:
靠的是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存裡正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。
解析:
Thread類:它是在java.lang包中定義的,一個類只要繼承了Thread類,此類就稱為多線程實現類。在Thread子類中,必須明確地覆寫Thread類中的run(),因為此方法為線程的主體。
Runable接口:在Java中也可以通過實現Runnable接口的方式實現多線程,Runnable接口中只定義了一個抽象方法:public void run()。
區別:通過public class Thread extends Object implements Runnable發現,Thread類也是Runnable接口的子類,但是在Thread類中並沒有完全地實現Runnable接口中的run(),而是調用的Runnable接口中的run()。因此,如果通過繼承Thread類實現多線程,那麼必須覆寫run()。實際上,Runnable接口相對於Thread類來說更適合多個相同程序代碼的線程去處理同一資源的情況。
22. 線程同步的方法:sychronized、lock、reentrantLock、Atomic等 [25][26]。
解析:synchronized是jvm虛擬機的關鍵字,在java.util.concurrent.locks命名空間中還有一個Lock接口,和Lock接口的實現類ReentrantLock(可重入鎖)。
如果資源競爭不是很激烈,偶爾會有同步的情形,那麼synchronized是非常合適的選擇;
ReentrantLock提供了多樣化的同步,比如有可以被Interrupt的同步(synchronized的同步是不能被Interrupt的)等。如果資源競爭不是很激烈,那麼它的性能稍微比synchronized差點兒。但是,當資源競爭很激烈的時候,synchronized是非常合適的選擇;
與ReentrantLock的情況類似,如果資源競爭不是很激烈,那麼它的性能稍微比synchronized差點兒。但是,當資源競爭很激烈的時候,Atomic的性能會優於ReentrantLock一倍左右。但是,它也有一個缺點,那就是只能同步一個值。
23. 鎖的等級:對象鎖(方法鎖)、類鎖等相關知識點 [27]。
解析:簡單來說,就是兩個鎖的粒度不同。對象鎖的粒度是對象,而類鎖的對象是類。
對象鎖就是在一個類的方法前面加synchronized關鍵字(對象的方法);
類鎖就是在一個類的方法前面加synchronized static關鍵字(類的方法)。
一、RatingBar簡單介紹RatingBar是基於SeekBar(拖動條)和ProgressBar(狀態條)的擴展,用星形來顯示等級評定,在使用默認RatingBar
效果圖如下:PopupWindow 是一個可以顯示在當前 Activity 之上的浮動容器,PopupWindow 彈出的位置是能夠改變的,按照有無偏移量,可以分為無偏移
1、View和ViewRootViewRoot從名稱上來理解似乎是“View樹的根”,這很容易讓人產生誤解。因為ViewRoot並不屬於View樹
TouchImageView繼承自ImageView具有ImageView的所有功能;除此之外,還有縮放、拖拽、雙擊放大等功能,支持viewpager和scaletype