安卓 每日一題 2019年

安卓 每日一題 2019年

安卓2019年09月每日一題

Android 9月5日題:某學生信息表,設一組表示成績的關鍵字序列(24,15,32,28,19,10,40)採用直接插入排序時,當插入記錄19到有序表時,爲找插入位置需比較次數爲( )

A、2

B、3

C、4

D、5

答案:C、4

解析:插入排序是從後往前比的 所以 15 24 28 32的比較方向是 32->28->24->15


Android 9月6日題:下列哪些算法在排序過程中需要一個記錄的輔助空間( )

A、直接選擇排序

B、直接插入排序

C、冒泡排序

D、歸併排序

答案: A BC

解析:

直接選擇排序:前面逐漸有序,每次從後面的無序數列中找最大或最小繼續添加到前面有序數列中,兩兩交換需要一個輔助空間

直接插入排序:類似打鬥地主,每次抓一張牌,從後往前比較,把新抓的牌放到合適大小的位置,兩兩交換需要一個輔助空間

冒泡排序:每次把當前無序數列中最大或最小的數交換到此無序數量的最後,兩兩交換需要一個輔助空間

歸併排序:分治法把當前待排數組分成多個子序列,先使每個子序列有序,再使子序列段間有序,需要 O(n)的輔助空間


Android 9月9日題:假設在有序線性表A[1…30]上進行二分查找,則比較五次查找成功的結點數爲( )

A、8

B、12

C、15

D、16

答案:C、15

查找一次成功的節點數爲1,值爲15

查找二次成功的節點數爲2,值爲7,23

查找三次成功的節點數爲4,值爲3,11,19,27

查找四次成功的節點數爲8,值爲1,5,9,13,17,21,25,29

查找五次成功的節點數爲15,值爲2,3,4,6,8,10,12,14,16,18,20,22,24,26,28,30


Android 9月10日題:自定義Handler 時如何有效地避免內存泄漏問題?

答案:

  1. 自定義的靜態handler

  2. 可以加一個弱引用

  3. 在生命周的ondestroy()中removecallbacksandmessages(null)清除Message和Runnable


Android 9月11日題:Activity與Fragment 之間常見的幾種通信方式?

答案:1 互相持有對方的引用直接調用

2 Broadcast Receiver

3 EventBus

4 設置接口間接調用

5 Bundle


Android 9月12日題:IP/掩碼位爲192.168.1.0可用地址和最後一個可用地址分別是什麼()

A. 192.168.1.1 192.168.255.255

B. 192.168.1.1 192.168.1.254

C. 192.0.0.1 192.255.255.255

D. 192.0.0.1 192.255.255.254

答案解析:192.168.1.0/24,掩碼位是24,所以主機地址只看後面8位就可以了。

如果主機號全0,IP地址代表僅網絡號指向的那個網段,該IP代表一個網段;如果主機號全1,IP地址代表網絡號指向的全部主機,IP地址代表廣播地址;其他就是普通的IP地址,指向網域中的一個主機了

所以答案就是B了


Android 9月16日題:
設置Activity的哪個屬性爲true時,該Activity會被銷燬,其他的不會被銷燬?

A.clearTaskOnLaunch

B.finishTaskOnLaunch

C.alwaysRetainTaskState

D.其他幾項都不對

答案:B。

分析:

選項A,clearTaskOnLaunch:啓動時清除任務,每次返回activity時,該activity上的所有activity都將被clear,即清除其他activity,保留自己,所以不選。

選項B,finishTaskOnLaunch:啓動時結束任務,當離開這個activity所在的task,那麼用戶再返回的時候,該activity都會被finish,即清除自己,保留其他activity,符合題意。

選項C,alwaysRetainTaskState:始終保留任務狀態,始終保留自己。

選項D,想都不要想!


Android 9月17日題:退出Activity我們有多種方法,以下選項中下哪一個是不正確的退出Activity的方法?

A. finish()

B. 拋出異常強制退出

C. System.exit()

D. onStop()

答案:C

分析:

選項A是銷燬界面;

選項B是拋出異常強制退出;

選項C是整個應用程序退出,停止進程,所以符合題意,是不正確的退出Activity.

選項D是停止。


Android 9月18日題:TCP三次握手時,客戶端發送SYN報文給服務器端,服務器端收到SYN報文,迴應一個A,客戶端收到服務器端的B報文迴應一個C,最終進入D狀態。

正確答案:

1 SYN

2 SYN

3 ACK

4 Established

答案:三次握手:第一次握手:客戶端發送syn包(syn=x)到服務器,並進入SYN_SEND狀態,等待服務器確認;第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。


Android 9月19日題:當在瀏覽器輸入http://www.jd.com後,執行過程描述有誤的是哪個?

A. 客戶端瀏覽器通過DNS解析到www.jd.com的ip地址,通過ip地址找到客戶端對應的服務器地址,客戶端發起HTTP會話到IP,通過tcp進行封裝數據包,輸入到網絡層

B. 在客戶端的網絡層,把http會話請求分成報文段,添加源地址和目的地址

C. 客戶端的網絡層主要通過查找路由確定到達服務器

D. 數據包通過鏈路層發送到路由器,通過鄰居協議查找給定ip地址的mac地址,然後發送ARR請求查找目的地址,得到迴應就可以使用ARR的請求應答交換的IP數據包,發送IP數據包到達服務器地址

答案:B

在客戶端的傳輸層,把HTTP會話請求分成報文段,添加源和目的端口。


Android 9月20日題:關於ContentProvider的下列表述錯誤的是?()

A.ContentProvider通過Binder機制實現應用數據共享

B.ContentProvider. onCreate ()一定在Application.onCreate()之後執行

C.ContentProvider通過URI來區分外界要坊向的數據集合

D.一個應用可以提供多個ContentProvider

答案:答案是B,


Android 9月21日題:(多選題)關於虛函數,下面哪些描述是正確的 ( )

A. 虛函數是實現方法重載的工具

B. Java中所有的函數都是虛函數

C. 通過虛函數,類體系獲得了多態性支持

D. 虛函數必須在子類中實現

E. 虛函數不能夠被子類繼承

F. 在C++中,基類的析構函數建議爲虛析構函數

答案:D、F

解析:C項,java中多態是通過重載和重寫實現的。
C++中普通成員函數加上virtual關鍵字就成爲虛函數
Java中其實沒有虛函數的概念,它的普通函數就相當於C++的虛函數,動態綁定是Java的默認行爲。如果Java中不希望某個函數具有虛函數特性,可以加上final關鍵字變成非虛函數


Android 9月24日題:多選題:哪些方法可用於顯示Intent啓動activity( )

A. setComponent()

B. setClass()

C. setClassName()

D. getClassName()

答案:A、B、C

解析:題目的意思原來是顯式intent啓動activity有什麼方法…

(1)構造方法

//Intentintent = new Intent(Context packageContext,Class<?> cls); //前者爲啓動活動的上下文,後者爲想要啓動的目標活動Intent intent = new Intent(FirstActivity.this,SecondActivity.class);

(2)setComponent方法

ComponentNamecomponentName = new ComponentName(this, SecondActivity.class);

Intentintent = new Intent();

intent.setComponent(componentName);

startActivity(intent);

(3)setClass/setClassName方法

Intentintent = new Intent();

intent.setClass(this,SecondActivity.class);// 或者intent.setClassName(this,“top.longsh1z.www.SecondActivity”); // 或者intent.setClassName(this.getPackageName(),“top.longsh1z.www.SecondActivity”);

startActivity(intent);


Android 9月25日題:(多選題)下面屬於GLSurfaceView特性的是?

A. 管理一個surface,這個surface就是一塊特殊的內存,能直接排版到Android的視圖view上

B. 管理一個EGLdisplay,它能讓OpenGL把內容渲染到上述surface上

C. 讓渲染器在獨立的線程裏運作,和UI線程分離

D. 可以直接從內存或者DMA等硬件接口取得圖像數據

答案:A、B、C

解析:GLSurfaceView是一個視圖,繼承至SurfaceView,它內嵌的surface專門負責OpenGL渲染。

GLSurfaceView提供了下列特性:

1、管理一個surface,這個surface就是一塊特殊的內存,能直接排版到android的視圖view上。(A 正確)

2、管理一個EGLdisplay,它能讓opengl把內容渲染到上述的surface上。(B正確)

3、讓渲染器在獨立的線程裏運作,和UI線程分離。(C正確)

4、用戶自定義渲染器(render)

5、支持按需渲染(on-demand)和連續渲染(continuous)。

6、一些可選工具,如調試。


每日一題:關於res/raw目錄說法正確的是?

A. 這裏的文件是原封不動的存儲到設備上,不會轉換爲二進制的格式

B. 這裏的文件沒有目錄結構

C. 這裏的文件最終以二進制的格式存儲到應用的安裝包中

D. 這裏的文件都會在R.java中生成唯一ID

正確答案:A、B、D


Android 9月26日題:在軟件開發過程中,我們可以採用不同的過程模型,下列有關增量模型描述正確的()

A. 已使用一種線性開發模型,具有不可回溯性

B. 把待開發的軟件系統模塊化,將每個模塊作爲一個增量組件,從而分批次地分析、設計、編碼和測試這些增量組件

C. 適用於已有產品或產品原型(樣品),只需客戶化的工程項目

D. 軟件開發過程每迭代一次,軟件開發又前進一個層次

答案:B

解析:1. 瀑布模型:提出了軟件開發的系統化、順序方法,強調開發的階段性,各階段具有順序性和依賴性。

2.增量過程模型:1) 增量模型:把軟件產品作爲一系列的增量構件來設計、編碼、集成和測試。2) RAD模型:側重於短暫開發週期的增量軟件過程模型。

3.演化過程模型:原型開發;螺旋模型;協同開發模型

4.統一過程模型:一種以體系結構爲核心、迭代及增量的軟件過程框架


Android 9月27日題:索引是對數據庫表中一個或多個列的值進行排序的數據結構,以協助快速查詢、更新數據庫表中數據。以下對索引的特點描述錯誤的是:

A. 加快數據的檢索速度

B. 加速表和表之間的連接

C. 在使用分組和排序子句進行數據檢索時,並不會減少查詢中分組和排序的時間

D. 通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性

答案:C

索引的特點

1大大加快檢索數據的速度

2通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性

3加速表與表之間的連接

4查詢語句彙總含有分組或者排序的語句時,速度更快

5查詢的過程中,使用索引,使用優化隱藏器,從而提高系統的性能

索引的不足

1創建和維護索引,比較耗費時間,隨着數據量的增大而增大

2創建索引,佔一定的物理空間(聚簇索引,佔用空間會更大)

3在對錶進行增刪改的時候,索引相應的也需要進行動態的更新

所以這題就選C


Android 9月28日題:ANR產生時, 系統會生成一個跟蹤日誌文件,文件是()

A. data/anr/traces.txt

B. data/anr/log.txt

C. data/log/traces.txt

D. data/data/log.txt

答案:A

ANR即ApplicationNot Responding,應用無響應。

發生ANR時,系統會產生traces.txt文件,目錄爲/data/anr

由於該文件的產生是在DVM中的,所以只有運行DVM實例的進程才能產生該文件,也就是說只有Java代碼才能產生該文件,App應用的Native層(如AndroidLibrary、用c/c++編譯的庫)即使異常也不會產生ANR日誌文件


Android 9月29日題:Android手機安裝的應用都是以apk的形式來進行的。他實質上是個壓縮包。在apk包中都沒有包含的文件是()

A. 開發過程中的各種資源文件

B. 代碼類文件包classes.dex

C. AndroidManifest.xml

D. src下的.java文件

答案:D


Android 9月30日題:多選題)下列描述造成ANR的原因正確的是

A. input事件在5s內沒有處理完成會發生ANR

B. 前臺廣播的onReceive處理事務時超過15s會發生ANR

C. 後臺Service在200s內沒有處理完成會發生ANR

D. 前臺Service在20s內沒有處理完成會發生ANR

答案: ACD

解析:B項,廣播OnReceive是10S,所以錯誤,不選。


安卓2019年10月每日一題

Android 10月7日題:關於Java內存區域下列說法不正確的有哪些

A. 程序計數器是一塊較小的內存空間,它的作用可以看做是當前線程所執行的字節碼的信號指示器,每個線程都需要一個獨立的程序計數器.

B. Java虛擬機棧描述的是java方法執行的內存模型,每個方法被執行的時候都會創建一個棧幀,用於存儲局部變量表、類信息、動態鏈接等信息

C. Java堆是java虛擬機所管理的內存中最大的一塊,每個線程都擁有一塊內存區域,所有的對象實例以及數組都在這裏分配內存。

D. 方法區是各個線程共享的內存區域,它用於存儲已經被虛擬機加載的常量、即時編譯器編譯後的代碼、靜態變量等數據。

答案:BC

解析:A.程序計數器是一塊較小的內存空間,它的作用可以看做是當前線程所執行的字節碼的信號指示器(偏移地址),Java編譯過程中產生的字節碼有點類似編譯原理的指令,程序計數器的內存空間存儲的是當前執行的字節碼的偏移地址,每一個線程都有一個獨立的程序計數器(程序計數器的內存空間是線程私有的),因爲當執行語句時,改變的是程序計數器的內存空間,因此它不會發生內存溢出,並且程序計數器是jvm虛擬機規範中唯一一個沒有規定OutOfMemoryError 異常的區域;

B.java虛擬機棧:線程私有,生命週期和線程一致。描述的是 Java方法執行的內存模型:每個方法在執行時都會牀創建一個棧幀(StackFrame)用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用直至執行結束,就對應着一個棧幀從虛擬機棧中入棧到出棧的過程。 沒有類信息,類信息是在方法區中

C.java堆:對於絕大多數應用來說,這塊區域是 JVM 所管理的內存中最大的一塊。線程共享,主要是存放對象實例和數組

D.方法區:屬於共享內存區域,存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。

上面部分內容從下面文章中總結:

https://blog.csdn.net/qq_41701956/article/details/81664921


以下JavaScript程序執行後返回的結果是:( )

var p1 = {
  name:'小明',
  age:'12',
  action:function(where,doing){
   console.log(this.age + '歲的'+this.name + '在' + where + doing);
  } 
}
var p2 = {
  name:'小紅',
  age:'15'
}
console.log(p1.action.call(p2,'操場上','運動'))

A. 12歲的小明在undefined undefined
B. 12歲的小明在操場上運動
C. 15歲的小紅在undefined undefined
D. 15歲的小紅在操場上運動 undefined

答案 D


Android 10月8日題:什麼是Binder?Android中進程間通信的機制是怎樣的?

答案:

Binder是面向對象的IPC,分爲Natvie層,Java層,BinderDriver層。Binder有一個守護進程叫ServiceManager,分爲Natvie層和Java層,我們可以通過addService和getService等接口來操作Binder對象,Binder對象分爲BpBinder和BBinder.

要說清楚IBinder,Binder,BinderProxy以及IInterface的關係,要說清楚ServiceManager,IServiceManager,ServiceManagerNative,ServiceManagerProxy的關係,知道是在SystemServer的ServerThread線程裏註冊系統級Binder對象,知道可以從Context獲取Binder對象。


Android 10月9日題:Android的數據存儲方式有哪些?

A. SharedPreferences

B. File

C. SQLite

D. Bundle

答案:A BC

解析:

SharedPrefrences以 xml 數據格式將數據持久化,一般用於存儲配置信息;

SQL數據庫;

File各種文件保存,保存於手機的存儲中。


Android 10月10日題:簡答題)爲什麼在Android中Activity,Fragment之間傳遞參數需要通過Bundle?有什麼限制?

答案:1. Activity間,可能會跨進程,需要Parcel

2.Activity與Fragment或Fragment之間雖然不會跨進程,但是由於Activity可能會被回收,需要爲Fragment保存及恢復必要的狀態及參數,所以也需要通過Bundle來保證傳遞的數據可恢復

3.受Binder緩衝區大小影響。自定義類需要實現parcelable接口或serializable接口


Android 10月11日題:(多選題)對於淘寶商城高流量訪問,預防Ddos的方法可以有?

A. 限制同時打開SYN半鏈接的數目。

B. 縮短SYN半鏈接的Timeout 時間。

C. 關閉不必要的服務。

D. 限制客戶端請求服務器時長。

補充:分佈式拒絕服務(DDoS:DistributedDenial of Service)攻擊指藉助於客戶/服務器技術,將多個計算機聯合起來作爲攻擊平臺,對一個或多個目標發動DDoS攻擊,從而成倍地提高拒絕服務攻擊的威力。

答案:A BC

解析:DDoS攻擊通過大量合法的請求佔用大量網絡資源,以達到癱瘓網絡的目的。

SYN是TCP/IP建立連接時使用的握手信號。在客戶機和服務器之間建立正常的TCP網絡連接時,客戶機首先發出一個SYN消息,服務器使用SYN+ACK應答表示接收到了這個消息,最後客戶機再以ACK消息響應。這樣在客戶機和服務器之間才能建立起可靠的TCP連接,數據纔可以在客戶機和服務器之間傳遞。


Android 10月12日題:(論述題)如何縮減APK包大小?

答題角度:

  1. 代碼

  2. 資源

  3. 策略

代碼

保持良好的編程習慣,不要重複或者不用的代碼,謹慎添加libs,移除使用不到的libs。

使用proguard混淆代碼,它會對不用的代碼做優化,並且混淆後也能夠減少安裝包的大小。

nativecode的部分,大多數情況下只需要支持armabi與x86的架構即可。如果非必須,可以考慮拿掉x86的部分。

資源

使用Lint工具查找沒有使用到的資源。去除不使用的圖片,String,XML等等。assets目錄下的資源請確保沒有用不上的文件。

生成APK的時候,aapt工具本身會對png做優化,但是在此之前還可以使用其他工具如tinypng對圖片進行進一步的壓縮預處理。

jpeg還是png,根據需要做選擇,在某些時候jpeg可以減少圖片的體積。對於9.png的圖片,可拉伸區域儘量切小,另外可以通過使用9.png拉伸達到大圖效果的時候儘量不要使用整張大圖。

策略

有選擇性的提供hdpi,xhdpi,xxhdpi的圖片資源。建議優先提供xhdpi的圖片,對於mdpi,ldpi與xxxhdpi根據需要提供有差異的部分即可。

儘可能的重用已有的圖片資源。例如對稱的圖片,只需要提供一張,另外一張圖片可以通過代碼旋轉的方式實現。

能用代碼繪製實現的功能,儘量不要使用大量的圖片。例如減少使用多張圖片組成animate-list的AnimationDrawable,這種方式提供了多張圖片很佔空間。


Android 10月13日題:

(問答題)Android與服務器交互的方式中的對稱加密和非對稱加密分別是什麼?

答案:對稱加密,就是加密和解密數據都是使用同一個key,這方面的算法有DES。

非對稱加密,加密和解密是使用不同的key。發送數據之前要先和服務端約定生成公鑰和私鑰,使用公鑰加密的數據可以用私鑰解密,反之。這方面的算法有RSA。ssh 和 ssl都是典型的非對稱加密。


Android 10月15日題:(多選題)Android中進程間通信有哪些實現方式?

A. Intent

B. Binder(AIDL)

C. Messenger

D. BroadcastReceiver

答案:全選!全選!ABCD all in!


Android 10月16日題:介紹下實現一個自定義view的基本流程。

答案:1、自定義View的屬性編寫attr.xml文件

2、在layout佈局文件中引用,同時引用命名空間

3、在View的構造方法中獲得我們自定義的屬性,在自定義控件中進行讀取(構造方法拿到attr.xml文件值)

4、重寫onMesure

5、重寫onDraw


Android 10月17日題:(邏輯推理題)一羣人開舞會,每人頭上都戴着一頂帽子。帽子只有黑白兩種,黑的至少有一頂。每個人都能看到其它人帽子的顏色,卻看不到自己的。主持人先讓大家看看別人頭上戴的是什幺帽子,然後關燈,如果有人認爲自己戴的是黑帽子,就打自己一個耳光。第一次關燈,沒有聲音。於是再開燈,大家再看一遍,關燈時仍然鴉雀無聲。一直到第四次關燈,纔有劈劈啪啪打耳光的聲音響起。請問有多少人戴着黑帽子?

答案:四。

解析:

這是道典型的邏輯題,奧妙就在你得作個假設。假如只有一個人戴黑帽子,那他看到所有人都戴白帽,在第一次關燈時就應打耳光,所以應該不止一個人戴黑帽子;如果有兩頂黑帽子,第一次兩人都只看到對方頭上的黑帽子,不敢確定自己的顏色,但到第二次關燈,這兩人應該明白,如果自己戴着白帽,那對方早在上一次就應打耳光了,因此自己戴的也是黑帽子―――於是也會有兩個人打耳光;可事實是第三次才響起打耳光聲,說明全場有三頂黑帽,依此類推,應該是關幾次燈,有幾頂黑帽。

題目說是第四次關燈,所以一共有四頂黑帽子。


Android 10月18日題:ANR是什麼?怎樣避免和解決ANR?

答案:ANR:ApplicationNot Responding,即應用無響應

ANR一般有三種類型:

1:KeyDispatchTimeout(5seconds) –主要類型

按鍵或觸摸事件在特定時間內無響應

2:BroadcastTimeout(10seconds)

BroadcastReceiver在特定時間內無法處理完成

3:ServiceTimeout(20seconds) –小概率類型

Service在特定的時間內無法處理完成

超時的原因一般有兩種:

(1)當前的事件沒有機會得到處理(UI線程正在處理前一個事件沒有及時完成或者looper被某種原因阻塞住)

(2) 當前的事件正在處理,但沒有及時完成。

UI線程儘量只做跟UI相關的工作,耗時的工作(數據庫操作,I/O,連接網絡或者其他可能阻礙UI線程的操作)放入單獨的線程處理,儘量用Handler來處理UIthread和thread之間的交互。

UI線程主要包括如下:

Activity:onCreate(),onResume(), onDestroy(), onKeyDown(), onClick()

AsyncTask:onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel()

Mainthreadhandler: handleMessage(), post(runnable r)

other


Android 10月21日題:(問答題)Android多線程的實現方式有哪些?

答案:1.Handler+Thread

2.AsyncTask

3.ThreadPoolExecutor

4.IntentService

Thread& AsyncTask

Thread可以與Loop 和Handler 共用建立消息處理隊列

AsyncTask可以作爲線程池並行處理多任務


Android 10月23日題:(多選題)進程a讀取b進程中的某個變量(非共享內存),可行的方式有()

A. b進程向消息隊列寫入一個包含變量內容的消息,a進程從隊列中讀出

B. 通過本地環路通信

C. 如果a、b 非親屬,那麼a通過命名管道把這個變量的地址發給b進程

D. 如果b是a 進程的子進程,那麼b直接讀取變量內容即可

答案:A B

解析:

選項C:命名管道雖然可以通訊,但是把變量的地址傳遞過去是沒有用的,因爲不同的進程的地址空間是獨立的,誰也不能訪問誰的,只有傳值纔行,傳地址是不行的,所以C錯;

選項D:子進程雖然是由父進程fork()出來的,但是仍然屬於兩個進程,不同進程之間也是獨立的,子進程無權讀取父進程的變量。


Android 10月24日題:(單選題)下面關於Android UI框架描述的選項中有誤的一項是()

A. Android中所有的 UI(用戶界面)元素都是使用 View和ViewGroup 對象建立的。

B. ViewGroup是一個可以將一些信息繪製在屏幕上並與用戶產生交互的對象。

C. ViewGroup是一個包含多個的 View和ViewGroup 的容器,用來定義UI 佈局。

D. Android使用 View類作爲界面開發的超類,所有的界面開發都與View有關。

答案:B

解析:View是所有UI組件的基類,而ViewGroup是容納View及其派生類的容器,ViewGroup也是從View派生出來的。一般來說,開發UI界面都不會直接使用View和ViewGroup(自定義控件的時候使用),而是使用其派生類。


下面關於垃圾收集的說法正確的是

A.一旦一個對象成爲垃圾,就立刻被收集掉。

B. 對象空間被收集掉之後,會執行該對象的finalize方法

C. finalize方法和C++的析構函數是完全一回事情

D. 一個對象成爲垃圾是因爲不再有引用指着它,但是線程並非如此

正確答案: D


Android 10月25日題:(單選題)抽象類和接口的區別,一下說法錯誤的是

A. 接口是公開的,裏面不能有私有的方法或變量,是用於讓別人使用的,而抽象類是可以有私有方法或私有變量的。

B. abstract class 在 Java語言中表示的是一種繼承關係,一個類只能使用一次繼承關係。但是,一個類卻可以實現多個interface,實現多重繼承。接口還有標識(裏面沒有任何方法,如Remote接口)和數據共享(裏面的變量全是常量)的作用。

C. 在abstract class 中可以有自己的數據成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態的不能被修改的數據成員(也就是必須是static final的,不過在interface中一般不定義數據成員),所有的成員方法默認都是public abstract 類型的。

D. abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"has-a"關係,interface表示的是"is-a"關係。

答案:D


Android 10月28題:(簡答題)什麼是類加載器?類加載器有哪些?

答案:通過類的權限定名獲取該類的二進制字節流的代碼塊叫做類加載器。

主要有一下四種類加載器

1.啓動類加載器:這個類加載器負責放在<JAVA_HOME>\lib目錄中的,或者被-Xbootclasspath參數所指定的路徑中的,並且是虛擬機識別的類庫。用戶無法直接使用。

2.擴展類加載器:這個類加載器由sun.misc.Launcher$AppClassLoader實現。它負責<JAVA_HOME>\lib\ext目錄中的,或者被java.ext.dirs系統變量所指定的路徑中的所有類庫。用戶可以直接使用。

3.應用程序類加載器:這個類由sun.misc.Launcher$AppClassLoader實現。是ClassLoader中getSystemClassLoader()方法的返回值。它負責用戶路徑(ClassPath)所指定的類庫。用戶可以直接使用。如果用戶沒有自己定義類加載器,默認使用這個。

  1. 自定義加載器:用戶自己定義的類加載器。

Android 10月29日題:(簡單題)判斷一個對象是否存活有哪些方法?

答案:1.引用計數法

所謂引用計數法就是給每一個對象設置一個引用計數器,每當有一個地方引用這個對象時,就將計數器加一,引用失效時,計數器就減一。當一個對象的引用計數器爲零時,說明此對象沒有被引用,也就是“死對象”,將會被垃圾回收.

引用計數法有一個缺陷就是無法解決循環引用問題,也就是說當對象 A 引用對象 B,對象B 又引用者對象 A,那麼此時 A,B 對象的引用計數器都不爲零,也就無法完成垃圾回收,所以主流的虛擬機都沒有采用這種算法。

  1. 可達性算法(引用鏈法)

該算法的思想是:從一個被稱爲 GCRoots 的對象開始向下搜索,如果一個對象到 GC

Roots沒有任何引用鏈相連時,則說明此對象不可用。


Android 10月30日題:Android啓動Service的兩種方式是什麼? 它們的適用情況是什麼?

答案:如果後臺服務開始後基本可以獨立運行的話,可以用startService。音樂播放器就可以這樣用。它們會一直運行直到你調用stopSelf或者stopService。你可以通過發送Intent或者接收Intent來與正在運行的後臺服務通信,但大部分時間,你只是啓動服務並讓它獨立運行。如果你需要與後臺服務通過一個持續的連接來比較頻繁地通信,建議使用bind()。比如你需要定位服務不停地把更新後的地理位置傳給UI。Binder比Intent開發起來複雜一些,但如果真的需要,你也只能使用它。

startService:生命週期與調用者不同。啓動後若調用者未調用stopService而直接退出,Service仍會運行

bindService:生命週期與調用者綁定,調用者一旦退出,Service就會調用unBind->onDestroy


Android 10月31日題:GC(GarbageCollection,垃圾收集,垃圾回收機制)的兩種判定方法是?

答案:1. 引用計數法:指的是如果某個地方引用了這個對象就+1,如果失效了就-1,當爲 0 就會回收但是 JVM 沒有用這種方式,因爲無法判定相互循環引用(A 引用 B,B 引用 A)的情況。

2.引用鏈法:通過一種 GCROOT 的對象(方法區中靜態變量引用的對象等-static變量)來判斷,如果有一條鏈能夠到達 GCROOT 就說明,不能到達 GCROOT 就說明可以回收。


安卓2019年11月每日一題

Android 11月1日題:

(簡述題)Java虛擬機、Dalvik虛擬機、ART虛擬機的區別是?

答案:Java虛擬機:

1、java虛擬機基於棧。 基於棧的機器必須使用指令來載入和操作棧上數據,所需指令更多更多。

2、java虛擬機運行的是java字節碼。(java類會被編譯成一個或多個字節碼.class文件)

Dalvik虛擬機:

1、dalvik虛擬機是基於寄存器的

2、Dalvik運行的是自定義的.dex字節碼格式。(java類被編譯成.class文件後,會通過一個dx工具將所有的.class文件轉換成一個.dex文件,應用運行時dalvik虛擬機利用JIT(Just In Time,即時編譯技術)將其轉變爲機器碼,進而執行以讀取指令和數據

3、常量池已被修改爲只使用32位的索引,以 簡化解釋器。

4、一個應用,一個虛擬機實例,一個進程(所有android應用的線程都是對應一個linux線程,都運行在自己的沙盒中,不同的應用在不同的進程中運行。每個android dalvik應用程序都被賦予了一個獨立的linux PID(app_*))

ART虛擬機:
在安裝時,將dex直接轉爲機器碼,會增加10%-20%存儲空間,應用運行時,直接執行機器碼


Android 11月4日題:簡述 java 內存分配與回收策率以及 Minor GC 和Major GC.

答案:

  1. 對象優先在堆的 Eden 區分配。

  2. 大對象直接進入老年代。

  3. 長期存活的對象將直接進入老年代. 當 Eden 區沒有足夠的空間進行分配時,虛擬機會執行一次 Minor GC.Minor Gc 通常發生在新生代的 Eden 區,在這個區的對象生存期短,往往發生 Gc 的頻率較高,回收速度比較快;Full Gc/Major GC 發生在老年代,一般情況下,觸發老年代 GC的時候不會觸發 Minor GC,但是通過配置,可以在 Full GC 之前進行一次 MinorGC 這樣可以加快老年代的回收速度。


Android 11月5日題: 下列關於HashMap的描述,哪一項是錯誤的?

A. HashMap基於哈希表實現,內部通過鏈表解決衝突問題

B. HashMap實現了Serializable接口,支持序列化

C. HashMap是線程安全的

D. HashMap中key和value都允許爲null

答案:C

解析:

1、HashMap 繼承於AbstractMap,實現了Map、Cloneable、java.io.Serializable接口

2、HashMap 的實現不是同步的,這意味着它不是線程安全的。(線程安全:一個線程訪問某數據時,另一個線程不會改變其值造成數據不一致或者數據污染。)

3、HashMap對象的key、value值均可爲null。

Hashtable對象的key、value值均不可爲null,線程同步的,只有一個對象鎖。
ConcurrentHashMap 線程安全,多個對象鎖,效率更高


Android 11月5日題:

如何把一個應用設置爲系統應用?

答案:

成爲系統應用,首先要在對應設備的 Android 源碼 SDK 下編譯,編譯好之後:

此 Android 設備是 Debug 版本,並且已經 root,直接將此 apk 用 adb 工具 push 到 system/app 或 system/priv-app 下即可。

如果非 root 設備,需要編譯後重新燒寫設備鏡像即可。

有些權限(如 WRITE_SECURE_SETTINGS ),是不開放給第三方應用的,只能在對應設備源碼中編譯然後作爲系統 app 使用。


Android 11月5日題:小明非常喜歡和朋友們一起玩。

小明有n個朋友當前在一根數軸上,每個朋友當前在整數x[i]座標位置。

小明向他們發出一個移動的信號,每個朋友就向左或者向右移動s距離(每個朋友的選擇是獨立的,都可以選擇向左或者向右)。

爲了在一起玩耍方便,小明希望移動之後最左邊的朋友和最右邊的朋友距離最近,小明想知道最近距離爲多少。

答案:4.

例如小明有三個朋友分別所在數軸座標爲-7, 4, 7, s = 5

那麼第一個朋友-7向右移動s,變爲-2

第二個朋友4向左移動s,變爲-1

第三個朋友7向左移動s,變爲2。

現在最左和最右的朋友距離是4,沒有比這個更優的方案了。


Android 11月8日題:

以下意圖那個是用來描述ADAPTER(適配器)?( )

A.定義一個用於創建對象的接口,讓子類決定實例化哪一個類

B. 將一個類的接口轉換成客戶希望的另外一個接口。本模式使得原本由於接口不兼容而不能一起工作的那些類一起工作

C. 將一個請求封裝爲一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作

D. 表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下作用於這些元素的新操作

答案:B

解析:將一個類的接口轉換成客戶希望的另外一個接口。該模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。適用場景如下:

已經存在的類的接口不符合我們的需求;

創建一個可以複用的類,使得該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作;

在不對每一個都進行子類化以匹配它們的接口的情況下,使用一些已經存在的子類。


Android 11月11日題:當 Activity 被消毀時,如何保存它原來的狀態?

A、實現 Activity 的onSaveInstanceState()方法

B、實現 Activity 的onSaveInstance()方法

C、實現 Activity 的onInstanceState()方法

D、實現 Activity 的 onSaveState()方法

答案:A

答案解析:onSaveInstanceState()

當你的程序中某一個Activity A在運行時,主動或被動地運行另一個新的Activity B,這個時候A會執行onSaveInstanceState()。B完成以後又會來找A,這個時候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新調用onCreate()方法,不同於直接啓動的是這回onCreate()裏是帶上了參數savedInstanceState;而沒被收回的就直接執行onResume(),跳過onCreate()了。


Android 11月12日題:兩個Activity之間跳轉時必然會執行的是哪幾個方法?

答案:一般情況下比如說有兩個activity,分別叫A,B。

當在A 裏面激活B 組件的時候, A會調用onPause()方法,然後B調用onCreate() ,onStart(), onResume()。

這個時候B覆蓋了A的窗體, A會調用onStop()方法。

如果B是個透明的窗口,或者是對話框的樣式, 就不會調用A的onStop()方法。

如果B已經存在於Activity棧中,B就不會調用onCreate()方法。


Android 11月13日題:@+id/資源ID名,@id/資源ID名,@android:id/資源ID名三種id格式的區別,下面哪個說法是錯誤的?

A、@+id/資源ID名用來新定義資源的ID

B、@id/資源ID名:表示引用已經存在的資源

C、@android:id/資源ID名錶示應用系統存在的資源

D、@+id/資源ID名:表示引用已經存在的資源

答案:D

答案解析:android:id="@+id/new_name" 開發者爲當前的控件或者佈局新定義一個id名稱。該ID名稱在R.java文件中會分配一個唯一的int型常量,用於對資源引用的索引。(如果R.java中存在這個值則直接使用存在的值,否則會在R.java文件中生成 new_name值)

android:id="@id/defined_name"

引用一個名稱爲defined_name的id資源。該引用針對的是開發者自定義的id資源。(如果R.java中存在這個值,則使用此值);否則會造成編譯錯誤。

android:id="@android:id/sys_name"

引用名稱爲sys_name的系統內部資源。


Android 11月14日題:關於Message、Handler、MessageQueue、Looper以下描述錯誤的是?

A、Message消息,理解爲線程間交流的信息,處理數據後臺線程需要更新UI,則發送Message內含一些數據給UI線程。

B、Handler處理者,是Message的主要處理者,負責Message的發送,Message內容的執行處理。

C、Message Queue消息隊列,用來存放通過Handler發佈的消息,按照先進後出執行。

D、Looper是每條線程裏的MessageQueue的管家。

答案:C

答案解析:Android中main函數已經爲UI線程建立了looper,所以主線程默認可以使用handler,子線城中創建handler前要先創建當前線程的looper,不然handler的構造函數會找不到looper的引用而報錯!不是handler在哪個線程定義就屬於哪個線程,而是用哪個線程的looper創建就會在哪個線程中執行,因爲looper是threadlocal的


Android 11月18日題:Parcelable 爲什麼效率高於Serializable ?

答案:Serializable是通過I/O讀寫存儲在磁盤上的,使用反射機制,序列化過程較慢,且在序列化過程中創建許多臨時對象,容易觸發GC。Parcelable是直接在內存中讀寫的,自已實現封送和解封(marshalled &unmarshalled)操作,將一個完整的對象分解成Intent所支持的數據類型,不需要使用反射,所以Parcelable具有效率高,內存開銷小的優點。


Android 11月19日題:View的onAttachedToWindow,onDetachedFromWindow 調用時機,使用場景是什麼?

答案:Attached就是附加,Detached就是分離。 onAttachedToWindow就是當這個View附加到Window(每個Activity裏面都對應着一個Window)的時候,這個方法就會被回調。onDetachedFromWindow剛好相反,它是當View與Window分離的時候回調。view需要附加到window顯示,所以比如需要讓view執行動畫,動畫可以在attached啓動,在detached停止。


Android 11月20日題:AppCompatTextView是什麼,在AppCompatActivity中爲什麼會把TextView替換爲AppCompatTextView?

答案:在AppCompatActivity的onCreate方法中會對LayoutInflater設置Factory2(實現爲AppCompatDelegateImpl),當LayoutInflater在inflate佈局的時候,會優先調用Factory2的onCreateView方法,方法實習中再利用AppCompatViewInflater創建對應的view。在AppCompatViewInflater中進行了替換。

AppCompat開頭的組件,都實現了TintableBackgroundView的接口,目的是爲了能夠讓舊版本(5.0以下)能夠兼容BackgroundTint背景着色(item被選中後的變色效果)。


Android 11月21日題:如果Android應用程序需要設置屏幕方向爲橫屏方式顯示,那麼需要在AndroidMainfest.xml文件增加哪種權限 :?

答案:android.permission.SET_ORIENTATION


Android 11月22日題:有一張尺寸爲 72*72 像素的圖片,其採用 ARGB8888 格式存儲,現將其置於某應用的 drawable-xxhdpi 目錄中,在屏幕密度爲 xhdpi的手機上運行此應用。 問:此圖片不經過採樣直接加載後將佔用多少 byte 內存?()

A、20736

B、5184

C、9216

D、2304

答案:C

答案解析:圖像佔用內存的公式是:numBytes = width * height * bitsPerPixel / 8 ,其中bitsPerPixel是根據圖片的像素格式計算出的像素格式如 ARGB8888 。

對於每一個像素點使用4個byte來表示:1個byte(8位)代表red,另外3個byte分別代表green、blue和alpha透明通道。這個就簡稱ARGB8888

drawable-xxhdpi資源文件夾代表屏幕密度也決定了佔用內存,xxhdpi的屏幕密度(每英寸的像素點)480

圖像寬度(width)×圖像高度(height)×每一個像素的位數(bytesperpixel) = 內存大小

72/480320 * 72/480320 * 4 = 9216


Android 11月25日題:class.forname與classloader.loadclass有什麼區別?類的生命週期是怎樣的?

答案:類加載過程有:加載、驗證、準備、解析、初始化、使用、卸載

Class.forName(className)方法,內部實際調用的方法是 Class.forName(className,true,classloader);

第2個boolean參數表示類是否需要初始化, Class.forName(className)默認是需要初始化。

一旦初始化,就會觸發目標對象的 static塊代碼執行,static參數也也會被再次初始化。

ClassLoader.loadClass(className)方法,內部實際調用的方法是 ClassLoader.loadClass(className,false);

第2個 boolean參數,表示目標對象是否進行鏈接,false表示不進行鏈接,

不進行鏈接意味着不進行包括初始化等一些列步驟,那麼靜態塊和靜態對象就不會得到執行


Android 11月26日題:Class.isAssignableFrom與 instanceof 區別

答案:isAssignableFrom 是用來判斷一個類Class1和另一個類Class2是否相同或是另一個類的超類或接口。

而 instanceof 是用來判斷一個對象實例是否是一個類或接口的或其子類子接口的實例。


Android 11月27日題:事件分發原理?

答案:事件分發,其實就是一個責任鏈的變種,這個責任鏈,是一個設計模式。

在Android中,當最頂層的View收到事件之後,會一級一級地往下傳,在每一級View中,它們各自都有權利去處理(也就是攔截)這個事件,如果這次的事件傳到了最底層的View,也沒能處理的話,就會從這個最底層的View一級一級地向上傳回去。


Android 11月28日題:retrofit中使用jdk動態代理實現,那jdk中動態代理的實現原理是?

答案:jdk動態代理只能代理接口,類似於編寫一個接口實現類,其構造方法接收InvocationHandler參數,InvocationHandler相當於回調接口,在這個類中的接口方法實現中執行InvocationHandler的invoke方法回調出去。

與直接編寫代碼不同的是,這個接口的實現類是由jvm在運行期間動態生成的。在加載一個類時,類的數據是由讀取class文件到內存中而來,動態代理直接就在內存中生成一份class的數據。


Android 11月29日題:Android APP開發過程中,下列的那些做法是不推薦的?

a:針對特定屏幕密度使用特定的圖標和位圖

b:用到的數據資源如字符串,長度等統一定義在資源文件xml中

c:在程序和佈局視圖中,直接賦值字符串常量或顏色等屬性

d:統一編碼規範,命名規範,資源引用規範等以便於管理或後期維護

答案:C 不推薦直接寫在在佈局xml中 建議抽取成變量 放在string.xml 和color.xml 中 便於集體修改


安卓2019年12月每日一題

Android 12月9日題:如何停止一個正在運行的線程

答案:使用共享變量的方式在這種方式中,之所以引入共享變量,是因爲該變量可以被多個執行相同任務的線程用來作爲是否中斷的信號,通知中斷線程的執行。

使用interrupt方法終止線程,如果一個線程由於等待某些事件的發生而被阻塞,比如當一個線程調用Thread.join()方法,或者Thread.sleep()方法,

在網絡中調用ServerSocket.accept()方法時,都有可能導致線程阻塞,即使主程序中將該線程的共享變量設置爲true,但該線程此時根本無法檢查循環標誌,當然也就無法立即中斷。

使用Thread提供的interrupt()方法,該方法不會中斷一個正在運行的線程,但是它可以使一個被阻塞的線程拋出一箇中斷異常,從而使線程提前結束阻塞狀態,退出堵塞代碼


Android 12月10日題:設計模式六大原則

答案:單一職責原則、開放-關閉原則、里氏替換原則、依賴倒轉原則、接口隔離原則、迪米特法則


Android 12月11日題:運行結果

public staticvoid main(String[] args){
    int i = 0;
    System.out.println((i++)+(++i)+(i++)+(++i));
    System.out.println(i);
}

答案:

int a = i++; //a= 0, i = 1

int b = ++i; //b = 2, i = 2

int c = i++; //c = 2, i = 3

int d = ++i; // d=4, i = 4

a + b + c + d;// 0 + 2 + 2 + 4 = 8


Android 12月12日題:Broadcast註冊方式與區別

答案:

一、Brodcast註冊方式1、靜態註冊;2、動態註冊;

二、靜態註冊:在清單文件manifest中註冊,當程序退出之後還可以收到該廣播。不能控制具體某個時間點接收和不接收廣播。

三、動態註冊:通過代碼的方式註冊context.registerReceiver(broadcastReceiver),註冊的同時注意在不需要接受的時候進行反註冊context.unregisterReceiver(broadcastReceiver);避免內存泄漏, 動態註冊可以很好的控制廣播接受。

從Android 8.0(API 26)開始,對於大部分隱式廣播(廣播的對象不是針對你開發的APP),不能在manifest中聲明receiver,如果需要使用隱式廣播,需要使用context.registerReceiver 的方法。


Android 12月13日題:單例的DCL方式下,那個單例的私有變量要不要加volatile關鍵字

答案:需要,new某個對象,可以分解爲:

1 memory=allocate();// 分配內存 相當於c的malloc

2 ctorInstanc(memory) //初始化對象

3 instance=memory //設置instance指向剛分配的地址

在編譯器運行時,可能會出現重排序從1-2-3 排序爲1-3-2

如此在多線程下就會出現問題例如現在有2個線程A,B

線程A在執行第5行代碼時,B線程進來,而此時A執行了 1和3,沒有執行2,

此時B線程判斷instance不爲null 直接返回一個未初始化的對象,就會出現問題

而用了volatile,上面的重排序就會在多線程環境中禁止,不會出現上述問題。


Android 12月16日題:項目中不同模塊的同名資源,會不會覆蓋?誰覆蓋誰,是隨機的嗎?具體規則是怎麼樣的呢?

答案:會。不是。

app的優先級要高於module,而module之間的優先級則由app/build.gradle裏面dependencies中的implementation順序決定的。


Android 12月18日題:SurfaceView可以在子線程刷新UI嗎?

答案:可以


Android 12月19日題:一個進程可以執行多個app嗎?

答案:可以


Android 12月20日題:scrollTo()和scollBy()的區別?

答案:scollBy內部調用了scrollTo,它是基於當前位置的相對滑動;而scrollTo是絕對滑動,因此如果使用相同輸入參數多次調用scrollTo方法,由於View的初始位置是不變的,所以只會出現一次View滾動的效果。


Android 12月23日題:EventBus是單例的,但是爲什麼默認構造函數是public的呢?

答案:EventBus可能有多條總線,訂閱者註冊到不同線上的 EventBus,通過不同的實例來發送數據,不同的 EventBus 是相互隔離開的,訂閱者就都只會收到註冊到該線上的事件。


Android 12月24日題:Android 中的動畫有哪幾類?

答案:幀動畫、補間動畫、屬性動畫


Android 12月25日題:補間動畫分爲哪幾種形式

答案:補間動畫可以分爲四種形式,分別是alpha(淡入淡出),translate(位移),scale(縮放),rotate(旋轉)。


Android 12月26日題:內存溢出和內存泄漏有什麼區別?

答案:程序運行時所需的內存大於程序允許的最高內存,這時會出現內存溢出;應該被回收的內存,由於各種原因回收不了,這就是內存泄漏。內存泄漏過多,就容易導致內存溢出。


Android 12月27日題:Bitmap很容易造成OOM,一般有幾種優化方式?

答案:3種,1.使用緩存; 2.壓縮圖片; 3.及時回收;


Android 12月30日題:CAS機制是什麼?

答案:(Compare and Swap)比較並替換。能夠保證一個變量的原子性操作,

屬於樂觀鎖,樂觀地認爲程序中的併發情況不那麼嚴重,所以讓線程不斷去嘗試更新。


Android 12月31日題:Thread的yield和join方法

答案:yield()方法是停止當前線程,讓同等優先權的線程或更高優先級的線程有執行的機會。如果沒有的話,那麼yield()方法將不會起作用。

join方法是用於在某一個線程的執行過程中等待被調用的線程執行結束後,再繼續執行當前線程。


以上內容轉載自微信公衆號: 享學課堂,詳細連接見目錄

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