Android面試題及其答案(三)

1、list map set三個接口,存取元素時,各有什麼特點?
List與Set都是單列元素的集合,它們有一個功共同的父接口Collection。
Set裏面不允許有重複的元素.
存元素:add方法有一個boolean的返回值,當集合中沒有某個元素,此時add方法可成功加入該元素時,則返回true;當集合含有與某個元素equals相等的元素時,此時add方法無法加入該元素,返回結果爲false。
取元素:沒法說取第幾個,只能以Iterator接口取得所有的元素,再逐一遍歷各個元素。 
List表示有先後順序的集合.
存元素:多次調用add(Object)方法時,每次加入的對象按先後順序排序,也可以插隊,即調用add(int index,Object)方法,就可以指定當前對象在集合中的存放位置。
取元素:方法1:Iterator接口取得所有,逐一遍歷各個元素
        方法2:調用get(index i)來明確說明取第幾個。 
Map是雙列的集合,每次存儲時,要存儲一對key/value,不能存儲重複的key,這個重複的規則也是按equals比較相等。
存元素:存放用put方法:put(obj key,obj value)。
取元素:用get(Object key)方法根據key獲得相應的value;
        也可以獲得所有的key的集合,還可以獲得所有的value的集合;
        還可以獲得key和value組合成的Map.Entry對象的集合。 
List以特定次序來持有元素,可有重複元素。Set無法擁有重複元素,內部排序。Map 存key-value值,key不能重複。
2、Collection是什麼?
Collection 是集合類的上級接口,繼承與他的接口主要有 Set 和 List. Collections 是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
3、ArrayList vs Vector
ArrayList 和 Vector 都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按 序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector 由於使用了 synchronized 方法(線程安全),通常性能上較 ArrayList 差,而 LinkedList 使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快。
4、HashMap vs Hashtable
HashMap 是 Hashtable 的輕量級實現(非線程安全的實現),他們都完成了 Map 接口,主要區別在於 HashMap 允許空(null)鍵值(key),由於非線程安全效率上可能高於 Hashtable。 HashMap 允許將 null 作爲一個 entry 的 key 或者 value,而 Hashtable 不允許。
HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因爲 contains 方法容易讓人引起誤解。 Hashtable 繼承自 Dictionary 類,而 HashMap 是 Java1.2 引進的 Map interface 的一個實現。 最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多個線程訪問 Hashtable 時,不需要自己爲它的 方法實現同步,而 HashMap 就必須爲之提供外同步。
Hashtable 和 HashMap 採用的 hash/rehash 算法都大概一樣,所以性能不會有很大的差異。
5、sleep vs wait
sleep 是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時間後會自動恢復。調用 sleep 不會釋放對象鎖。
wait 是 Object 類的方法,對此對象調用 wait 方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發 出 notify(或 notifyAll)方法後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
6、android touch事件分發機制
View關鍵的函數:dispatchTouchEvent,onTouch,onTouchEvent,onClieck。
ViewGroup關鍵函數:dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent。
onInterceptTouchEvent返回true就代表攔截子view的touch事件,那麼此時就交由父類view的dispatchTouchEvent處理。
詳細流程請參另一篇博文:http://blog.csdn.net/wdong_love_cl/article/details/51477607
7、android斷點續傳下載實現的大致思路
以下載爲例:
使用HttpURLConnection進行下載,使用RandomAccessFile進行文件寫入。
1、需要獲取需要下載的文件大小並設置到本地文件,使用:
int filesize = 0;
filesize = httpURLConnection.getContentLength();
RandomAccessFile file;
file.setLength(filesize);
2、根據文件大小和線程數來確定每個線程需要下載的大小,如:文件的大小爲8M,有4個線程,那麼每個線程就需要下載2M。
3、確定每個線程下載的開始和結束位置 httpURLConnection.setRequestProperty("Range", "bytes=" + startPosition + "-" + endPosition);
4、可以使用file.seek(position)來明確規定從什麼地方開始寫入;
8、handler.sendmessage的大致步驟
消息存到消息隊列:
handler.sendMessage()-->handler.sendMessageDelayed()-->handler.sendMessageAtTime()-->msg.target = this[就是handler];queue.enqueueMessage()==>把msg添加到消息隊列中
從消息隊列取出並處理:
Looper.loop()[死循環,不停從消息隊列取消息]--> msg.target.dispatchMessage(msg)--->handler.handleMessage()
詳細流程請參另一篇博文:http://blog.csdn.net/wdong_love_cl/article/details/43572773
9、android scrollview嵌套viewpager滑動衝突
兩種解決方法:
1、重寫scrollview類的onInterceptTouchEvent方法,如果發現是水平滑動的話,那就在該方法內返回false,這樣就不攔截viewpager了,會執行viewpager的onTouchEvent方法;
2、重寫viewpager中的onTouchEvent方法,如果MotionEvent.ACTION_DOWN或者MotionEvent.ACTION_MOVE的水平滑動就設置getParent().requestDisallowInterceptTouchEvent(true),如果是豎直滑動就設置爲false.
10、Android fregment 的使用
詳情見:http://blog.csdn.net/wdong_love_cl/article/details/51569440
11、String str1="abc" 和 String str1=new String("abc"); 這兩個的區別是什麼?
前者在編譯的時候就將"abc"放在方法區的字符串常量池當中,並利用str1指向這個字符串常量,而後者是在運行的時候,在堆區創建一個字符串對象"abc"並利用str1指向這個對象,因此兩個str1指向的內存地址不同,而邏輯上輸出的內容相同。
12、android的官方建議應用程序的開發採用mvc模式,何謂mvc?
mvc是model,view,controller的縮寫,mvc包含三個部分:
模型(model)對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該層。
視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。
控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,響應用戶出發的相關事件,交給model處理。
android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下:
1)視圖層(view):一般採用xml文件進行界面的描述,使用的時候可以非常方便的引入,當然,如何你對android瞭解的比較的多了話,就一定 可以想到在android中也可以使用javascript+html等的方式作爲view層,當然這裏需要進行java和javascript之間的通 信,幸運的是android提供了它們之間非常方便的通信實現。
2)控制層(controller):android的控制層的重 任通常落在了衆多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業務邏輯層處理, 這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這裏,程序就很容易被回收掉。
3)模型層(model):對數據庫的操作、對網絡等的操作都應該在model裏面處理,當然對業務計算等操作也是必須放在的該層的。
13、如何將SQLite數據庫(dictionary.db文件)與apk文件一起發佈?
可以將dictionary.db文件複製到工程中的res/raw目錄中。所有在res/raw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。
14、如何打開res/raw目錄中的數據庫文件?
在Android中不能直接打開res /raw目錄中的數據庫文件,而需要在程序第一次啓動時將該文件複製到手機內存或SD卡的某個目錄中,然後再打開該數據庫文件。複製的基本方法是使用getResources().openRawResource方法獲得res raw目錄中資源的InputStream對象,然後將該InputStream對象中的數據寫入其他的目錄中相應文件中。在Android中可以使用SQLiteDatabase.openOrCreateDatabase()方法來打開任意目錄中的SQLite數據庫文件。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章