欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Android面試一般會問什么?

1、java中==和equals和hashCode的區(qū)別

成都創(chuàng)新互聯(lián)服務緊隨時代發(fā)展步伐,進行技術革新和技術進步,經過10年的發(fā)展和積累,已經匯集了一批資深網站策劃師、設計師、專業(yè)的網站實施團隊以及高素質售后服務人員,并且完全形成了一套成熟的業(yè)務流程,能夠完全依照客戶要求對網站進行網站設計制作、網站制作、建設、維護、更新和改版,實現(xiàn)客戶網站對外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網化提供全面的解決方案。

基本數(shù)據類型的==比較的值相等.

類的==比較的內存的地址,即是否是同一個對象,在不覆蓋equals的情況下,同比較內存地址,原實現(xiàn)也為 == ,如String等重寫了equals方法.

hashCode也是Object類的一個方法。返回一個離散的int型整數(shù)。在集合類操作中使用,為了提高查詢速度。(HashMap,HashSet等比較是否為同一個)

如果兩個對象equals,Java運行時環(huán)境會認為他們的hashcode一定相等。

如果兩個對象不equals,他們的hashcode有可能相等。

如果兩個對象hashcode相等,他們不一定equals。

如果兩個對象hashcode不相等,他們一定不equals。

2、int與integer的區(qū)別

int 基本類型

integer 對象 int的封裝類

3、String、StringBuffer、StringBuilder區(qū)別

String:字符串常量 不適用于經常要改變值得情況,每次改變相當于生成一個新的對象

StringBuffer:字符串變量 (線程安全)

StringBuilder:字符串變量(線程不安全) 確保單線程下可用,效率略高于StringBuffer

4、什么是內部類?內部類的作用

內部類可直接訪問外部類的屬性

Java中內部類主要分為成員內部類、局部內部類(嵌套在方法和作用域內)、匿名內部類(沒構造方法)、靜態(tài)內部類(static修飾的類,不能使用任何外圍類的非static成員變量和方法, 不依賴外圍類)

5、進程和線程的區(qū)別

進程是cpu資源分配的最小單位,線程是cpu調度的最小單位。

進程之間不能共享資源,而線程共享所在進程的地址空間和其它資源。

一個進程內可擁有多個線程,進程可開啟進程,也可開啟線程。

一個線程只能屬于一個進程,線程可直接使用同進程的資源,線程依賴于進程而存在。

6、final,finally,finalize的區(qū)別

final:修飾類、成員變量和成員方法,類不可被繼承,成員變量不可變,成員方法不可重寫

finally:與try...catch...共同使用,確保無論是否出現(xiàn)異常都能被調用到

finalize:類的方法,垃圾回收之前會調用此方法,子類可以重寫finalize()方法實現(xiàn)對資源的回收

7、Serializable 和Parcelable 的區(qū)別

Serializable Java 序列化接口 在硬盤上讀寫 讀寫過程中有大量臨時變量的生成,內部執(zhí)行大量的i/o操作,效率很低。

Parcelable Android 序列化接口 效率高 使用麻煩 在內存中讀寫(AS有相關插件 一鍵生成所需方法) ,對象不能保存到磁盤中

8、靜態(tài)屬性和靜態(tài)方法是否可以被繼承?是否可以被重寫?以及原因?

可繼承 不可重寫 而是被隱藏

如果子類里面定義了靜態(tài)方法和屬性,那么這時候父類的靜態(tài)方法或屬性稱之為"隱藏"。如果你想要調用父類的靜態(tài)方法和屬性,直接通過父類名.方法或變量名完成。

9、成員內部類、靜態(tài)內部類、局部內部類和匿名內部類的理解,以及項目中的應用

ava中內部類主要分為成員內部類、局部內部類(嵌套在方法和作用域內)、匿名內部類(沒構造方法)、靜態(tài)內部類(static修飾的類,不能使用任何外圍類的非static成員變量和方法, 不依賴外圍類)

使用內部類最吸引人的原因是:每個內部類都能獨立地繼承一個(接口的)實現(xiàn),所以無論外圍類是否已經繼承了某個(接口的)實現(xiàn),對于內部類都沒有影響。

因為Java不支持多繼承,支持實現(xiàn)多個接口。但有時候會存在一些使用接口很難解決的問題,這個時候我們可以利用內部類提供的、可以繼承多個具體的或者抽象的類的能力來解決這些程序設計問題??梢赃@樣說,接口只是解決了部分問題,而內部類使得多重繼承的解決方案變得更加完整。

10、string 轉換成 integer的方式及原理

String ?integer Intrger.parseInt(string);

Integer?string Integer.toString();

11、哪些情況下的對象會被垃圾回收機制處理掉?

1.所有實例都沒有活動線程訪問。

2.沒有被其他任何實例訪問的循環(huán)引用實例。

3.Java 中有不同的引用類型。判斷實例是否符合垃圾收集的條件都依賴于它的引用類型。

要判斷怎樣的對象是沒用的對象。這里有2種方法:

1.采用標記計數(shù)的方法:

給內存中的對象給打上標記,對象被引用一次,計數(shù)就加1,引用被釋放了,計數(shù)就減一,當這個計數(shù)為0的時候,這個對象就可以被回收了。當然,這也就引發(fā)了一個問題:循環(huán)引用的對象是無法被識別出來并且被回收的。所以就有了第二種方法:

2.采用根搜索算法:

從一個根出發(fā),搜索所有的可達對象,這樣剩下的那些對象就是需要被回收的

12、靜態(tài)代理和動態(tài)代理的區(qū)別,什么場景使用?

靜態(tài)代理類:

由程序員創(chuàng)建或由特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。動態(tài)代理類:在程序運行時,運用反射機制動態(tài)創(chuàng)建而成。

14、Java中實現(xiàn)多態(tài)的機制是什么?

答:方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)

重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn)

重載Overloading是一個類中多態(tài)性的一種表現(xiàn).

16、說說你對Java反射的理解

JAVA反射機制是在運行狀態(tài)中, 對于任意一個類, 都能夠知道這個類的所有屬性和方法; 對于任意一個對象, 都能夠調用它的任意一個方法和屬性。 從對象出發(fā),通過反射(Class類)可以取得取得類的完整信息(類名 Class類型,所在包、具有的所有方法 Method[]類型、某個方法的完整信息(包括修飾符、返回值類型、異常、參數(shù)類型)、所有屬性 Field[]、某個屬性的完整信息、構造器 Constructors),調用類的屬性或方法自己的總結: 在運行過程中獲得類、對象、方法的所有信息。

17、說說你對Java注解的理解

元注解

元注解的作用就是負責注解其他注解。java5.0的時候,定義了4個標準的meta-annotation類型,它們用來提供對其他注解的類型作說明。

1.@Target

2.@Retention

3.@Documented

4.@Inherited

18、Java中String的了解

在源碼中string是用final 進行修飾,它是不可更改,不可繼承的常量。

19、String為什么要設計成不可變的?

1、字符串池的需求

字符串池是方法區(qū)(Method Area)中的一塊特殊的存儲區(qū)域。當一個字符串已經被創(chuàng)建并且該字符串在 池 中,該字符串的引用會立即返回給變量,而不是重新創(chuàng)建一個字符串再將引用返回給變量。如果字符串不是不可變的,那么改變一個引用(如: string2)的字符串將會導致另一個引用(如: string1)出現(xiàn)臟數(shù)據。

2、允許字符串緩存哈希碼

在java中常常會用到字符串的哈希碼,例如: HashMap 。String的不變性保證哈希碼始終一,因此,他可以不用擔心變化的出現(xiàn)。 這種方法意味著不必每次使用時都重新計算一次哈希碼——這樣,效率會高很多。

3、安全

String廣泛的用于java 類中的參數(shù),如:網絡連接(Network connetion),打開文件(opening files )等等。如果String不是不可變的,網絡連接、文件將會被改變——這將會導致一系列的安全威脅。操作的方法本以為連接上了一臺機器,但實際上卻不是。由于反射中的參數(shù)都是字符串,同樣,也會引起一系列的安全問題。

20、Object類的equal和hashCode方法重寫,為什么?

首先equals與hashcode間的關系是這樣的:

1、如果兩個對象相同(即用equals比較返回true),那么它們的hashCode值一定要相同;

2、如果兩個對象的hashCode相同,它們并不一定相同(即用equals比較返回false)

由于為了提高程序的效率才實現(xiàn)了hashcode方法,先進行hashcode的比較,如果不同,那沒就不必在進行equals的比較了,這樣就大大減少了equals比較的次數(shù),這對比需要比較的數(shù)量很大的效率提高是很明顯的

21、List,Set,Map的區(qū)別

Set是最簡單的一種集合。集合中的對象不按特定的方式排序,并且沒有重復對象。 Set接口主要實現(xiàn)了兩個實現(xiàn)類:HashSet: HashSet類按照哈希算法來存取集合中的對象,存取速度比較快

TreeSet :TreeSet類實現(xiàn)了SortedSet接口,能夠對集合中的對象進行排序。

List的特征是其元素以線性方式存儲,集合中可以存放重復對象。

ArrayList() : 代表長度可以改變得數(shù)組??梢詫υ剡M行隨機的訪問,向ArrayList()中插入與刪除元素的速度慢。

LinkedList(): 在實現(xiàn)中采用鏈表數(shù)據結構。插入和刪除速度快,訪問速度慢。

Map 是一種把鍵對象和值對象映射的集合,它的每一個元素都包含一對鍵對象和值對象。 Map沒有繼承于Collection接口 從Map集合中檢索元素時,只要給出鍵對象,就會返回對應的值對象。

HashMap:Map基于散列表的實現(xiàn)。插入和查詢“鍵值對”的開銷是固定的。可以通過構造器設置容量capacity和負載因子load factor,以調整容器的性能。

LinkedHashMap: 類似于HashMap,但是迭代遍歷它時,取得“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發(fā)而更快,因為它使用鏈表維護內部次序。

TreeMap : 基于紅黑樹數(shù)據結構的實現(xiàn)。查看“鍵”或“鍵值對”時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在 于,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。

WeakHashMao :弱鍵(weak key)Map,Map中使用的對象也被允許釋放: 這是為解決特殊問題設計的。如果沒有map之外的引用指向某個“鍵”,則此“鍵”可以被垃圾收集器回收。

26、ArrayMap和HashMap的對比

1、存儲方式不同

HashMap內部有一個HashMapEntry<K, V>[]對象,每一個鍵值對都存儲在這個對象里,當使用put方法添加鍵值對時,就會new一個HashMapEntry對象,

2、添加數(shù)據時擴容時的處理不一樣,進行了new操作,重新創(chuàng)建對象,開銷很大。ArrayMap用的是copy數(shù)據,所以效率相對要高。

3、ArrayMap提供了數(shù)組收縮的功能,在clear或remove后,會重新收縮數(shù)組,是否空間

4、ArrayMap采用二分法查找;

29、HashMap和HashTable的區(qū)別

1 HashMap不是線程安全的,效率高一點、方法不是Synchronize的要提供外同步,有containsvalue和containsKey方法。

hashtable是,線程安全,不允許有null的鍵和值,效率稍低,方法是是Synchronize的。有contains方法方法。Hashtable 繼承于Dictionary 類

30、HashMap與HashSet的區(qū)別

hashMap:HashMap實現(xiàn)了Map接口,HashMap儲存鍵值對,使用put()方法將元素放入map中,HashMap中使用鍵對象來計算hashcode值,HashMap比較快,因為是使用唯一的鍵來獲取對象。

HashSet實現(xiàn)了Set接口,HashSet僅僅存儲對象,使用add()方法將元素放入set中,HashSet使用成員對象來計算hashcode值,對于兩個對象來說hashcode可能相同,所以equals()方法用來判斷對象的相等性,如果兩個對象不同的話,那么返回false。HashSet較HashMap來說比較慢。

31、HashSet與HashMap怎么判斷集合元素重復?

HashSet不能添加重復的元素,當調用add(Object)方法時候,

首先會調用Object的hashCode方法判hashCode是否已經存在,如不存在則直接插入元素;如果已存在則調用Object對象的equals方法判斷是否返回true,如果為true則說明元素已經存在,如為false則插入元素。

33、ArrayList和LinkedList的區(qū)別,以及應用場景

ArrayList是基于數(shù)組實現(xiàn)的,ArrayList線程不安全。

LinkedList是基于雙鏈表實現(xiàn)的:

使用場景:

(1)如果應用程序對各個索引位置的元素進行大量的存取或刪除操作,ArrayList對象要遠優(yōu)于LinkedList對象;

( 2 ) 如果應用程序主要是對列表進行循環(huán),并且循環(huán)時候進行插入或者刪除操作,LinkedList對象要遠優(yōu)于ArrayList對象;

34、數(shù)組和鏈表的區(qū)別

數(shù)組:是將元素在內存中連續(xù)存儲的;它的優(yōu)點:因為數(shù)據是連續(xù)存儲的,內存地址連續(xù),所以在查找數(shù)據的時候效率比較高;它的缺點:在存儲之前,我們需要申請一塊連續(xù)的內存空間,并且在編譯的時候就必須確定好它的空間的大小。在運行的時候空間的大小是無法隨著你的需要進行增加和減少而改變的,當數(shù)據兩比較大的時候,有可能會出現(xiàn)越界的情況,數(shù)據比較小的時候,又有可能會浪費掉內存空間。在改變數(shù)據個數(shù)時,增加、插入、刪除數(shù)據效率比較低。

鏈表:是動態(tài)申請內存空間,不需要像數(shù)組需要提前申請好內存的大小,鏈表只需在用的時候申請就可以,根據需要來動態(tài)申請或者刪除內存空間,對于數(shù)據增加和刪除以及插入比數(shù)組靈活。還有就是鏈表中數(shù)據在內存中可以在任意的位置,通過應用來關聯(lián)數(shù)據(就是通過存在元素的指針來聯(lián)系)

35、開啟線程的三種方式?

ava有三種創(chuàng)建線程的方式,分別是繼承Thread類、實現(xiàn)Runable接口和使用線程池

36、線程和進程的區(qū)別?

線程是進程的子集,一個進程可以有很多線程,每條線程并行執(zhí)行不同的任務。不同的進程使用不同的內存空間,而所有的線程共享一片相同的內存空間。別把它和棧內存搞混,每個線程都擁有單獨的棧內存用來存儲本地數(shù)據。

38、run()和start()方法區(qū)別

這個問題經常被問到,但還是能從此區(qū)分出面試者對Java線程模型的理解程度。start()方法被用來啟動新創(chuàng)建的線程,而且start()內部調用了run()方法,這和直接調用run()方法的效果不一樣。當你調用run()方法的時候,只會是在原來的線程中調用,沒有新的線程啟動,start()方法才會啟動新線程。

39、如何控制某個方法允許并發(fā)訪問線程的個數(shù)?

semaphore.acquire() 請求一個信號量,這時候的信號量個數(shù)-1(一旦沒有可使用的信號量,也即信號量個數(shù)變?yōu)樨摂?shù)時,再次請求的時候就會阻塞,直到其他線程釋放了信號量)

semaphore.release() 釋放一個信號量,此時信號量個數(shù)+1

40、在Java中wait和seelp方法的不同;

Java程序中wait 和 sleep都會造成某種形式的暫停,它們可以滿足不同的需要。wait()方法用于線程間通信,如果等待條件為真且其它線程被喚醒時它會釋放鎖,而sleep()方法僅僅釋放CPU資源或者讓當前線程停止執(zhí)行一段時間,但不會釋放鎖。

41、談談wait/notify關鍵字的理解

等待對象的同步鎖,需要獲得該對象的同步鎖才可以調用這個方法,否則編譯可以通過,但運行時會收到一個異常:IllegalMonitorStateException。

調用任意對象的 wait() 方法導致該線程阻塞,該線程不可繼續(xù)執(zhí)行,并且該對象上的鎖被釋放。

喚醒在等待該對象同步鎖的線程(只喚醒一個,如果有多個在等待),注意的是在調用此方法的時候,并不能確切的喚醒某一個等待狀態(tài)的線程,而是由JVM確定喚醒哪個線程,而且不是按優(yōu)先級。

調用任意對象的notify()方法則導致因調用該對象的 wait()方法而阻塞的線程中隨機選擇的一個解除阻塞(但要等到獲得鎖后才真正可執(zhí)行)。

42、什么導致線程阻塞?線程如何關閉?

阻塞式方法是指程序會一直等待該方法完成期間不做其他事情,ServerSocket的accept()方法就是一直等待客戶端連接。這里的阻塞是指調用結果返回之前,當前線程會被掛起,直到得到結果之后才會返回。此外,還有異步和非阻塞式方法在任務完成前就返回。

一種是調用它里面的stop()方法

另一種就是你自己設置一個停止線程的標記 (推薦這種)

43、如何保證線程安全?

1.synchronized;

2.Object方法中的wait,notify;

3.ThreadLocal機制 來實現(xiàn)的。

44、如何實現(xiàn)線程同步?

1、synchronized關鍵字修改的方法。2、synchronized關鍵字修飾的語句塊3、使用特殊域變量(volatile)實現(xiàn)線程同步

45、線程間操作List

List list = Collections.synchronizedList(new ArrayList());

46、談談對Synchronized關鍵字,類鎖,方法鎖,重入鎖的理解

java的對象鎖和類鎖:java的對象鎖和類鎖在鎖的概念上基本上和內置鎖是一致的,但是,兩個鎖實際是有很大的區(qū)別的,對象鎖是用于對象實例方法,或者一個對象實例上的,類鎖是用于類的靜態(tài)方法或者一個類的class對象上的。我們知道,類的對象實例可以有很多個,但是每個類只有一個class對象,所以不同對象實例的對象鎖是互不干擾的,但是每個類只有一個類鎖。但是有一點必須注意的是,其實類鎖只是一個概念上的東西,并不是真實存在的,它只是用來幫助我們理解鎖定實例方法和靜態(tài)方法的區(qū)別的

49、synchronized 和volatile 關鍵字的區(qū)別

1.volatile本質是在告訴jvm當前變量在寄存器(工作內存)中的值是不確定的,需要從主存中讀?。籹ynchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住。

2.volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的

3.volatile僅能實現(xiàn)變量的修改可見性,不能保證原子性;而synchronized則可以保證變量的修改可見性和原子性

4.volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。

5.volatile標記的變量不會被編譯器優(yōu)化;synchronized標記的變量可以被編譯器優(yōu)化

51、ReentrantLock 、synchronized和volatile比較

ava在過去很長一段時間只能通過synchronized關鍵字來實現(xiàn)互斥,它有一些缺點。比如你不能擴展鎖之外的方法或者塊邊界,嘗試獲取鎖時不能中途取消等。Java 5 通過Lock接口提供了更復雜的控制來解決這些問題。 ReentrantLock 類實現(xiàn)了 Lock,它擁有與 synchronized 相同的并發(fā)性和內存語義且它還具有可擴展性。

53、死鎖的四個必要條件?

死鎖產生的原因

1. 系統(tǒng)資源的競爭

系統(tǒng)資源的競爭導致系統(tǒng)資源不足,以及資源分配不當,導致死鎖。

2. 進程運行推進順序不合適

互斥條件:一個資源每次只能被一個進程使用,即在一段時間內某 資源僅為一個進程所占有。此時若有其他進程請求該資源,則請求進程只能等待。

請求與保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源 已被其他進程占有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。

不可剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能 由獲得該資源的進程自己來釋放(只能是主動釋放)。

循環(huán)等待條件: 若干進程間形成首尾相接循環(huán)等待資源的關系

這四個條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發(fā)生死鎖。

死鎖的避免與預防:

死鎖避免的基本思想:

系統(tǒng)對進程發(fā)出每一個系統(tǒng)能夠滿足的資源申請進行動態(tài)檢查,并根據檢查結果決定是否分配資源,如果分配后系統(tǒng)可能發(fā)生死鎖,則不予分配,否則予以分配。這是一種保證系統(tǒng)不進入死鎖狀態(tài)的動態(tài)策略。

理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和解除死鎖。所以,在系統(tǒng)設計、進程調度等方面注意如何讓這四個必要條件不成立,如何確定資源的合理分配算法,避免進程永久占據系統(tǒng)資源。此外,也要防止進程在處于等待狀態(tài)的情況下占用資源。因此,對資源的分配要給予合理的規(guī)劃。

死鎖避免和死鎖預防的區(qū)別:

死鎖預防是設法至少破壞產生死鎖的四個必要條件之一,嚴格的防止死鎖的出現(xiàn),而死鎖避免則不那么嚴格的限制產生死鎖的必要條件的存在,因為即使死鎖的必要條件存在,也不一定發(fā)生死鎖。死鎖避免是在系統(tǒng)運行過程中注意避免死鎖的最終發(fā)生。

56、什么是線程池,如何使用?

創(chuàng)建線程要花費昂貴的資源和時間,如果任務來了才創(chuàng)建線程那么響應時間會變長,而且一個進程能創(chuàng)建的線程數(shù)有限。為了避免這些問題,在程序啟動的時候就創(chuàng)建若干線程來響應處理,它們被稱為線程池,里面的線程叫工作線程。從JDK1.5開始,Java API提供了Executor框架讓你可以創(chuàng)建不同的線程池。比如單線程池,每次處理一個任務;數(shù)目固定的線程池或者是緩存線程池(一個適合很多生存期短的任務的程序的可擴展線程池)。

57、Java中堆和棧有什么不同?

為什么把這個問題歸類在多線程和并發(fā)面試題里?因為棧是一塊和線程緊密相關的內存區(qū)域。每個線程都有自己的棧內存,用于存儲本地變量,方法參數(shù)和棧調用,一個線程中存儲的變量對其它線程是不可見的。而堆是所有線程共享的一片公用內存區(qū)域。對象都在堆里創(chuàng)建,為了提升效率線程會從堆中弄一個緩存到自己的棧,如果多個線程使用該變量就可能引發(fā)問題,這時volatile 變量就可以發(fā)揮作用了,它要求線程從主存中讀取變量的值。

58、有三個線程T1,T2,T3,怎么確保它們按順序執(zhí)行?

在多線程中有多種方法讓線程按特定順序執(zhí)行,你可以用線程類的join()方法在一個線程中啟動另一個線程,另外一個線程完成該線程繼續(xù)執(zhí)行。為了確保三個線程的順序你應該先啟動最后一個(T3調用T2,T2調用T1),這樣T1就會先完成而T3最后完成。

線程間通信

我們知道線程是CPU調度的最小單位。在Android中主線程是不能夠做耗時操作的,子線程是不能夠更新UI的。而線程間通信的方式有很多,比如廣播,Eventbus,接口回掉,在Android中主要是使用handler。handler通過調用sendmessage方法,將保存消息的Message發(fā)送到Messagequeue中,而looper對象不斷的調用loop方法,從messageueue中取出message,交給handler處理,從而完成線程間通信。

線程池

Android中常見的線程池有四種,F(xiàn)ixedThreadPool、CachedThreadPool、ScheduledThreadPool、SingleThreadExecutor。

FixedThreadPool線程池是通過Executors的new FixedThreadPool方法來創(chuàng)建。它的特點是該線程池中的線程數(shù)量是固定的。即使線程處于閑置的狀態(tài),它們也不會被回收,除非線程池被關閉。當所有的線程都處于活躍狀態(tài)的時候,新任務就處于隊列中等待線程來處理。注意,F(xiàn)ixedThreadPool只有核心線程,沒有非核心線程。

CachedThreadPool線程池是通過Executors的newCachedThreadPool進行創(chuàng)建的。它是一種線程數(shù)目不固定的線程池,它沒有核心線程,只有非核心線程,當線程池中的線程都處于活躍狀態(tài),就會創(chuàng)建新的線程來處理新的任務。否則就會利用閑置的線程來處理新的任務。線程池中的線程都有超時機制,這個超時機制時長是60s,超過這個時間,閑置的線程就會被回收。這種線程池適合處理大量并且耗時較少的任務。這里得說一下,CachedThreadPool的任務隊列,基本都是空的。

ScheduledThreadPool線程池是通過Executors的newScheduledThreadPool進行創(chuàng)建的,它的核心線程是固定的,但是非核心線程數(shù)是不固定的,并且當非核心線程一處于空閑狀態(tài),就立即被回收。這種線程適合執(zhí)行定時任務和具有固定周期的重復任務。

SingleThreadExecutor線程池是通過Executors的newSingleThreadExecutor方法來創(chuàng)建的,這類線程池中只有一個核心線程,也沒有非核心線程,這就確保了所有任務能夠在同一個線程并且按照順序來執(zhí)行,這樣就不需要考慮線程同步的問題。

AsyncTask的工作原理

AsyncTask是Android本身提供的一種輕量級的異步任務類。它可以在線程池中執(zhí)行后臺任務,然后把執(zhí)行的進度和最終的結果傳遞給主線程更新UI。實際上,AsyncTask內部是封裝了Thread和Handler。雖然AsyncTask很方便的執(zhí)行后臺任務,以及在主線程上更新UI,但是,AsyncTask并不合適進行特別耗時的后臺操作,對于特別耗時的任務,個人還是建議使用線程池。

AsyncTask提供有4個核心方法:

1、onPreExecute():該方法在主線程中執(zhí)行,在執(zhí)行異步任務之前會被調用,一般用于一些準備工作。

2、doInBackground(String... params):這個方法是在線程池中執(zhí)行,此方法用于執(zhí)行異步任務。在這個方法中可以通過publishProgress方法來更新任務的進度,publishProgress方法會調用onProgressUpdate方法,另外,任務的結果返回給onPostExecute方法。

3、onProgressUpdate(Object... values):該方法在主線程中執(zhí)行,主要用于任務進度更新的時候,該方法會被調用。

4、onPostExecute(Long aLong):在主線程中執(zhí)行,在異步任務執(zhí)行完畢之后,該方法會被調用,該方法的參數(shù)及為后臺的返回結果。

除了這幾個方法之外還有一些不太常用的方法,如onCancelled(),在異步任務取消的情況下,該方法會被調用。

源碼可以知道從上面的execute方法內部調用的是executeOnExecutor()方法,即executeOnExecutor(sDefaultExecutor, params);而sDefaultExecutor實際上是一個串行的線程池。而onPreExecute()方法在這里就會被調用了。接著看這個線程池。AsyncTask的執(zhí)行是排隊執(zhí)行的,因為有關鍵字synchronized,而AsyncTask的Params參數(shù)就封裝成為FutureTask類,F(xiàn)utureTask這個類是一個并發(fā)類,在這里它充當了Runnable的作用。接著FutureTask會交給SerialExecutor的execute方法去處理,而SerialExecutor的executor方法首先就會將FutureTask添加到mTasks隊列中,如果這個時候沒有任務,就會調用scheduleNext()方法,執(zhí)行下一個任務。如果有任務的話,則執(zhí)行完畢后最后在調用 scheduleNext();執(zhí)行下一個任務。直到所有任務被執(zhí)行完畢。而AsyncTask的構造方法中有一個call()方法,而這個方法由于會被FutureTask的run方法執(zhí)行。所以最終這個call方法會在線程池中執(zhí)行。而doInBackground這個方法就是在這里被調用的。我們好好研究一下這個call()方法。mTaskInvoked.set(true);表示當前任務已經執(zhí)行過了。接著執(zhí)行doInBackground方法,最后將結果通過postResult(result);方法進行傳遞。postResult()方法中通過sHandler來發(fā)送消息,sHandler的中通過消息的類型來判斷一個MESSAGE_POST_RESULT,這種情況就是調用onPostExecute(result)方法或者是onCancelled(result)。另一種消息類型是MESSAGE_POST_PROGRESS則調用更新進度onProgressUpdate。

Binder的工作機制

直觀來說,Binder是Android中的一個類,它實現(xiàn)了IBinder接口,從IPC的角度來說,Binder是Android中的一種跨進程通信的一種方式,同時還可以理解為是一種虛擬的物理設備,它的設備驅動是/dev/binder/。從Framework角度來說,Binder是ServiceManager的橋梁。從應用層來說,Binder是客戶端和服務端進行通信的媒介。

我們先來了解一下這個類中每個方法的含義:

DESCRIPTOR:Binder的唯一標識,一般用于當前Binder的類名表示。

asInterface(android.os.IBinder obj):用于將服務端的Binder對象轉換成客戶端所需的AIDL接口類型的對象,這種轉化過程是區(qū)分進程的,如果客戶端和服務端位于同一個進程,那么這個方法返回的是服務端的stub對象本身,否則返回的是系統(tǒng)封裝后的Stub.proxy對象。

asBinder():用于返回當前Binder對象。

onTransact:該方法運行在服務端的Binder線程池中,當客戶端發(fā)起跨進程通信請求的時候,遠程請求通過系統(tǒng)底層封裝后交給該方法處理。注意這個方法public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags),服務端通過code可以確定客戶端所請求的目標方法是什么,接著從data中取出目標方法所需的參數(shù),然后執(zhí)行目標方法。當目標方法執(zhí)行完畢后,就像reply中寫入返回值。這個方法的執(zhí)行過程就是這樣的。如果這個方法返回false,客戶端是會請求失敗的,所以我們可以在這個方法中做一些安全驗證。

Binder的工作機制但是要注意一些問題:1、當客戶端發(fā)起請求時,由于當前線程會被掛起,直到服務端返回數(shù)據,如果這個遠程方法很耗時的話,那么是不能夠在UI線程,也就是主線程中發(fā)起這個遠程請求的。

2、由于Service的Binder方法運行在線程池中,所以Binder方法不管是耗時還是不耗時都應該采用同步的方式,因為它已經運行在一個線程中了。

view的事件分發(fā)和view的工作原理

Android自定義view,我們都知道實現(xiàn)有三部曲,onMeasure(),onLayout(),onDraw()。View的繪制流程是從viewRoot的perfromTraversal方法開始的。它經過measure,layout,draw方法才能夠將view繪制出來。其中measure是測量寬高的,layout是確定view在父容器上的擺布位置的,draw是將view繪制到屏幕上的。

Measure:

view的測量是需要MeasureSpc(測量規(guī)格),它代表一個32位int值,高2位代表SpecMode(測量模式),低(30)位的代表SpecSize(某種測量模式下的規(guī)格大小)。而一組SpecMode和SpeSize可以打包為一個MeasureSpec,反之,MeasureSpec可以解包得到SpecMode和SpeSize的值。SpecMode有三類:

unSpecified:父容器不對view有任何限制,要多大有多大。一般系統(tǒng)用這個多。

Exactly:父容器已經檢測出view所需要的精確大小,這個時候,view的大小就是SpecSize所指定的值,它對應者layout布局中的math_parent或者是具體的數(shù)值

At_most:父容器指定了一個可用大小的SpecSize,view的大小不能夠大于這個值,它對應這布局中的wrao_content.

對于普通的view,它的MeasureSpec是由父容器的MeasureSpec和自身的layoutParam共同決定的,一旦MeasureSpec確定后,onMeasure就可以確定view的寬高了。

View的measure過程:

onMeasure方法中有個setMeasureDimenSion方法來設置view的寬高測量值,而setMeasureDimenSion有個getDefaultSize()方法作為參數(shù)。一般情況下,我們只需要關注at_most和exactly兩種情況,getDefaultSize的返回值就是measureSpec中的SpecSize,而這個值基本就是view測量后的大小。而UnSpecified這種情況,一般是系統(tǒng)內部的測量過程,它是需要考慮view的背景這些因素的。

前面說的是view的測量過程,而viewGroup的measure過程:

對于viewGroup來說,除了完成自己的measure過程以外,還要遍歷去調用子類的measure方法,各個子元素在遞歸執(zhí)行這個過程,viewGroup是一個抽象的類,沒有提供有onMeasure方法,但是提供了一個measureChildren的方法。measureChild方法的思想就是取出子元素的layoutParams,然后通過getChildMeasureSpec來常見子元素的MeasureSpec,然后子元素在電泳measure方法進行測量。由于viewGroup子類有不同的布局方式,導致他們的測量細節(jié)不一樣,所以viewGroup不能象view一樣調用onMeasure方法進行測量。

注意:在activity的生命周期中是沒有辦法正確的獲取view的寬高的,原因就是view沒有測量完。

  1. 在onWindowFocuschanged方法中獲取 ----改方法含義是view已經初始化完畢

  2. View.post()方法,將潤那邊了投遞到消息隊列的尾部。

  3. 使用viewTreeObserver的回調來完成。

  4. 通過view.measure方式手動測量。

onLayout

普通的view的話,可以通過setFrame方法來的到view四個頂點的位置,也就確定了view在父容器的位置,接著就調用onLayout方法,該方法是父容器確定子元素的位置。

onDraw

該方法就是將view繪制到屏幕上。分以下幾步

  1. 繪制背景,

  2. 繪制自己,

  3. 繪制child,

  4. 繪制裝飾。

Android中性能優(yōu)化

由于手機硬件的限制,內存和CPU都無法像pc一樣具有超大的內存,Android手機上,過多的使用內存,會容易導致oom,過多的使用CPU資源,會導致手機卡頓,甚至導致anr。我主要是從一下幾部分進行優(yōu)化:

布局優(yōu)化,繪制優(yōu)化,內存泄漏優(yōu)化,響應速度優(yōu)化,listview優(yōu)化,bitmap優(yōu)化,線程優(yōu)化

布局優(yōu)化:工具 hierarchyviewer,解決方式:

1、刪除無用的空間和層級。

2、選擇性能較低的viewgroup,如Relativelayout,如果可以選擇Relativelayout也可以使用LinearLayout,就優(yōu)先使用LinearLayout,因為相對來說Relativelayout功能較為復雜,會占用更多的CPU資源。

3、使用標簽<include/>重用布局,<Merge/>減少層級,<viewStub/>進行預加載,使用的時候才加載。

繪制優(yōu)化

繪制優(yōu)化指view在ondraw方法中避免大量的耗時操作,由于ondraw方法可能會被頻繁的調用。

1、ondraw方法中不要創(chuàng)建新的局部變量,ondraw方法被頻繁的調用,很容易引起GC。

2、ondraw方法不要做耗時操作。

內存優(yōu)化:參考內存泄漏。

響應優(yōu)化

主線程不能做耗時操作,觸摸事件5s,廣播10s,service20s。

listview優(yōu)化:

1、getview方法中避免耗時操作。

2、view的復用和viewholder的使用。

3、滑動不適合開啟異步加載。

4、分頁處理數(shù)據。

5、圖片使用三級緩存。

Bitmap優(yōu)化:

1、等比例壓縮圖片。

2、不用的圖片,及時recycler掉

線程優(yōu)化

線程優(yōu)化的思想是使用線程池來管理和復用線程,避免程序中有大量的Thread,同時可以控制線程的并發(fā)數(shù),避免相互搶占資源而導致線程阻塞。

其他優(yōu)化

1、少用枚舉,枚舉占用空間大。

2、使用Android特有的數(shù)據結構,如SparseArray來代替hashMap。

3、適當?shù)氖褂密浺煤腿跻谩?/p>

加密算法(base64、MD5、對稱加密和非對稱加密)和使用場景。

什么是Rsa加密?

RSA算法是最流行的公鑰密碼算法,使用長度可以變化的密鑰。RSA是第一個既能用于數(shù)據加密也能用于數(shù)字簽名的算法。

RSA算法原理如下:

1.隨機選擇兩個大質數(shù)p和q,p不等于q,計算N=pq;

2.選擇一個大于1小于N的自然數(shù)e,e必須與(p-1)(q-1)互素。

3.用公式計算出d:d×e = 1 (mod (p-1)(q-1)) 。

4.銷毀p和q。

最終得到的N和e就是“公鑰”,d就是“私鑰”,發(fā)送方使用N去加密數(shù)據,接收方只有使用d才能解開數(shù)據內容。

RSA的安全性依賴于大數(shù)分解,小于1024位的N已經被證明是不安全的,而且由于RSA算法進行的都是大數(shù)計算,使得RSA最快的情況也比DES慢上倍,這是RSA最大的缺陷,因此通常只能用于加密少量數(shù)據或者加密密鑰,但RSA仍然不失為一種高強度的算法。

使用場景:項目中除了登陸,支付等接口采用rsa非對稱加密,之外的采用aes對稱加密,今天我們來認識一下aes加密。

什么是MD5加密?

MD5英文全稱“Message-Digest Algorithm 5”,翻譯過來是“消息摘要算法5”,由MD2、MD3、MD4演變過來的,是一種單向加密算法,是不可逆的一種的加密方式。

MD5加密有哪些特點?

壓縮性:任意長度的數(shù)據,算出的MD5值長度都是固定的。

容易計算:從原數(shù)據計算出MD5值很容易。

抗修改性:對原數(shù)據進行任何改動,哪怕只修改1個字節(jié),所得到的MD5值都有很大區(qū)別。

強抗碰撞:已知原數(shù)據和其MD5值,想找到一個具有相同MD5值的數(shù)據(即偽造數(shù)據)是非常困難的。

本文名稱:Android面試一般會問什么?
網址分享:http://aaarwkj.com/article0/igocio.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供手機網站建設、網站導航網站改版、營銷型網站建設、企業(yè)建站、ChatGPT

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網站建設
精品一区二区亚洲精品| 国产精品午夜福利亚洲综合网| av免费在线不卡观看| 国产一区二区精品日韩| 熟妇人妻久久中文字幕麻豆网| 亚洲一本一道久久香蕉| 亚洲一区二区三区精品电影网| 国产激情福利一区二区| 西西美女掰开阴让你看| 九色视频在线观看91| 国产午夜在线观看免费视频 | 中文字幕在线感觉av| 伊人久久大香线蕉av色婷婷色| 91免费在线观看国产精品| 欧美黑人少妇高潮喷水| 日本人妻中文字幕在线一区| 天天操天天夜夜操夜夜| 欧美日韩一区二区高清在线| 18禁超污网站免费观看| 国产剧情在线观看网站| 国产av一区二区三区久久| 欧美性色黄大片人与善| 丰满少妇一区二区三区专区| 在线观看中文字幕日韩精品| av国产剧情在线观看| 亚洲专区综合红桃av| 亚洲一区二区精品91眼镜| 日韩av手机在线不卡| 亚洲欧美日韩校园春色| 欧美一级特黄免费大片| 久久中文字幕一区二区三区| 日韩一区二区三区不卡| 天堂av影片在线观看| 久国产精品一区国产精品| 高清欧美精品一区二区三区| 日本理论高清在线观看| 一区二区三区午夜激情| 亚洲国产在线一区二区| 最新日韩欧美不卡一二三区| av国产一区二区在线| 黄色免费av片在线观看|