本周知識清單:
- 開發(fā)小tips
- Java基礎(chǔ)之集合類
- 一些小感悟
1.開發(fā)小tips
看項(xiàng)目代碼的時候發(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
表示第一個字符串、%2$d
表示第二個整數(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ù)忌怎,又稱容器類籍滴。
- 用于存儲數(shù)量不等的對象,并可實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)榴啸,如棧孽惰、隊(duì)列等
- 用于保存具有映射關(guān)系的關(guān)聯(lián)數(shù)組
和數(shù)組的區(qū)別:
- 數(shù)組元素可以是基本類型,也可以是對象
- 集合元素只能是對象
b.體系結(jié)構(gòu):大致可分為Set鸥印、List勋功、Queue 和Map四種體系。
- Set:代表無序库说、不可重復(fù)的集合
- List:代表有序狂鞋、可重復(fù)的集合
- Map:代表具有映射關(guān)系的集合
- Queue:代表一種隊(duì)列集合
下圖給出Java集合類之間的關(guān)系。
c.篇幅有限潜的,主要介紹上圖中紅色標(biāo)注的幾個類/接口(需要了解源碼請點(diǎn)擊類名)骚揍。
(1)Collection接口:
- 是List、Set和Queue接口的父接口啰挪,該接口中定義的方法可操作以上三種集合信不。
- 常用方法:添加對象
add()
、刪除對象remove()
亡呵、清空容器clear()
抽活、判斷容器是否為空isEmpty()
等。
(2)List系列:有序锰什、可重復(fù)
-
ArrayList特點(diǎn):
- 底層結(jié)構(gòu)是數(shù)組下硕,可用索引實(shí)現(xiàn)快速查找
- 非線程安全丁逝,建議在單線程中才使用ArrayList,而在多線程中可以選擇Vector或者CopyOnWriteArrayList
- 是動態(tài)數(shù)組卵牍,相比于數(shù)組容量可實(shí)現(xiàn)動態(tài)增長果港。默認(rèn)初始容量為10,每次擴(kuò)容為原來的1.5倍
-
LinkedList特點(diǎn):
- 底層結(jié)構(gòu)是鏈表糊昙,增刪速度快
- 非線程安全
- 是一個雙向循環(huán)鏈表辛掠,也可以被當(dāng)作堆棧、隊(duì)列或雙端隊(duì)列
- 包含一個非常重要的內(nèi)部類Entry释牺,是雙向鏈表節(jié)點(diǎn)所對應(yīng)的數(shù)據(jù)結(jié)構(gòu)萝衩,其包括的屬性有『當(dāng)前節(jié)點(diǎn)所包含的值』、『上一個節(jié)點(diǎn)』没咙、『下一個節(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算法來存儲集合中的元素捉捅,有良好的存取和查找性能
- 非同步撤防,多線程并發(fā)要注意線程同問題
- 集合元素值可為null
- 通過
equal()
判斷兩個元素是否相等,并兩個元素的hashCode()
返回值也相等
-
TreeSet特點(diǎn):
- 是SortedSet接口的實(shí)現(xiàn)類棒口,根據(jù)元素實(shí)際值的大小進(jìn)行排序
- 采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)來存儲集合元素
- 非同步
- 支持兩種排序方法:自然排序(默認(rèn)情況)和定制排序寄月。前者通過實(shí)現(xiàn)Comparable接口中的
compareTo()
比較兩個元素之間大小關(guān)系,然后按升序排列无牵;后者通過實(shí)現(xiàn)Comparator接口中的compare()
比較兩個元素之間大小關(guān)系漾肮,實(shí)現(xiàn)定制排列。
(4)Iterator接口:
- 用于遍歷Collection中的集合中的元素茎毁,又稱迭代器克懊。本身并不提供盛裝對象的能力。
- 必須依賴于Collection對象充岛,獨(dú)立存在無意義保檐。
- 常用方法:判斷集合是否還有下一個元素
hasNext()
耕蝉,可通過remove()
刪除集合中上一次next()
返回的集合元素崔梗。
(5)Map接口:
- 保存具有映射關(guān)系的數(shù)據(jù)。
- Map集合中保存著兩組值垒在,一組用于保存Map中的key蒜魄,一組用于保存Map中的value扔亥。
- key和value可以是任何引用類型的數(shù)據(jù)。
- key不允許重復(fù)谈为,key沒有順序旅挤。可以把key集合看成一個Set集合伞鲫,它們的存儲形式粘茄、子類命名也非常相似。
- value允許重復(fù)秕脓,value通過索引查找柒瓣。可以把value集合看成一個List集合吠架。
- 常用方法:成對添加
put()
和刪除remove()
key-value對芙贫,獲取指定key的valueget()
、判斷是否包含指定keycontainsKey()
和指定valuecontainsValue()
等傍药。
(6)Map系列
-
HashMap特點(diǎn):
- 基于AbstractMap類磺平,實(shí)現(xiàn)了Map、Cloneable(能被克鹿樟伞)拣挪、Serializable(支持序列化)接口,
- 無序
- 非線程安全
- 允許存在一個為null的key和任意個為null的value
- 采用鏈表散列的數(shù)據(jù)結(jié)構(gòu)薛训,即數(shù)組和鏈表的結(jié)合
-
初始容量為16媒吗,填充因子默認(rèn)為0.75,擴(kuò)容時是當(dāng)前容量翻倍乙埃,即2capacity
-
LinkedHashMap特點(diǎn):
- 繼承自HashMap類
- 有序闸英,默認(rèn)為插入順序,還可以是訪問順序
- 非線程安全
- 允許存在一個為null的key和任意個為null的value
- 內(nèi)部通過Entry維護(hù)了一個雙向鏈表介袜,負(fù)責(zé)維護(hù)Map的迭代順序
-
Hashtable特點(diǎn):
- 基于Map接口和Dictionary類
- 無序
- 線程安全甫何,開銷比HashMap大,如果多線程訪問一個Map對象遇伞,使用Hashtable更好
- 不允許使用null作為key和value
- 底層基于哈希表結(jié)構(gòu)
- 初始容量為11辙喂,填充因子默認(rèn)為0.75,擴(kuò)容時是容量翻倍+1鸠珠,即2capacity+1
-
TreeMap特點(diǎn):
- 是SortedMap接口的實(shí)現(xiàn)類
- 有序巍耗,根據(jù)key對節(jié)點(diǎn)進(jìn)行排序
- 支持兩種排序方法:自然排序和定制排序。前者所有key必須實(shí)現(xiàn)Comparable接口且所有key應(yīng)該是一個類的對象渐排;后者通過傳入一個Comparator接口對象負(fù)責(zé)對多有key進(jìn)行排序炬太。
- 非線程安全
- 采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)
推薦閱讀:Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
3.一些小感悟
最近大家都進(jìn)入了白熱化狀態(tài),離項(xiàng)目上線的日子越來越近驯耻,重心也從需求開發(fā)到糾錯改Bug亲族,每個人都變得很謹(jǐn)慎炒考。記得下班最晚的上周五,一大早拿到了測試用例文檔之后霎迫,要對照著用例的每一條每個點(diǎn)斋枢,檢查要求是否合理、運(yùn)行后實(shí)際結(jié)果是否無誤知给。一度以為要周末加班要繼續(xù)搞(雖然我也一直是加班學(xué)習(xí)沒閑著...)瓤帚,好在團(tuán)結(jié)力量大,在提測之前的deadline終于大功告成涩赢。
那天還有個小插曲缘滥,承包了一晚上的笑點(diǎn),就是可愛的田豐前輩谒主,臨提測才發(fā)現(xiàn)頁面UI不對朝扼,就像熱鍋的螞蟻一樣七上八下,在調(diào)試的時候一度抓不上包霎肯,自亂陣腳以為出了大bug擎颖,就在這時,旁邊的楊宇前輩很淡定的把數(shù)據(jù)線從他的電腦拔出來观游,場面可以說很歡樂了搂捧。
自測之后,在測試用例評審會上見到了QA懂缕,之前聽聞公司QA是很嚴(yán)格的允跑,不由得肅然起敬。其實(shí)這和公司價(jià)值觀的其中一點(diǎn)『追求卓越』是分不開的搪柑,非常注重代碼質(zhì)量聋丝,對線上事故也是嚴(yán)肅對待,員工入職的第一天就要研讀CaseStudy工碾,看看之前事業(yè)群研發(fā)曾犯過的錯以及開發(fā)紅線弱睦。
導(dǎo)師前陣子請了陪產(chǎn)假,他的開發(fā)部分也就由我接手了渊额,這兩天組里要進(jìn)行代碼review况木,于我而言算是個大事,畢竟代碼不是自己寫的旬迹。思來想去火惊,覺得用UML圖去刻畫類組成和邏輯實(shí)現(xiàn)流程最好不過了,突然非常感激大三最后一門課程『信息系統(tǒng)分析與設(shè)計(jì)』讓我對UML愛不釋手1伎选(畢竟之前總用PhotoShop...)雖然課上用的是Visio作圖屹耐,不過個人更推薦ProcessOn,交互設(shè)計(jì)上更勝一籌宴倍。
公司里有這樣一句開發(fā)者的信仰流傳在民間张症,簡直振聾發(fā)聵,那就是『要么牛逼鸵贬,要么滾蛋』俗他,小菜鳥不禁渾身顫抖,所以...共勉吧阔逼!