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