美團(tuán)實(shí)習(xí)| 周記(二)

本周知識(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ā)聵,那就是『要么牛逼,要么滾蛋』,小菜鳥不禁渾身顫抖,所以...共勉吧!

隨手一拍的工作大樓
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容