Java基礎(chǔ)
Q: 容器類(lèi)边败, ArrayList和Vector的主要區(qū)別HashMap原理
1. List 接口支持通過(guò)索引的方法來(lái)訪問(wèn)元素:ArrayList 隨機(jī)訪問(wèn)快改慢;LinkedList改快隨機(jī)訪問(wèn)慢;Vector實(shí)現(xiàn)了同步悴能,因而比ArrayList慢
- LinkedList使用雙向鏈表實(shí)現(xiàn)LinkedList提供額外的get外构,remove谓罗,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack)崎苗,隊(duì)列(queue)或雙向隊(duì)列(deque)。
3. ArrayList沒(méi)有定義增長(zhǎng)算法舀寓,當(dāng)需要插入大量元素是胆数,可調(diào)用ensureCapacity方法提高添加效率
4. Vector類(lèi)似與ArrayList,但是是同步的互墓,多線程安全(另外一點(diǎn)區(qū)別是ArrayList擴(kuò)容時(shí)默認(rèn)增長(zhǎng)一半必尼,Vector增長(zhǎng)一倍)。無(wú)論是單線程還是多線程篡撵,Vector都比ArrayList慢
5. Stack繼承自Vector判莉,實(shí)現(xiàn)一個(gè)后進(jìn)先出的堆棧
TreeSet, HashSet, LinkedHashSet(HashSet齿诞,TreeSet不是線程安全的)
- TreeSet是SortedSet接口的唯一實(shí)現(xiàn)類(lèi),TreeSet可以確保集合元素處于排序狀態(tài)骂租,效率很高祷杈,可提高程序的效率;TreeSet通過(guò)compareTo或者compare排序渗饮,因而只要值相等即使equals不等(不同對(duì)象)也不能加到集合中(fails to obey Set interface)
2. HashSet但汞,效率很高,和TreeSet不同的是通過(guò)比較對(duì)象的equals區(qū)分不同對(duì)象互站,這樣不同的對(duì)象可以不被重復(fù)的加入到集合中私蕾。hashCode()函數(shù)不好確定,對(duì)象默認(rèn)的hashCode函數(shù)試對(duì)象的內(nèi)存地址值胡桃,hashCode函數(shù)的好壞是HashSet性能的關(guān)鍵踩叭。
3. LinkedHashSet,和HashSet相同,同樣是根據(jù)元素的hashCode值來(lái)決定元素的存儲(chǔ)位置翠胰,但是它同時(shí)使用鏈表維護(hù)元素的次序容贝。LinkedHashSet在迭代訪問(wèn)Set中的全部元素時(shí),性能比HashSet好之景,但是插入時(shí)性能稍微遜色于HashSet斤富。
- Set可以插入null,最多一個(gè)null
http://www.cnblogs.com/wishyouhappy/p/3669198.html
http://blog.csdn.net/softwave/article/details/4166598
Q:string/stringbuilder/stringbuffer
都是 final 類(lèi), 都不允許被繼承;
String 長(zhǎng)度是不可變的, StringBuffer锻狗、StringBuilder 長(zhǎng)度是可變的;
StringBuffer 是線程安全的, StringBuilder 不是線程安全的满力。
Q:線程synchronized、lock
synchronized關(guān)鍵字是用來(lái)控制線程同步的轻纪,就是在多線程的環(huán)境下油额,控制synchronized代碼段不被多個(gè)線程同時(shí)執(zhí)行。synchronized既可以加在一段代碼上刻帚,也可以加在方法上潦嘶。
用sychronized修飾的方法或者語(yǔ)句塊在代碼執(zhí)行完之后鎖自動(dòng)釋放,而用Lock需要我們手動(dòng)釋放鎖我擂,所以為了保證鎖最終被釋放(發(fā)生異常情況)衬以,要把互斥區(qū)放在try內(nèi),釋放鎖放在finally內(nèi)校摩。
http://blog.csdn.net/ghsau/article/details/7461369
Q:thread看峻、runnable
在程序開(kāi)發(fā)中只要是多線程肯定永遠(yuǎn)以實(shí)現(xiàn)Runnable接口為主,因?yàn)閷?shí)現(xiàn)Runnable接口相比繼承Thread類(lèi)有如下好處:
避免點(diǎn)繼承的局限衙吩,一個(gè)類(lèi)可以繼承多個(gè)接口互妓。
適合于資源的共享
Q:匿名內(nèi)部類(lèi)使用規(guī)范
匿名內(nèi)部類(lèi)我們必須要繼承一個(gè)父類(lèi)或者實(shí)現(xiàn)一個(gè)接口,當(dāng)然也僅能只繼承一個(gè)父類(lèi)或者實(shí)現(xiàn)一個(gè)接口。同時(shí)它也是沒(méi)有class關(guān)鍵字冯勉,這是因?yàn)槟涿麅?nèi)部類(lèi)是直接使用new來(lái)生成一個(gè)對(duì)象的引用澈蚌。當(dāng)然這個(gè)引用是隱式的。
對(duì)于匿名內(nèi)部類(lèi)的使用它是存在一個(gè)缺陷的灼狰,就是它僅能被使用一次宛瞄,創(chuàng)建匿名內(nèi)部類(lèi)時(shí)它會(huì)立即創(chuàng)建一個(gè)該類(lèi)的實(shí)例,該類(lèi)的定義會(huì)立即消失交胚,所以匿名內(nèi)部類(lèi)是不能夠被重復(fù)使用份汗。對(duì)于上面的實(shí)例,如果我們需要對(duì)test()方法里面內(nèi)部類(lèi)進(jìn)行多次使用蝴簇,建議重新定義類(lèi)杯活,而不是使用匿名內(nèi)部類(lèi)。
在使用匿名內(nèi)部類(lèi)的過(guò)程中熬词,我們需要注意如下幾點(diǎn):
1旁钧、使用匿名內(nèi)部類(lèi)時(shí),我們必須是繼承一個(gè)類(lèi)或者實(shí)現(xiàn)一個(gè)接口互拾,但是兩者不可兼得歪今,同時(shí)也只能繼承一個(gè)類(lèi)或者實(shí)現(xiàn)一個(gè)接口。
2摩幔、匿名內(nèi)部類(lèi)中是不能定義構(gòu)造函數(shù)的彤委。
3鞭铆、匿名內(nèi)部類(lèi)中不能存在任何的靜態(tài)成員變量和靜態(tài)方法或衡。
4、匿名內(nèi)部類(lèi)為局部?jī)?nèi)部類(lèi)车遂,所以局部?jī)?nèi)部類(lèi)的所有限制同樣對(duì)匿名內(nèi)部類(lèi)生效封断。
5、匿名內(nèi)部類(lèi)不能是抽象的舶担,它必須要實(shí)現(xiàn)繼承的類(lèi)或者實(shí)現(xiàn)的接口的所有抽象方法坡疼。
簡(jiǎn)單理解就是,拷貝引用衣陶,為了避免引用值發(fā)生改變柄瑰,例如被外部類(lèi)的方法修改等,而導(dǎo)致內(nèi)部類(lèi)得到的值不一致剪况,于是用final來(lái)讓該引用不可改變教沾。
故如果定義了一個(gè)匿名內(nèi)部類(lèi),并且希望它使用一個(gè)其外部定義的參數(shù)译断,那么編譯器會(huì)要求該參數(shù)引用是final的授翻。
http://www.cnblogs.com/chenssy/p/3390871.html
Q:異常try-catch機(jī)制
java 的異常處理中,
在不拋出異常的情況下,程序執(zhí)行完 try 里面的代碼塊之后堪唐,該方法并不會(huì)立即結(jié)束巡语,而是繼續(xù)試圖去尋找該方法有沒(méi)有 finally 的代碼塊,
如果沒(méi)有 finally 代碼塊淮菠,整個(gè)方法在執(zhí)行完 try 代碼塊后返回相應(yīng)的值來(lái)結(jié)束整個(gè)方法男公;
如果有 finally 代碼塊,此時(shí)程序執(zhí)行到 try 代碼塊里的 return 語(yǔ)句之時(shí)并不會(huì)立即執(zhí)行 return合陵,而是先去執(zhí)行 finally 代碼塊里的代碼理澎,
若 finally 代碼塊里沒(méi)有 return 或沒(méi)有能夠終止程序的代碼,程序?qū)⒃趫?zhí)行完 finally 代碼塊代碼之后再返回 try 代碼塊執(zhí)行 return 語(yǔ)句來(lái)結(jié)束整個(gè)方法曙寡;
若 finally 代碼塊里有 return 或含有能夠終止程序的代碼糠爬,方法將在執(zhí)行完 finally 之后被結(jié)束,不再跳回 try 代碼塊執(zhí)行 return举庶。
在拋出異常的情況下执隧,原理也是和上面的一樣的,你把上面說(shuō)到的 try 換成 catch 去理解就 OK 了
http://www.blogjava.net/fancydeepin/archive/2012/07/08/382508.html
Q:泛型
如果我們只寫(xiě)一個(gè)排序方法户侥,就能夠?qū)φ螖?shù)組镀琉、字符串?dāng)?shù)組甚至支持排序的任何類(lèi)型的數(shù)組進(jìn)行排序,這該多好啊蕊唐。
Java泛型方法和泛型類(lèi)支持程序員使用一個(gè)方法指定一組相關(guān)方法屋摔,或者使用一個(gè)類(lèi)指定一組相關(guān)的類(lèi)型。
Java泛型(generics)是JDK 5中引入的一個(gè)新特性,泛型提供了編譯時(shí)類(lèi)型安全檢測(cè)機(jī)制替梨,該機(jī)制允許程序員在編譯時(shí)檢測(cè)到非法的類(lèi)型钓试。
使用Java泛型的概念,我們可以寫(xiě)一個(gè)泛型方法來(lái)對(duì)一個(gè)對(duì)象數(shù)組排序副瀑。然后弓熏,調(diào)用該泛型方法來(lái)對(duì)整型數(shù)組、浮點(diǎn)數(shù)數(shù)組糠睡、字符串?dāng)?shù)組等進(jìn)行排序挽鞠。
http://www.w3cschool.cc/java/java-generics.html
Q:線程池
newCachedThreadPool創(chuàng)建一個(gè)可緩存線程池,如果線程池長(zhǎng)度超過(guò)處理需要狈孔,可靈活回收空閑線程信认,若無(wú)可回收,則新建線程均抽。
newFixedThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池嫁赏,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待到忽。
newScheduledThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池橄教,支持定時(shí)及周期性任務(wù)執(zhí)行清寇。
newSingleThreadExecutor 創(chuàng)建一個(gè)單線程化的線程池,它只會(huì)用唯一的工作線程來(lái)執(zhí)行任務(wù)护蝶,保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行华烟。
http://blog.csdn.net/mazhimazh/article/details/19243889
Q:引用機(jī)制(WeakReference, SoftReference, ReferenceQueue理解, WeakHashMap的原理)
強(qiáng)引用(StrongReference)
強(qiáng)引用是使用最普遍的引用。如果一個(gè)對(duì)象具有強(qiáng)引用持灰,那垃圾回收器絕不會(huì)回收它盔夜。
軟引用(SoftReference)
如果一個(gè)對(duì)象只具有軟引用,則內(nèi)存空間足夠堤魁,垃圾回收器就不會(huì)回收它喂链;如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存妥泉。只要垃圾回收器沒(méi)有回收它椭微,該對(duì)象就可以被程序使用。軟引用可用來(lái)實(shí)現(xiàn)內(nèi)存敏感的高速緩存盲链。
弱引用(WeakReference)
弱引用與軟引用的區(qū)別在于:只具有弱引用的對(duì)象擁有更短暫的生命周期蝇率。在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過(guò)程中,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象刽沾,不管當(dāng)前內(nèi)存空間足夠與否本慕,都會(huì)回收它的內(nèi)存。不過(guò)侧漓,由于垃圾回收器是一個(gè)優(yōu)先級(jí)很低的線程锅尘,因此不一定會(huì)很快發(fā)現(xiàn)那些只具有弱引用的對(duì)象。
虛引用(PhantomReference)
“虛引用”顧名思義布蔗,就是形同虛設(shè)藤违,與其他幾種引用都不同,虛引用并不會(huì)決定對(duì)象的生命周期何鸡。如果一個(gè)對(duì)象僅持有虛引用纺弊,那么它就和沒(méi)有任何引用一樣,在任何時(shí)候都可能被垃圾回收器回收骡男。
虛引用主要用來(lái)跟蹤對(duì)象被垃圾回收器回收的活動(dòng)。虛引用與軟引用和弱引用的一個(gè)區(qū)別在于:虛引用必須和引用隊(duì)列 (ReferenceQueue)聯(lián)合使用傍睹。當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí)隔盛,如果發(fā)現(xiàn)它還有虛引用球散,就會(huì)在回收對(duì)象的內(nèi)存之前而咆,把這個(gè)虛引用加入到與之 關(guān)聯(lián)的引用隊(duì)列中。
Q:exception醉锄,throwable访得,error
throwable 類(lèi)是 Java 語(yǔ)言中所有錯(cuò)誤或異常的超類(lèi)龙亲。它的兩個(gè)子類(lèi)是Error和Exception陕凹;
Error 是 Throwable 的子類(lèi),用于指示合理的應(yīng)用程序不應(yīng)該試圖捕獲的嚴(yán)重問(wèn)題鳄炉。大多數(shù)這樣的錯(cuò)誤都是異常條件杜耙。雖然 ThreadDeath 錯(cuò)誤是一個(gè)“正規(guī)”的條件,但它也是 Error 的子類(lèi)拂盯,因?yàn)榇蠖鄶?shù)應(yīng)用程序都不應(yīng)該試圖捕獲它佑女。在執(zhí)行該方法期間,無(wú)需在其 throws 子句中聲明可能拋出但是未能捕獲的 Error 的任何子類(lèi)谈竿,因?yàn)檫@些錯(cuò)誤可能是再也不會(huì)發(fā)生的異常條件团驱。 Exception 類(lèi)及其子類(lèi)是 Throwable 的一種形式,它指出了合理的應(yīng)用程序想要捕獲的條件空凸『炕ǎ可以是可被控制(checked) 或不可控制的(unchecked) ,表示一個(gè)由程序員導(dǎo)致的錯(cuò)誤 ,應(yīng)該在應(yīng)用程序級(jí)被處理呀洲》坊茫總是不可控制的(unchecked) ,經(jīng)常用來(lái)用于表示系統(tǒng)錯(cuò)誤或低層資源的錯(cuò)誤 两嘴,如何可能的話丛楚,應(yīng)該在系統(tǒng)級(jí)被捕捉。
RuntimeException 是那些可能在 Java 虛擬機(jī)正常運(yùn)行期間拋出的異常的超類(lèi)憔辫∪ば可能在執(zhí)行方法期間拋出但未被捕獲的RuntimeException 的任何子類(lèi)都無(wú)需在 throws 子句中進(jìn)行聲明。它是Exception的子類(lèi)贰您。
http://blog.csdn.net/liuj2511981/article/details/8524418
Q:finallize
finalize是在java.lang.object里定義的坏平,也就是說(shuō)每一個(gè)對(duì)象都有這么個(gè)方法。這個(gè)方法在gc啟動(dòng)锦亦,該對(duì)象被回收的時(shí)候被調(diào)用舶替。其實(shí)gc可以回收大部分的對(duì)象(凡是new出來(lái)的對(duì)象,gc都能搞定杠园,一般情況下我們又不會(huì)用new以外的方式去創(chuàng)建對(duì)象)顾瞪,所以一般是不需要程序員去實(shí)現(xiàn)finalize的。
特殊情況下抛蚁,需要程序員實(shí)現(xiàn)finalize陈醒,當(dāng)對(duì)象被回收的時(shí)候釋放一些資源,比如:一個(gè)socket鏈接瞧甩,在對(duì)象初始化時(shí)創(chuàng)建钉跷,整個(gè)生命周期內(nèi)有效,那么就需要實(shí)現(xiàn)finalize肚逸,關(guān)閉這個(gè)鏈接爷辙。
Q:volatile/Atomic
http://www.cnblogs.com/Mainz/p/3556430.html
Q:Object類(lèi)hashCode(), equals()方法的理解(HashMap等類(lèi)庫(kù)中如何利用這兩個(gè)方法的)
等號(hào)(==):
對(duì)比對(duì)象實(shí)例的內(nèi)存地址(也即對(duì)象實(shí)例的ID)彬坏,來(lái)判斷是否是同一對(duì)象實(shí)例;又可以說(shuō)是判斷對(duì)象實(shí)例是否物理相等膝晾;
equals():
對(duì)比兩個(gè)對(duì)象實(shí)例是否相等栓始。
當(dāng)對(duì)象所屬的類(lèi)沒(méi)有重寫(xiě)根類(lèi)Object的equals()方法時(shí),equals()判斷的是對(duì)象實(shí)例的ID(內(nèi)存地址)玷犹,是否是同一對(duì)象實(shí)例混滔;該方法就是使用的等號(hào)(==)的判斷結(jié)果,如Object類(lèi)的源代碼所示:
public boolean equals(Object obj) {
return (this == obj);
}
1.如果兩個(gè)對(duì)象相同歹颓,那么它們的hashCode值一定要相同坯屿;
2.如果兩個(gè)對(duì)象的hashCode相同,它們并不一定相同(這里說(shuō)的對(duì)象相同指的是用eqauls方法比較)巍扛。
如不按要求去做了领跛,會(huì)發(fā)現(xiàn)相同的對(duì)象可以出現(xiàn)在Set集合中,同時(shí)撤奸,增加新元素的效率會(huì)大大下降吠昭。
3.equals()相等的兩個(gè)對(duì)象,hashcode()一定相等胧瓜;equals()不相等的兩個(gè)對(duì)象矢棚,卻并不能證明他們的hashcode()不相等。
1.重點(diǎn)是equals府喳,重寫(xiě)hashCode只是技術(shù)要求(為了提高效率)
2.為什么要重寫(xiě)equals呢蒲肋?因?yàn)樵趈ava的集合框架中,是通過(guò)equals來(lái)判斷兩個(gè)對(duì)象是否相等的
3.在hibernate中钝满,經(jīng)常使用set集合來(lái)保存相關(guān)對(duì)象兜粘,而set集合是不允許重復(fù)的。在向HashSet集合中添加元素時(shí)弯蚜,其實(shí)只要重寫(xiě)equals()這一條也可以孔轴。但當(dāng)hashset中元素比較多時(shí),或者是重寫(xiě)的equals()方法比較復(fù)雜時(shí)碎捺,我們只用equals()方法進(jìn)行比較判斷路鹰,效率也會(huì)非常低,所以引入了hashCode()這個(gè)方法牵寺,只是為了提高效率悍引,且這是非常有必要的
http://bijian1013.iteye.com/blog/1972404
Q: 反射機(jī)制理解
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi)帽氓,都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象俩块,都能夠調(diào)用它的任意一個(gè)方法和屬性黎休;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱(chēng)為java語(yǔ)言的反射機(jī)制浓领。
反射一般用來(lái)寫(xiě)一些通用的框架。比如ide的自動(dòng)提示就是根據(jù)反射來(lái)實(shí)現(xiàn)的势腮。
http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
Q: 從[K,K+N-1]共N個(gè)整數(shù)中隨機(jī)去除一個(gè)联贩,剩余的N-1個(gè)數(shù)亂序后放入數(shù)組,請(qǐng)找出被去除的一個(gè)
/**
* 快速排序的具體實(shí)現(xiàn)捎拯,排正序
*
* @param data
* @param low
* @param high
*/
private static void quickSortAsc(int data[], int low, int high) {
int i, j, x;
if (low < high) { // 這個(gè)條件用來(lái)結(jié)束遞歸
i = low;
j = high;
x = data[i];
while (i < j) {
while (i < j && data[j] > x) {
j--; // 從右向左找第一個(gè)小于x的數(shù)
}
if (i < j) {
data[i] = data[j];
i++;
}
while (i < j && data[i] < x) {
i++; // 從左向右找第一個(gè)大于x的數(shù)
}
if (i < j) {
data[j] = data[i];
j--;
}
}
data[i] = x;
qsort_asc(data, low, i - 1);
qsort_asc(data, i + 1, high);
}
}
/**
* 快速排序的具體實(shí)現(xiàn)泪幌,排倒序
*
* @param data
* @param low
* @param high
*/
private static void quickSortDesc(int data[], int low, int high) {
int i, j, x;
if (low < high) { // 這個(gè)條件用來(lái)結(jié)束遞歸
i = low;
j = high;
x = data[i];
while (i < j) {
while (i < j && data[j] < x) {
j--; // 從右向左找第一個(gè)小于x的數(shù)
}
if (i < j) {
data[i] = data[j];
i++;
}
while (i < j && data[i] > x) {
i++; // 從左向右找第一個(gè)大于x的數(shù)
}
if (i < j) {
data[j] = data[i];
j--;
}
}
data[i] = x;
qsort_desc(data, low, i - 1);
qsort_desc(data, i + 1, high);
}
}
public static void binarySearch(int array[], int searchValue) {
int low = 0;
int high = array.length;
while (low <= high) {
int mid = (low + high) / 2;
if (searchValue == array[mid]) {
System.out.println("此數(shù)值在list中的位置為:" + mid);
break;
}
if (searchValue > array[mid]) {
low = mid + 1; // 當(dāng)小于時(shí),是low指針向后移動(dòng)署照,high指針不變
}
if (searchValue < array[mid]) {
high = mid - 1; // 當(dāng)大于時(shí)祸泪,是high指針向前移動(dòng),low指針不變
}
}
if (low > high) {
System.out.println("沒(méi)有查到結(jié)果建芙!");
}
}
http://blog.csdn.net/pzhtpf/article/details/7559896
Q:從長(zhǎng)度為100萬(wàn)的整數(shù)數(shù)組中找出最大的100個(gè) (100萬(wàn)的數(shù)組在內(nèi)存中没隘,數(shù)組中數(shù)可能重復(fù))
冒泡算法:冒泡算法的思路就是交換排序,通過(guò)相鄰數(shù)據(jù)的交換達(dá)到排序的目的禁荸。平均速度為o(n2).
選擇排序:選擇排序在每一步選取最小的值來(lái)重新排列右蒲。平均速度為o(nlogn)。
Shell排序:基于插入排序的思想赶熟。平均速度為o(n3/2)瑰妄。
快速排序:快速排序也是基于交換思想,是冒泡排序的改進(jìn)映砖。平均速度為o(nlogn)间坐。
堆排序:其利用二叉樹(shù)的一些性質(zhì)和堆的數(shù)據(jù)結(jié)構(gòu)完成數(shù)據(jù)的排序。
歸并排序:將多個(gè)有序鏈表合并成一個(gè)有序的數(shù)據(jù)表啊央。如果參與排序的只有兩個(gè)有序鏈表眶诈,則稱(chēng)為二路合并。
Q:用單向鏈表表示十進(jìn)制整數(shù)瓜饥,求兩個(gè)整數(shù)的和(如給出鏈表A逝撬、B,返回C)
class Node {
int value;
Node nextNode;
public Node(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Node getNextNode() {
return nextNode;
}
public void setNextNode(Node nextNode) {
this.nextNode = nextNode;
}
}
/**
* 遍歷乓土,將當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)緩存后更改當(dāng)前節(jié)點(diǎn)指針
*
*/
public static Node reverse(Node head) {
if (null == head) {
return head;
}
Node pre = head;
Node cur = head.getNextNode();
Node next;
while (null != cur) {
next = cur.getNextNode();
cur.setNextNode(pre);
pre = cur;
cur = next;
}
// 將原鏈表的頭節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)置為null宪潮,再將反轉(zhuǎn)后的頭節(jié)點(diǎn)賦給head
head.setNextNode(null);
head = pre;
return head;
}
Android 基礎(chǔ)
Q:listview 多種Cell
重寫(xiě) getViewTypeCount() – 該方法返回多少個(gè)不同的布局
重寫(xiě) getItemViewType(int) – 根據(jù)position返回相應(yīng)的Item
3)根據(jù)view item的類(lèi)型,在getView中創(chuàng)建正確的convertView
http://blog.csdn.net/xyz_lmn/article/details/13745489
Q:launchmode 啟動(dòng)模式
Standard
默認(rèn)加載方式.每當(dāng)需要一個(gè)Activity instance的時(shí)候系統(tǒng)都會(huì)創(chuàng)建一個(gè)新的實(shí)例給我們,并且將它置于棧頂.這種方式不關(guān)心原有的棧結(jié)構(gòu).
singleTop
系統(tǒng)首先會(huì)尋找棧中的instance,如果已有所需實(shí)例且位于棧頂,則直接使用;否則就重新創(chuàng)建新的實(shí)例.
singleTask
系統(tǒng)首先會(huì)尋找棧中的instance,若棧中已有所需實(shí)例,則移出該實(shí)例之上的所有實(shí)例并使用.
singleInstance
當(dāng)Activity的launch mode 被設(shè)置為single instance時(shí),該Activity 實(shí)例將被創(chuàng)建于一個(gè)新的棧中,且該棧只存在一個(gè)實(shí)例.如有需要?jiǎng)t直接從該棧中取來(lái)使用.
Q:inflate形式
LayoutInflater layoutInflater = LayoutInflater.from(context);
LayoutInflater layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View.inflate
http://blog.sina.com.cn/s/blog_5da93c8f0100xm6n.html
Q:view繪制過(guò)程
流程一: mesarue()過(guò)程
主要作用:為整個(gè)View樹(shù)計(jì)算實(shí)際的大小趣苏,即設(shè)置實(shí)際的高(對(duì)應(yīng)屬性:mMeasuredHeight)和寬(對(duì)應(yīng)屬性: mMeasureWidth)狡相,每個(gè)View的控件的實(shí)際寬高都是由父視圖和本身視圖決定的。
具體的調(diào)用鏈如下:
ViewRoot根對(duì)象地屬性mView(其類(lèi)型一般為ViewGroup類(lèi)型)調(diào)用measure()方法去計(jì)算View樹(shù)的大小食磕,回調(diào)View/ViewGroup對(duì)象的onMeasure()方法尽棕,該方法實(shí)現(xiàn)的功能如下:
1、設(shè)置本View視圖的最終大小彬伦,該功能的實(shí)現(xiàn)通過(guò)調(diào)用setMeasuredDimension()方法去設(shè)置實(shí)際的高(對(duì)應(yīng)屬性: mMeasuredHeight)和寬(對(duì)應(yīng)屬性:mMeasureWidth) 滔悉;
2 伊诵、如果該View對(duì)象是個(gè)ViewGroup類(lèi)型,需要重寫(xiě)該onMeasure()方法回官,對(duì)其子視圖進(jìn)行遍歷的measure()過(guò)程曹宴。
2.1 對(duì)每個(gè)子視圖的measure()過(guò)程,是通過(guò)調(diào)用父類(lèi)ViewGroup.java類(lèi)里的measureChildWithMargins()方法去實(shí)現(xiàn)歉提,該方法內(nèi)部只是簡(jiǎn)單地調(diào)用了View對(duì)象的measure()方法笛坦。(由于measureChildWithMargins()方法只是一個(gè)過(guò)渡層更簡(jiǎn)單的做法是直接調(diào)用View對(duì)象的measure()方法)。
整個(gè)measure調(diào)用流程就是個(gè)樹(shù)形的遞歸過(guò)程
流程二苔巨、 layout布局過(guò)程:
主要作用 :為將整個(gè)根據(jù)子視圖的大小以及布局參數(shù)將View樹(shù)放到合適的位置上版扩。
具體的調(diào)用鏈如下:
host.layout()開(kāi)始View樹(shù)的布局,繼而回調(diào)給View/ViewGroup類(lèi)中的layout()方法恋拷。具體流程如下
1 资厉、layout方法會(huì)設(shè)置該View視圖位于父視圖的坐標(biāo)軸,即mLeft蔬顾,mTop宴偿,mLeft,mBottom(調(diào)用setFrame()函數(shù)去實(shí)現(xiàn))
接下來(lái)回調(diào)onLayout()方法(如果該View是ViewGroup對(duì)象诀豁,需要實(shí)現(xiàn)該方法窄刘,對(duì)每個(gè)子視圖進(jìn)行布局) ;
2舷胜、如果該View是個(gè)ViewGroup類(lèi)型娩践,需要遍歷每個(gè)子視圖chiildView,調(diào)用該子視圖的layout()方法去設(shè)置它的坐標(biāo)值烹骨。
流程三翻伺、 draw()繪圖過(guò)程
由ViewRoot對(duì)象的performTraversals()方法調(diào)用draw()方法發(fā)起繪制該View樹(shù),值得注意的是每次發(fā)起繪圖時(shí)沮焕,并不會(huì)重新繪制每個(gè)View樹(shù)的視圖吨岭,而只會(huì)重新繪制那些“需要重繪”的視圖,View類(lèi)內(nèi)部變量包含了一個(gè)標(biāo)志位DRAWN峦树,當(dāng)該視圖需要重繪時(shí)辣辫,就會(huì)為該View添加該標(biāo)志位。
調(diào)用流程 :
mView.draw()開(kāi)始繪制魁巩,draw()方法實(shí)現(xiàn)的功能如下:
1 急灭、繪制該View的背景
2 、為顯示漸變框做一些準(zhǔn)備操作(見(jiàn)5谷遂,大多數(shù)情況下葬馋,不需要改漸變框)
3、調(diào)用onDraw()方法繪制視圖本身 (每個(gè)View都需要重載該方法,ViewGroup不需要實(shí)現(xiàn)該方法)
4点楼、調(diào)用dispatchDraw ()方法繪制子視圖(如果該View類(lèi)型不為ViewGroup扫尖,即不包含子視圖白对,不需要重載該方法)值得說(shuō)明的是掠廓,ViewGroup類(lèi)已經(jīng)為我們重寫(xiě)了dispatchDraw ()的功能實(shí)現(xiàn),應(yīng)用程序一般不需要重寫(xiě)該方法甩恼,但可以重載父類(lèi)函數(shù)實(shí)現(xiàn)具體的功能蟀瞧。
4.1 dispatchDraw()方法內(nèi)部會(huì)遍歷每個(gè)子視圖,調(diào)用drawChild()去重新回調(diào)每個(gè)子視圖的draw()方法(注意条摸,這個(gè) 地方“需要重繪”的視圖才會(huì)調(diào)用draw()方法)悦污。值得說(shuō)明的是,ViewGroup類(lèi)已經(jīng)為我們重寫(xiě)了dispatchDraw()的功能實(shí)現(xiàn)钉蒲,應(yīng)用程序一般不需要重寫(xiě)該方法切端,但可以重載父類(lèi)函數(shù)實(shí)現(xiàn)具體的功能。
Q:view的touch事件傳遞機(jī)制
. onTouch和onTouchEvent有什么區(qū)別顷啼,又該如何使用踏枣?
從源碼中可以看出,這兩個(gè)方法都是在View的dispatchTouchEvent中調(diào)用的钙蒙,onTouch優(yōu)先于onTouchEvent執(zhí)行茵瀑。如果在onTouch方法中通過(guò)返回true將事件消費(fèi)掉,onTouchEvent將不會(huì)再執(zhí)行躬厌。
另外需要注意的是马昨,onTouch能夠得到執(zhí)行需要兩個(gè)前提條件,第一mOnTouchListener的值不能為空扛施,第二當(dāng)前點(diǎn)擊的控件必須是enable的鸿捧。因此如果你有一個(gè)控件是非enable的,那么給它注冊(cè)onTouch事件將永遠(yuǎn)得不到執(zhí)行疙渣。對(duì)于這一類(lèi)控件匙奴,如果我們想要監(jiān)聽(tīng)它的touch事件,就必須通過(guò)在該控件中重寫(xiě)onTouchEvent方法來(lái)實(shí)現(xiàn)昌阿。
dispatchTouchEvent->onTouch->onTouhEvent
ViewGroup
實(shí)際情況是饥脑,當(dāng)你點(diǎn)擊了某個(gè)控件,首先會(huì)去調(diào)用該控件所在布局的dispatchTouchEvent方法懦冰,然后在布局的dispatchTouchEvent方法中找到被點(diǎn)擊的相應(yīng)控件灶轰,再去調(diào)用該控件的dispatchTouchEvent方法。
刷钢。如果我們點(diǎn)擊了MyLayout中的按鈕笋颤,會(huì)先去調(diào)用MyLayout的dispatchTouchEvent方法,可是你會(huì)發(fā)現(xiàn)MyLayout中并沒(méi)有這個(gè)方法。那就再到它的父類(lèi)LinearLayout中找一找伴澄,發(fā)現(xiàn)也沒(méi)有這個(gè)方法赋除。那只好繼續(xù)再找LinearLayout的父類(lèi)ViewGroup,你終于在ViewGroup中看到了這個(gè)方法非凌,按鈕的dispatchTouchEvent方法就是在這里調(diào)用的举农。
1. Android事件分發(fā)是先傳遞到ViewGroup,再由ViewGroup傳遞到View的敞嗡。
2. 在ViewGroup中可以通過(guò)onInterceptTouchEvent方法對(duì)事件傳遞進(jìn)行攔截颁糟,onInterceptTouchEvent方法返回true代表不允許事件繼續(xù)向子View傳遞,返回false代表不對(duì)事件進(jìn)行攔截喉悴,默認(rèn)返回false棱貌。
3. 子View中如果將傳遞的事件消費(fèi)掉,ViewGroup中將無(wú)法接收到任何事件箕肃。
http://blog.csdn.net/guolin_blog/article/details/9097463
Q:ansynctask原理
onPreExecute婚脱、doInBackground、onProgressUpdate勺像、onPostExecute
一個(gè)SerialExecutor ArrayDeque 隊(duì)列管理線程
在doInBackground()方法中調(diào)用publishProgress()方法才可以從子線程切換到UI線程障贸,從而完成對(duì)UI元素的更新操作。其實(shí)也沒(méi)有什么神秘的咏删,因?yàn)檎f(shuō)到底惹想,AsyncTask也是使用的異步消息處理機(jī)制,只是做了非常好的封裝而已督函。
因此在3.0版本中AsyncTask的改動(dòng)還是挺大的嘀粱,在3.0之前的AsyncTask可以同時(shí)有5個(gè)任務(wù)在執(zhí)行,而3.0之后的AsyncTask同時(shí)只能有1個(gè)任務(wù)在執(zhí)行辰狡。為什么升級(jí)之后可以同時(shí)執(zhí)行的任務(wù)數(shù)反而變少了呢锋叨?這是因?yàn)楦潞蟮腁syncTask已變得更加靈活,如果不想使用默認(rèn)的線程池宛篇,還可以自由地進(jìn)行配置娃磺。
http://blog.csdn.net/guolin_blog/article/details/11711405
Q:fragment、activity
getActivity 解決通信問(wèn)題
1.獲取到FragmentManager叫倍,在Activity中可以直接通過(guò)getFragmentManager得到偷卧。
2.開(kāi)啟一個(gè)事務(wù),通過(guò)調(diào)用beginTransaction方法開(kāi)啟吆倦。
3.向容器內(nèi)加入Fragment听诸,一般使用replace方法實(shí)現(xiàn),需要傳入容器的id和Fragment的實(shí)例蚕泽。
4.提交事務(wù)晌梨,調(diào)用commit方法提交。
http://blog.csdn.net/guolin_blog/article/details/8881711
Q: Task stack,Activity, 進(jìn)程仔蝌,及應(yīng)用的理解
返回棧是一個(gè)典型的后進(jìn)先出(last in, first out)的數(shù)據(jù)結(jié)構(gòu)
alwaysRetainTaskState
如果將最底層的那個(gè)Activity的這個(gè)屬性設(shè)置為true泛领,那么上面所描述的默認(rèn)行為就將不會(huì)發(fā)生,任務(wù)中所有的Activity即使過(guò)了很長(zhǎng)一段時(shí)間之后仍然會(huì)被繼續(xù)保留敛惊。
clearTaskOnLaunch
如果將最底層的那個(gè)Activity的這個(gè)屬性設(shè)置為true渊鞋,那么只要用戶(hù)離開(kāi)了當(dāng)前任務(wù),再次返回的時(shí)候就會(huì)將最底層Activity之上的所有其它Activity全部清除掉豆混。簡(jiǎn)單來(lái)講篓像,就是一種和alwaysRetainTaskState完全相反的工作模式,它保證每次返回任務(wù)的時(shí)候都會(huì)是一種初始化狀態(tài)皿伺,即使用戶(hù)僅僅離開(kāi)了很短的一段時(shí)間。
finishOnTaskLaunch
這個(gè)屬性和clearTaskOnLaunch是比較類(lèi)似的盒粮,不過(guò)它不是作用于整個(gè)任務(wù)上的鸵鸥,而是作用于單個(gè)Activity上。如果某個(gè)Activity將這個(gè)屬性設(shè)置成true丹皱,那么用戶(hù)一旦離開(kāi)了當(dāng)前任務(wù)妒穴,再次返回時(shí)這個(gè)Activity就會(huì)被清除掉。
http://www.cnblogs.com/hanyonglu/archive/2012/04/12/2443262.html
Q:Handler機(jī)制
是在主線程中可以直接創(chuàng)建Handler對(duì)象摊崭,而在子線程中需要先調(diào)用Looper.prepare()才能創(chuàng)建Handler對(duì)象讼油。
http://blog.csdn.net/guolin_blog/article/details/9991569
Q:ui性能優(yōu)化 viewStub
減少布局層次,Listview holder機(jī)制呢簸,ViewStub懶加載模式
Q: Bitmap圖片加載
我們?cè)诰帉?xiě)Android程序的時(shí)候經(jīng)常要用到許多圖片矮台,不同圖片總是會(huì)有不同的形狀、不同的大小根时,但在大多數(shù)情況下瘦赫,這些圖片都會(huì)大于我們程序所需要的大小。比如說(shuō)系統(tǒng)圖片庫(kù)里展示的圖片大都是用手機(jī)攝像頭拍出來(lái)的蛤迎,這些圖片的分辨率會(huì)比我們手機(jī)屏幕的分辨率高得多确虱。大家應(yīng)該知道,我們編寫(xiě)的應(yīng)用程序都是有一定內(nèi)存限制的替裆,程序占用了過(guò)高的內(nèi)存就容易出現(xiàn)OOM(OutOfMemory)異常校辩。我們可以通過(guò)下面的代碼看出每個(gè)應(yīng)用程序最高可用內(nèi)存是多少。
http://blog.csdn.net/guolin_blog/article/details/9316683
Q:service啟動(dòng)方式以及區(qū)別
Context.startService():Service會(huì)經(jīng)歷onCreate -> onStart(如果Service還沒(méi)有運(yùn)行辆童,則android先調(diào)用onCreate()然后調(diào)用onStart()宜咒;如果Service已經(jīng)運(yùn)行,則只調(diào)用onStart()胸遇,所以一個(gè)Service的onStart方法可能會(huì)重復(fù)調(diào)用多次 )荧呐;stopService的時(shí)候直接onDestroy,如果是調(diào)用者自己直接退出而沒(méi)有調(diào)用stopService的話,Service會(huì)一直在后臺(tái)運(yùn)行倍阐。該Service的調(diào)用者再啟動(dòng)起來(lái)后可以通過(guò)stopService關(guān)閉Service概疆。 注意,多次調(diào)用Context.startservice()不會(huì)嵌套(即使會(huì)有相應(yīng)的onStart()方法被調(diào)用)峰搪,所以無(wú)論同一個(gè)服務(wù)被啟動(dòng)了多少次岔冀,一旦調(diào)用Context.stopService()或者stopSelf(),他都會(huì)被停止概耻。補(bǔ)充說(shuō)明:傳遞給startService()的Intent對(duì)象會(huì)傳遞給onStart()方法使套。調(diào)用順序?yàn)椋簅nCreate --> onStart(可多次調(diào)用) --> onDestroy。
Context.bindService():Service會(huì)經(jīng)歷onCreate() -> onBind()鞠柄,onBind將返回給客戶(hù)端一個(gè)IBind接口實(shí)例侦高,IBind允許客戶(hù)端回調(diào)服務(wù)的方法,比如得到Service運(yùn)行的狀態(tài)或其他操作厌杜。這個(gè)時(shí)候把調(diào)用者(Context奉呛,例如Activity)會(huì)和Service綁定在一起,Context退出了夯尽,Srevice就會(huì)調(diào)用onUnbind -> onDestroyed相應(yīng)退出瞧壮,所謂綁定在一起就共存亡了 。
補(bǔ)充說(shuō)明:傳遞給bindService()的Intent對(duì)象會(huì)傳遞給onBind()匙握,傳遞給unbindService()的Intent對(duì)象會(huì)傳遞給onUnbind()方法咆槽。 調(diào)用順序?yàn)椋簅nCreate --> onBind(只一次,不可多次綁定) --> onUnbind --> onDestory圈纺。
onStartCommand
START_STICKY:如果service進(jìn)程被kill掉秦忿,保留service的狀態(tài)為開(kāi)始狀態(tài),但不保留遞送的intent對(duì)象赠堵。隨后系統(tǒng)會(huì)嘗試重新創(chuàng)建service小渊,由于服務(wù)狀態(tài)為開(kāi)始狀態(tài),所以創(chuàng)建服務(wù)后一定會(huì)調(diào)用onStartCommand(Intent,int,int)方法茫叭。如果在此期間沒(méi)有任何啟動(dòng)命令被傳遞到service酬屉,那么參數(shù)Intent將為null.
START_NOT_STICKY:“非粘性的”。使用這個(gè)返回值時(shí)揍愁,如果在執(zhí)行完onStartCommand后呐萨,服務(wù)被異常kill掉,系統(tǒng)不會(huì)自動(dòng)重啟該服務(wù)莽囤。
START_REDELIVER_INTENT:重傳Intent谬擦。使用這個(gè)返回值時(shí),如果在執(zhí)行完onStartCommand后朽缎,服務(wù)被異常kill掉惨远,系統(tǒng)會(huì)自動(dòng)重啟該服務(wù)谜悟。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保證服務(wù)被kill后一定能重啟北秽。
Q:xml/json 解析方式
SAX,DOM.XMLParser
JSON JackJson Gson
Q:csv文件讀取接口設(shè)計(jì)
http://developer.51cto.com/art/201104/253059.htm
Q:ANR問(wèn)題
1. KeyDispatchTimeout(5 seconds) --主要類(lèi)型按鍵或觸摸事件在特定時(shí)間內(nèi)無(wú)響應(yīng)
2. BroadcastTimeout(10 seconds) --BroadcastReceiver在特定時(shí)間內(nèi)無(wú)法處理完成
3. ServiceTimeout(20 seconds) --小概率類(lèi)型 Service在特定的時(shí)間內(nèi)無(wú)法處理完成
1. UI線程盡量只做跟UI相關(guān)的工作
2. 耗時(shí)的工作(比如數(shù)據(jù)庫(kù)操作葡幸,I/O,連接網(wǎng)絡(luò)或者別的有可能阻礙UI線程的操作)把它放入單獨(dú)的線程處理
3. 盡量用Handler來(lái)處理UIthread和別的thread之間的交互
http://www.cnblogs.com/purediy/p/3225060.html
Q:Drawable有哪些
http://blog.csdn.net/ouyang_peng/article/details/8800743
Q:ImageView: scaleType
ScaleType.CENTER
按圖片的原來(lái)size居中顯示贺氓,當(dāng)圖片長(zhǎng)/寬超過(guò)View的長(zhǎng)/寬蔚叨,則截取圖片的居中部分顯示
ScaleType.CENTER_CROP);
按比例擴(kuò)大圖片的size居中顯示,使得圖片長(zhǎng)(寬)等于或大于View的長(zhǎng)(寬)
ScaleType.CENTER_INSIDE);
將圖片的內(nèi)容完整居中顯示辙培,通過(guò)按比例縮小或原來(lái)的size使得圖片長(zhǎng)/寬等于或小于View的長(zhǎng)/寬
ScaleType.FIT_CENTER);
把圖片按比例擴(kuò)大/縮小到View的寬度蔑水,居中顯示
FIT_START, FIT_END在圖片縮放效果上與FIT_CENTER一樣,只是顯示的位置不同扬蕊,F(xiàn)IT_START是置于頂部搀别,F(xiàn)IT_CENTER居中,F(xiàn)IT_END置于底部厨相。
FIT_XY
不按比例縮放圖片领曼,目標(biāo)是把圖片塞滿(mǎn)整個(gè)View。
Q: 硬件加速
http://zuiniuwang.blog.51cto.com/3709988/721798
Q:版本演進(jìn)蛮穿、兼容,版本的差異毁渗,support-v4/7包践磅,compat包
啟用硬件加速的最簡(jiǎn)單方法就是為整個(gè)系統(tǒng)打開(kāi)硬件加速的全局設(shè)置。如果你的程序是標(biāo)準(zhǔn)View或者是Drawable 則硬件加速的全局設(shè)這并不會(huì)造成不良的影響灸异。然而硬件加速并不支持所有2D畫(huà)的操作府适,所以開(kāi)啟硬件加速可能會(huì)對(duì)使用自定義組件的應(yīng)用程序造成影響,問(wèn)題常常表現(xiàn)在不可見(jiàn)的元素異常和錯(cuò)誤的像素渲染肺樟,為了解決這個(gè)問(wèn)題Android可以讓你選擇啟動(dòng)或者禁用以下級(jí)別的硬件加速:Application Activity Window 和 View 檐春。
http://blog.csdn.net/uniquerhythm/article/details/12570381
Android Support v4 是最早(2011年4月份)實(shí)現(xiàn)的庫(kù)。用在Android1.6 (API lever 4)或者更高版本之上么伯。它包含了相對(duì)V4, V13大的多的功能疟暖。
例如:Fragment,NotificationCompat田柔,LoadBroadcastManager俐巴,ViewPager,PageTabAtrip硬爆,Loader欣舵,F(xiàn)ileProvider 等。
Android Support v7: 這個(gè)包是為了考慮Android2.1(API level 7) 及以上版本而設(shè)計(jì)的缀磕,但是v7是要依賴(lài)v4這個(gè)包的缘圈,也就是如果要使用劣光,兩個(gè)包得同時(shí)引用。v7支持了Action Bar
Android Support v13:這個(gè)包的設(shè)計(jì)是為了android 3.2及更高版本的糟把,一般我們都不常用绢涡,平板開(kāi)發(fā)中能用到
http://blog.csdn.net/qq530918474/article/details/39996311
Q:android項(xiàng)目build過(guò)程
第一步:打包資源文件,生成R.java文件
【輸入】Resource文件(就是工程中res中的文件)糊饱、Assets文件(相當(dāng)于另外一種資源垂寥,這種資源Android系統(tǒng)并不像對(duì)res中的文件那樣優(yōu)化它)、AndroidManifest.xml文件(包名就是從這里讀取的另锋,因?yàn)樯蒖.java文件需要包名)滞项、Android基礎(chǔ)類(lèi)庫(kù)(Android.jar文件)
【輸出】打包好的資源(一般在Android工程的bin目錄可以看到一個(gè)叫resources.ap_的文件就是它了)、R.java文件(在gen目錄中夭坪,大家應(yīng)該很熟悉了)
【工具】aapt工具文判,它的路徑在${ANDROID_SDK_HOME}/platform-tools/aapt(如果你使用的是Windows系統(tǒng),按慣例路徑應(yīng)該這樣寫(xiě):%ANDROID_SDK_HOME%\platform-tools\aapt.exe室梅,下同)戏仓。
第二步:處理AIDL文件,生成對(duì)應(yīng)的.java文件(當(dāng)然亡鼠,有很多工程沒(méi)有用到AIDL赏殃,那這個(gè)過(guò)程就可以省了)
【輸入】源碼文件、aidl文件间涵、framework.aidl文件
【輸出】對(duì)應(yīng)的.java文件
【工具】aidl工具
第三步:編譯Java文件仁热,生成對(duì)應(yīng)的.class文件
【輸入】源碼文件(包括R.java和AIDL生成的.java文件)、庫(kù)文件(.jar文件)
【輸出】.class文件
【工具】javac工具
第四步:把.class文件轉(zhuǎn)化成Davik VM支持的.dex文件
【輸入】 .class文件(包括Aidl生成.class文件勾哩,R生成的.class文件抗蠢,源文件生成的.class文件),庫(kù)文件(.jar文件)
【輸出】.dex文件
【工具】javac工具
第五步:打包生成未簽名的.apk文件
【輸入】打包后的資源文件思劳、打包后類(lèi)文件(.dex文件)迅矛、libs文件(包括.so文件,當(dāng)然很多工程都沒(méi)有這樣的文件潜叛,如果你不使用C/C++開(kāi)發(fā)的話)
【輸出】未簽名的.apk文件
【工具】apkbuilder工具
第六步:對(duì)未簽名.apk文件進(jìn)行簽名
【輸入】未簽名的.apk文件
【輸出】簽名的.apk文件
【工具】jarsigner
第七步:對(duì)簽名后的.apk文件進(jìn)行對(duì)齊處理(不進(jìn)行對(duì)齊處理是不能發(fā)布到Google Market的)
【輸入】簽名后的.apk文件
【輸出】對(duì)齊后的.apk文件
【工具】zipalign工具
Q:lint秽褒、hierarchyviewer、mat钠导、findbugs震嫉、traceview、proguard工具
Lint 代碼優(yōu)化工具牡属,去除無(wú)效的資源文件 Android Tools
Hierarchyviewer UI優(yōu)化工具
Mat 內(nèi)存分析工具
findbugs可用于對(duì)java代碼進(jìn)行靜態(tài)檢查票堵,檢查bug類(lèi)型包括:
Bad practice 壞的實(shí)踐:常見(jiàn)代碼錯(cuò)誤,序列化錯(cuò)誤逮栅,用于靜態(tài)代碼檢查時(shí)進(jìn)行缺陷模式匹配
Correctness 可能導(dǎo)致錯(cuò)誤的代碼悴势,如空指針引用等
國(guó)際化相關(guān)問(wèn)題:如錯(cuò)誤的字符串轉(zhuǎn)換
可能受到的惡意攻擊窗宇,如訪問(wèn)權(quán)限修飾符的定義等
多線程的正確性:如多線程編程時(shí)常見(jiàn)的同步,線程調(diào)度問(wèn)題特纤。
運(yùn)行時(shí)性能問(wèn)題:如由變量定義军俊,方法調(diào)用導(dǎo)致的代碼低效問(wèn)題。
traceview性能調(diào)優(yōu)工具TraceView的使用及通過(guò)其確定性能點(diǎn)捧存。
Proguard 防反編譯粪躬、混淆文件