本周知識(shí)清單:
- 開發(fā)小tips
- Java基礎(chǔ)之集合類
- 一些小感悟
1.開發(fā)小tips
看項(xiàng)目代碼的時(shí)候發(fā)現(xiàn)了一些不起眼但覺得蠻實(shí)用的小tips,在實(shí)習(xí)隨筆|周記(一)寫的tools命名空間就是一點(diǎn),可幫助快速預(yù)覽布局展示效果。接下來再提一些小技巧。
a .值得收藏的AS插件 ,另推薦可用Statistic插件統(tǒng)計(jì)項(xiàng)目代碼總行數(shù)、Alibaba Java Coding Guidelines插件幫助規(guī)范代碼。
b.你不知道的TextUtils用法,比如TextUtils.isDigitsOnly(string) 可檢查字符串中是否全是數(shù)字。
c.TextView屬性大全,比如android:drawableXXX系列配合android:drawablePadding 適合在文字左側(cè)放固定大小的圖片。
d.TextView/string.xml冷門小技巧:占位轉(zhuǎn)換符%1$s、%2$d等的用法,其中%1$s表示第一個(gè)字符串、%2$d表示第二個(gè)整數(shù)。使用示例如下:
- 在string.xml中先定義好格式:
<string name="instance">String.xml占位轉(zhuǎn)換符:我叫%1$s,今年%2$d歲了,身高%3$f厘米。</string>
- 代碼實(shí)現(xiàn):
TextView tv=(TextView)findViewById(R.id.tv);
String format = getResources().getString(R.string.instance);
String result= String.format(format ,"minmin", 21 ,164.5);
tv.setText(result);
- 輸出結(jié)果:
String.xml占位轉(zhuǎn)換符:我叫minmin,今年21歲了,身高164.5厘米。
2.Java基礎(chǔ)之集合類
a.作用:負(fù)責(zé)保存和盛裝其他數(shù)據(jù),又稱容器類。
- 用于存儲(chǔ)數(shù)量不等的對(duì)象,并可實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu),如棧、隊(duì)列等
- 用于保存具有映射關(guān)系的關(guān)聯(lián)數(shù)組
和數(shù)組的區(qū)別:
- 數(shù)組元素可以是基本類型,也可以是對(duì)象
- 集合元素只能是對(duì)象
b.體系結(jié)構(gòu):大致可分為Set、List、Queue 和Map四種體系。
- Set:代表無序、不可重復(fù)的集合
- List:代表有序、可重復(fù)的集合
- Map:代表具有映射關(guān)系的集合
- Queue:代表一種隊(duì)列集合
下圖給出Java集合類之間的關(guān)系。
c.篇幅有限,主要介紹上圖中紅色標(biāo)注的幾個(gè)類/接口(需要了解源碼請(qǐng)點(diǎn)擊類名)。
(1)Collection接口:
- 是List、Set和Queue接口的父接口,該接口中定義的方法可操作以上三種集合。
- 常用方法:添加對(duì)象
add()、刪除對(duì)象remove()、清空容器clear()、判斷容器是否為空isEmpty()等。
(2)List系列:有序、可重復(fù)
-
ArrayList特點(diǎn):
- 底層結(jié)構(gòu)是數(shù)組,可用索引實(shí)現(xiàn)快速查找
- 非線程安全,建議在單線程中才使用ArrayList,而在多線程中可以選擇Vector或者CopyOnWriteArrayList
- 是動(dòng)態(tài)數(shù)組,相比于數(shù)組容量可實(shí)現(xiàn)動(dòng)態(tài)增長。默認(rèn)初始容量為10,每次擴(kuò)容為原來的1.5倍
-
LinkedList特點(diǎn):
- 底層結(jié)構(gòu)是鏈表,增刪速度快
- 非線程安全
- 是一個(gè)雙向循環(huán)鏈表,也可以被當(dāng)作堆棧、隊(duì)列或雙端隊(duì)列
- 包含一個(gè)非常重要的內(nèi)部類Entry,是雙向鏈表節(jié)點(diǎn)所對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),其包括的屬性有『當(dāng)前節(jié)點(diǎn)所包含的值』、『上一個(gè)節(jié)點(diǎn)』、『下一個(gè)節(jié)點(diǎn)』
-
Vector特點(diǎn):
- 底層結(jié)構(gòu)是數(shù)組,可用索引實(shí)現(xiàn)快速查找
- 使用了synchronized關(guān)鍵字,是線程安全的,比ArrayList開銷更大,訪問更慢
- 默認(rèn)初始容量為10,默認(rèn)每次擴(kuò)容為原來的2倍,可通過capacityIncrement屬性設(shè)置。
(3)Set系列:無序、不可重復(fù)
-
HashSet特點(diǎn):
- 不能保證元素的排列順序
- 使用Hash算法來存儲(chǔ)集合中的元素,有良好的存取和查找性能
- 非同步,多線程并發(fā)要注意線程同問題
- 集合元素值可為null
- 通過
equal()判斷兩個(gè)元素是否相等,并兩個(gè)元素的hashCode()返回值也相等
-
TreeSet特點(diǎn):
- 是SortedSet接口的實(shí)現(xiàn)類,根據(jù)元素實(shí)際值的大小進(jìn)行排序
- 采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)集合元素
- 非同步
- 支持兩種排序方法:自然排序(默認(rèn)情況)和定制排序。前者通過實(shí)現(xiàn)Comparable接口中的
compareTo()比較兩個(gè)元素之間大小關(guān)系,然后按升序排列;后者通過實(shí)現(xiàn)Comparator接口中的compare()比較兩個(gè)元素之間大小關(guān)系,實(shí)現(xiàn)定制排列。
(4)Iterator接口:
- 用于遍歷Collection中的集合中的元素,又稱迭代器。本身并不提供盛裝對(duì)象的能力。
- 必須依賴于Collection對(duì)象,獨(dú)立存在無意義。
- 常用方法:判斷集合是否還有下一個(gè)元素
hasNext(),可通過remove()刪除集合中上一次next()返回的集合元素。
(5)Map接口:
- 保存具有映射關(guān)系的數(shù)據(jù)。
- Map集合中保存著兩組值,一組用于保存Map中的key,一組用于保存Map中的value。
- key和value可以是任何引用類型的數(shù)據(jù)。
- key不允許重復(fù),key沒有順序。可以把key集合看成一個(gè)Set集合,它們的存儲(chǔ)形式、子類命名也非常相似。
- value允許重復(fù),value通過索引查找。可以把value集合看成一個(gè)List集合。
- 常用方法:成對(duì)添加
put()和刪除remove()key-value對(duì),獲取指定key的valueget()、判斷是否包含指定keycontainsKey()和指定valuecontainsValue()等。
(6)Map系列
-
HashMap特點(diǎn):
- 基于AbstractMap類,實(shí)現(xiàn)了Map、Cloneable(能被克?。?、Serializable(支持序列化)接口,
- 無序
- 非線程安全
- 允許存在一個(gè)為null的key和任意個(gè)為null的value
- 采用鏈表散列的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合
-
初始容量為16,填充因子默認(rèn)為0.75,擴(kuò)容時(shí)是當(dāng)前容量翻倍,即2capacity
HashMap與HashSet對(duì)比
-
LinkedHashMap特點(diǎn):
- 繼承自HashMap類
- 有序,默認(rèn)為插入順序,還可以是訪問順序
- 非線程安全
- 允許存在一個(gè)為null的key和任意個(gè)為null的value
- 內(nèi)部通過Entry維護(hù)了一個(gè)雙向鏈表,負(fù)責(zé)維護(hù)Map的迭代順序
-
Hashtable特點(diǎn):
- 基于Map接口和Dictionary類
- 無序
- 線程安全,開銷比HashMap大,如果多線程訪問一個(gè)Map對(duì)象,使用Hashtable更好
- 不允許使用null作為key和value
- 底層基于哈希表結(jié)構(gòu)
- 初始容量為11,填充因子默認(rèn)為0.75,擴(kuò)容時(shí)是容量翻倍+1,即2capacity+1
-
TreeMap特點(diǎn):
- 是SortedMap接口的實(shí)現(xiàn)類
- 有序,根據(jù)key對(duì)節(jié)點(diǎn)進(jìn)行排序
- 支持兩種排序方法:自然排序和定制排序。前者所有key必須實(shí)現(xiàn)Comparable接口且所有key應(yīng)該是一個(gè)類的對(duì)象;后者通過傳入一個(gè)Comparator接口對(duì)象負(fù)責(zé)對(duì)多有key進(jìn)行排序。
- 非線程安全
- 采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)
推薦閱讀:Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
3.一些小感悟
最近大家都進(jìn)入了白熱化狀態(tài),離項(xiàng)目上線的日子越來越近,重心也從需求開發(fā)到糾錯(cuò)改Bug,每個(gè)人都變得很謹(jǐn)慎。記得下班最晚的上周五,一大早拿到了測(cè)試用例文檔之后,要對(duì)照著用例的每一條每個(gè)點(diǎn),檢查要求是否合理、運(yùn)行后實(shí)際結(jié)果是否無誤。一度以為要周末加班要繼續(xù)搞(雖然我也一直是加班學(xué)習(xí)沒閑著...),好在團(tuán)結(jié)力量大,在提測(cè)之前的deadline終于大功告成。
那天還有個(gè)小插曲,承包了一晚上的笑點(diǎn),就是可愛的田豐前輩,臨提測(cè)才發(fā)現(xiàn)頁面UI不對(duì),就像熱鍋的螞蟻一樣七上八下,在調(diào)試的時(shí)候一度抓不上包,自亂陣腳以為出了大bug,就在這時(shí),旁邊的楊宇前輩很淡定的把數(shù)據(jù)線從他的電腦拔出來,場(chǎng)面可以說很歡樂了。
自測(cè)之后,在測(cè)試用例評(píng)審會(huì)上見到了QA,之前聽聞公司QA是很嚴(yán)格的,不由得肅然起敬。其實(shí)這和公司價(jià)值觀的其中一點(diǎn)『追求卓越』是分不開的,非常注重代碼質(zhì)量,對(duì)線上事故也是嚴(yán)肅對(duì)待,員工入職的第一天就要研讀CaseStudy,看看之前事業(yè)群研發(fā)曾犯過的錯(cuò)以及開發(fā)紅線。
導(dǎo)師前陣子請(qǐng)了陪產(chǎn)假,他的開發(fā)部分也就由我接手了,這兩天組里要進(jìn)行代碼review,于我而言算是個(gè)大事,畢竟代碼不是自己寫的。思來想去,覺得用UML圖去刻畫類組成和邏輯實(shí)現(xiàn)流程最好不過了,突然非常感激大三最后一門課程『信息系統(tǒng)分析與設(shè)計(jì)』讓我對(duì)UML愛不釋手?。ó吘怪翱傆肞hotoShop...)雖然課上用的是Visio作圖,不過個(gè)人更推薦ProcessOn,交互設(shè)計(jì)上更勝一籌。
公司里有這樣一句開發(fā)者的信仰流傳在民間,簡直振聾發(fā)聵,那就是『要么牛逼,要么滾蛋』,小菜鳥不禁渾身顫抖,所以...共勉吧!