以下資料是在學(xué)習(xí)中總結(jié)出來的家卖,希望對(duì)你有所幫助寿谴。如果需要請(qǐng)轉(zhuǎn)載捕发,謝謝疏旨。
1. StringBuffer 線程安全,StringBuilder 線程不安全 效率稍高些
集(Set):集里的對(duì)象不按任何特定的方式排列扎酷,按索引值來操作數(shù)據(jù)檐涝,不能有重復(fù)的元素
列表(List):序列中的對(duì)象以線性方式存儲(chǔ),按索引值來操作數(shù)據(jù)法挨,可以有重復(fù)的元素
映射(Map):映射的每一項(xiàng)為“名稱—數(shù)值”對(duì)谁榜,名稱不可以重復(fù),值可以重復(fù)凡纳,一個(gè)名稱對(duì)應(yīng)一個(gè)唯一的值
顯示指定集合類型:不經(jīng)歷裝箱過程窃植。
【Java學(xué)習(xí)資料免費(fèi)分享微信:tangniu520666,備注“4”荐糜。需要的可以留意一下】
Collection resulte = dao.retrieveByClause(TaskVO.class, sql);
轉(zhuǎn)換為數(shù)組時(shí)巷怜,明確指定返回?cái)?shù)組的大小
return result.toArray(new TaskVO[result.size()]);
數(shù)組不能強(qiáng)制轉(zhuǎn)型:
String[] s= (String[])list.toArray();——錯(cuò)誤
String[] s= (String[])list.toArray(new String[list.size()]);——正確
迭代器是按次序一個(gè)一個(gè)地獲取集合中所有的對(duì)象,是訪問集合中每個(gè)元素的標(biāo)準(zhǔn)機(jī)制暴氏。
迭代器的創(chuàng)建:Collection接口的iterator()方法返回一個(gè)Iterator
Iterator it=test.iterator(); //將test集合對(duì)象轉(zhuǎn)為迭代器
迭代器的常用方法:
hasNext() //判斷迭代器中是否有下一個(gè)元素
next() //返回迭代的下一個(gè)元素
Remove() //將迭代器新返回的元素刪除
The Iterator interface is shown below: public interface Iterator {
boolean hasNext();
Object next();
void remove(); // Optional
}
可以認(rèn)為迭代器是指向兩個(gè)元素之間的位置.
在調(diào)用remove()方法的時(shí)候, 必須調(diào)用一次next()方法.
remove()方法實(shí)際上是刪除上一個(gè)返回的元素.
List常用方法:
void add(int index, Object element) :添加對(duì)象element到位置index上
boolean addAll(int index, Collection collection) :在index位置后添加容器collection中所有的元素
Object get(int index) :取出下標(biāo)為index的位置的元素
int indexOf(Object element) :查找對(duì)象element 在List中第一次出現(xiàn)的位置
int lastIndexOf(Object element) :查找對(duì)象element 在List中最后出現(xiàn)的位置
Object remove(int index) :刪除index位置上的元素
ListIterator listIterator(int startIndex) :返回一個(gè)ListIterator 跌代器延塑,開始位置為startIndex
List subList(int fromIndex, int toIndex) :返回一個(gè)子列表List ,元素存放為從 fromIndex 到toIndex之前的一個(gè)元素
ArrayList:我們可以將其看作是能夠自動(dòng)增長(zhǎng)容量的數(shù)組。
利用ArrayList的toArray()返回一個(gè)數(shù)組答渔。
Arrays.asList()返回一個(gè)列表关带。
迭代器(Iterator) 給我們提供了一種通用的方式來訪問集合中的元素。
View方式:
一種是測(cè)量迭代元素的時(shí)間:
另一種測(cè)量使用toArray調(diào)用創(chuàng)建數(shù)組:
最后得到結(jié)果:
使用toArray調(diào)用中創(chuàng)建的數(shù)組迭代元素的速度要比使用iterator的速度大約快30%到60%沼撕。
但如果將使用toArray方法創(chuàng)建數(shù)組的時(shí)間開銷含在內(nèi)宋雏。則使用iterator實(shí)際上要快10%到20%芜飘,所以我們盡量不要?jiǎng)?chuàng)建中間數(shù)組。而使用迭代的方式磨总。
ArrayList自動(dòng)擴(kuò)充機(jī)制
實(shí)現(xiàn)機(jī)制:ArrayList.ensureCapacity(int minCapacity)
首先得到當(dāng)前elementData 屬性的長(zhǎng)度oldCapacity燃箭。
然后通過判斷oldCapacity和minCapacity參數(shù)誰大來決定是否需要擴(kuò)容, 如果minCapacity大于
oldCapacity,那么我們就對(duì)當(dāng)前的List對(duì)象進(jìn)行擴(kuò)容舍败。
擴(kuò)容的的策略為:取(oldCapacity * 3)/2 + 1和minCapacity之間更大的那個(gè)招狸。然后使用數(shù)組拷
貝的方法,把以前存放的數(shù)據(jù)轉(zhuǎn)移到新的數(shù)組對(duì)象中
如果minCapacity不大于oldCapacity那么就不進(jìn)行擴(kuò)容邻薯。
LinkedList
LinkedList是采用雙向循環(huán)鏈表實(shí)現(xiàn)的裙戏。
利用LinkedList實(shí)現(xiàn)棧(stack)、隊(duì)列(queue)厕诡、雙向隊(duì)列(double-ended queue )累榜。
它具有方法addFirst()、addLast()灵嫌、getFirst()壹罚、getLast()、removeFirst()寿羞、removeLast()等猖凛。
用LinkedList實(shí)現(xiàn)隊(duì)列:
隊(duì)列(Queue)是限定所有的插入只能在表的一端進(jìn)行,而所有的刪除都在表的另一端進(jìn)行的線性表绪穆。
表中允許插入的一端稱為隊(duì)尾(Rear)辨泳,允許刪除的一端稱為隊(duì)頭(Front)。
隊(duì)列的操作是按先進(jìn)先出(FIFO)的原則進(jìn)行的玖院。
隊(duì)列的物理存儲(chǔ)可以用順序存儲(chǔ)結(jié)構(gòu)菠红,也可以用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。
用LinkedList實(shí)現(xiàn)棧:
棧(Stack)也是一種特殊的線性表难菌,是一種后進(jìn)先出(LIFO)的結(jié)構(gòu)试溯。
棧是限定僅在表尾進(jìn)行插入和刪除運(yùn)算的線性表,表尾稱為棧頂(top)郊酒,表頭稱為棧底(bottom)遇绞。
棧的物理存儲(chǔ)可以用順序存儲(chǔ)結(jié)構(gòu),也可以用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)猎塞。
ArrayList和LinkedList的比較:
ArrayList底層采用數(shù)組完成试读,而LinkedList則是以一般的雙向鏈表(double-linked list)完成杠纵,其內(nèi)每個(gè)對(duì)象除了數(shù)據(jù)本身外荠耽,還有兩個(gè) 引用,分別指向前一個(gè)元素和后一個(gè)元素比藻。
如果我們經(jīng)常在List的開始處增加元素铝量,或者在List中進(jìn)行插入和刪除操作倘屹,我們應(yīng)該使用LinkedList,否則的話慢叨,使用ArrayList將更加快速纽匙。
小結(jié):
集合是一個(gè)保存其他對(duì)象的對(duì)象
Collection接口除了實(shí)現(xiàn)映射的集合類之外的所有集合類定義了一些方法
List集合類型描述了一種按位置存儲(chǔ)數(shù)據(jù)的對(duì)象,有序的拍谐。
ArrayList是一種在內(nèi)存連續(xù)區(qū)域 中存儲(chǔ)數(shù)據(jù)的通用數(shù)組
編碼習(xí)慣:
面向接口的編程,盡可能降低代碼變化率:
List lst = new ArrayList();
盡量避免創(chuàng)建不必要的對(duì)象:vo應(yīng)在if判斷成立時(shí)創(chuàng)建
TaskReportVO reportvos = new TaskReportVO();
if(i > 0){
lstAllVos.add(reportvos); }
盡量避免同時(shí)遍歷和刪除集合烛缔。因?yàn)檫@會(huì)改變集合的大小轩拨;
for( Iterator iter = ComList.iterator(); iter.hasNext();){
ComType com = iter.next();
if ( !com.getName().contains("abc")){
ComList.remove(com);}
}
推薦:
for( Iterator iter = ComList.iterator(); iter.hasNext();){
ComType com = iter.next();
if ( !com.getName().contains("abc")){
iter.remove(com); }
預(yù)估集合內(nèi)持有對(duì)象的大小践瓷,不能持有大量對(duì)象,占據(jù)內(nèi)存:
List lst = new ArrayList();
無限制的在lst中add element亡蓉,勢(shì)必會(huì)造成lst占用內(nèi)存過高晕翠。造成內(nèi)存溢出
Map接口:
集合框架的第二類接口樹。
它提供了一組鍵值的映射砍濒。其中存儲(chǔ)的每個(gè)對(duì)象都有一個(gè)相應(yīng)的關(guān)鍵字(key)淋肾,關(guān)鍵字決定了對(duì)象在Map中的存儲(chǔ)位置。
關(guān)鍵字應(yīng)該是唯一的爸邢,每個(gè)key 只能映射一個(gè)value樊卓。
常用方法:
Object put(Object key,Object value):用來存放一個(gè)鍵-值對(duì)Map中
Object remove(Object key):根據(jù)key(鍵),移除鍵-值對(duì)杠河,并將值返回
void putAll(Map mapping) :將另外一個(gè)Map中的元素存入當(dāng)前的Map中
void clear() :清空當(dāng)前Map中的元素
Object get(Object key) :根據(jù)key(鍵)取得對(duì)應(yīng)的值
boolean containsKey(Object key) :判斷Map中是否存在某鍵(key)
boolean containsValue(Object value):判斷Map中是否存在某值(value)
public Set keySet() :返回所有的鍵(key)简识,并使用Set容器存放
public Collection values() :返回所有的值(Value),并使用Collection存放
public Set entrySet() :返回一個(gè)實(shí)現(xiàn) Map.Entry 接口的元素 Set
HashMap:
Map 主要用于存儲(chǔ)鍵(key)值(value)對(duì)感猛,根據(jù)鍵得到值七扰,因此鍵不允許重復(fù),但允許值重復(fù)。
HashMap 是一個(gè)最常用的Map,它根據(jù)鍵的HashCode 值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值陪白,具有很快的訪問速度颈走。
HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為 Null;
HashMap不支持線程的同步,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫HashMap;可能會(huì)導(dǎo)致數(shù)據(jù)的不一致咱士。如果需要同步立由,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力。
HashMap實(shí)現(xiàn)原理---散列
Hash哈希算法的意義在于提供了一種快速存取數(shù)據(jù)的方法,它用一種算法建立鍵值與真實(shí)值之間的對(duì)應(yīng)關(guān)系序厉。散列表又稱為哈希表锐膜。散列表算法的基本思想是:以結(jié)點(diǎn)的關(guān)鍵字為自變量,通過一定的函數(shù)關(guān)系(散列函數(shù))計(jì)算出對(duì)應(yīng)的函數(shù)值弛房,以這個(gè)值作為該結(jié)點(diǎn)存儲(chǔ)在散列表中地址道盏。
當(dāng)散列表中的元素存放太滿,就必須進(jìn)行再散列,將產(chǎn)生一個(gè)新的散列表荷逞,所有元素存放到新的散列表中媒咳,原先的散列表將被刪除。在Java語言中种远,通過負(fù)載因子(load factor)來決定何時(shí)對(duì)散列表進(jìn)行再散列涩澡。例如:如果負(fù)載因子0.75,當(dāng)散列表中已經(jīng)有75%位置已經(jīng)放滿坠敷,那么將進(jìn)行再散列妙同。
負(fù)載因子越高(越接近1.0),內(nèi)存的使用效率越高膝迎,元素的尋找時(shí)間越長(zhǎng)渐溶。負(fù)載因子越低(越接近0.0),元素的尋找時(shí)間越短弄抬,內(nèi)存浪費(fèi)越多茎辐。
何時(shí)需重寫equals?
當(dāng)一個(gè)類有自己特有的“邏輯相等”概念(不同于對(duì)象身份的概念)掂恕;
Object類僅僅提供了一個(gè)對(duì)引用的比較拖陆,如果兩個(gè)引用不是同一個(gè)那就返回false,這是無法滿足大多數(shù)對(duì)象比較的需要的懊亡,所以要覆蓋依啰;
使用==操作符檢查實(shí)參是否為指向?qū)ο蟮囊谩?/p>
使用instanceof操作符檢查實(shí)參是否為正確的類型
把實(shí)參轉(zhuǎn)換到正確的類型;
對(duì)于該類中每一個(gè)“關(guān)鍵”域店枣,檢查實(shí)參中的域與當(dāng)前對(duì)象中對(duì)應(yīng)的域值是否匹 配速警。對(duì)于既不是float也不是double類型的基本類型的域,可以使用==操作符 進(jìn)行比較鸯两;對(duì)于對(duì)象引用類型的域闷旧,可以遞歸地調(diào)用所引用的對(duì)象的equals方法,對(duì)于float和double類型的域钧唐,先轉(zhuǎn)換成int或long類型的值忙灼,然后使用==操作符比較;
當(dāng)你編寫完成了equals方法之后钝侠,應(yīng)該問自己三個(gè)問題:它是否是對(duì)稱的该园、傳 遞的、一致的帅韧? 如果答案是否定的里初,那么請(qǐng)找到 這些特性未能滿足的原因,再修改equals方法的代碼
equals()和hashCode()同時(shí)覆寫
尤其強(qiáng)調(diào)當(dāng)一個(gè)對(duì)象被當(dāng)作鍵值(或索引)來使用的時(shí)候要重寫這兩個(gè)方法忽舟;
覆寫equals后双妨,兩個(gè)不同實(shí)例可能在邏輯上相等淮阐,但是根據(jù)Object.hashCode方法卻產(chǎn)生不同的散列碼,違反“相等的對(duì)象必須具有相等的散列碼”斥难。
導(dǎo)致,當(dāng)你用其中的一個(gè)作為鍵保存到hashMap帘饶、hasoTable或hashSet中哑诊,再以“相等的”找另 一個(gè)作為鍵值去查找他們的時(shí)候,則根本找不到
不同類型的hashCode取值
如果該域是布爾型的及刻,計(jì)算(f镀裤?0:1)
如果是char,short,byte或int,計(jì)算(int)f
如果是long類型缴饭,計(jì)算(int)(f^(f>>>32))
如果是float類型暑劝,計(jì)算Float.floatToIntBits(f)
如果是double類型,計(jì)算Dobule.doubleToLongBits(f)
如果該域是一個(gè)對(duì)象引用颗搂,遞歸調(diào)用hashCode
如果該域是一個(gè)數(shù)組担猛,則把每個(gè)元素當(dāng)做單獨(dú)的域來處理,對(duì)每個(gè)重要的元素計(jì)算一個(gè)散列碼丢氢,
比較:
HashMap的存入順序和輸出順序無關(guān)傅联。
LinkedHashMap 則保留了鍵值對(duì)的存入順序。
TreeMap則是對(duì)Map中的元素進(jìn)行排序疚察。
因?yàn)镠ashMap和LinkedHashMap 存儲(chǔ)數(shù)據(jù)的速度比直接使用TreeMap 要快蒸走,存取效率要高。
當(dāng)完成了所有的元素的存放后貌嫡,我們?cè)賹?duì)整個(gè)的Map中的元素進(jìn)行排序比驻。這樣可以提高整個(gè)程序的運(yùn)行的效率,縮短執(zhí)行時(shí)間岛抄。
注意:TreeMap中是根據(jù)鍵(Key)進(jìn)行排序的别惦。而如果我們要使用TreeMap來進(jìn)行正常的排序的話,Key 中存放的對(duì)象必須實(shí)現(xiàn)Comparable 接口夫椭。
Set:
擴(kuò)展Collection接口
不允許重復(fù)元素
對(duì) add()步咪、equals() 和 hashCode() 方法添加了限制
HashSet和TreeSet是Set的實(shí)現(xiàn)
Set—》hashSet linkedHashSet
SortedSet —》 TreeSet
HashSet常用方法:
public boolean contains(Object o) :如果set包含指定元素,返回true
public Iterator iterator()返回set中元素的迭代器
public Object[] toArray() :返回包含set中所有元素的數(shù)組public Object[] toArray(Object[] a) :返回包含set中所有元素的數(shù)組益楼,返回?cái)?shù)組的運(yùn)行時(shí)類型是指定數(shù)組的運(yùn)行時(shí)類型
public boolean add(Object o) :如果set中不存在指定元素猾漫,則向set加入
public boolean remove(Object o) :如果set中存在指定元素,則從set中刪除
public boolean removeAll(Collection c) :如果set包含指定集合感凤,則從set中刪除指定集合的所有元素
public boolean containsAll(Collection c) :如果set包含指定集合的所有元素悯周,返回true。如果指定集合也是一個(gè)set陪竿,只有是當(dāng)前set的子集時(shí)禽翼,方法返回true
實(shí)現(xiàn)Set接口的HashSet屠橄,依靠HashMap來實(shí)現(xiàn)的。
我們應(yīng)該為要存放到散列表的各個(gè)對(duì)象定義hashCode()和equals()闰挡。
如何達(dá)到不能存在重復(fù)元素的目的锐墙?
“鍵”就是我們要存入的對(duì)象,“值”則是一個(gè)常量长酗。這樣可以確保溪北,我們所需要的存儲(chǔ)的信息
之是“鍵”。而“鍵”在Map中是不能重復(fù)的夺脾,這就保證了我們存入Set中的所有的元素都不重復(fù)之拨。
HashSet如何過濾重復(fù)元素
調(diào)用元素HashCode獲得哈希碼--》判斷哈希碼是否相等,不相等則錄入
---》相等則判斷equals()后是否相等咧叭,不相等在進(jìn)行 hashcode錄入蚀乔,相等不錄入
TreeSet:
TreeSet是依靠TreeMap來實(shí)現(xiàn)的。
TreeSet是一個(gè)有序集合菲茬,TreeSet中元素將按照升序排列吉挣,缺省是按照自然順序進(jìn)行排列,意味著TreeSet中元素要實(shí)現(xiàn)Comparable接口
我們可以在構(gòu)造TreeSet對(duì)象時(shí)婉弹,傳遞實(shí)現(xiàn)了Comparator接口的比較器對(duì)象听想。
幾種Set的比較:
HashSet外部無序地遍歷成員。
成員可為任意Object子類的對(duì)象马胧,但如果覆蓋了equals方法汉买,同
時(shí)注意修改hashCode方法。
TreeSet外部有序地遍歷成員佩脊;
附加實(shí)現(xiàn)了SortedSet, 支持子集等要求順序的操作
成員要求實(shí)現(xiàn)Comparable接口蛙粘,或者使用Comparator構(gòu)造
TreeSet。成員一般為同一類型威彰。
LinkedHashSet外部按成員的插入順序遍歷成員
成員與HashSet成員類似
HashSet是基于Hash算法實(shí)現(xiàn)的出牧,其性能通常都優(yōu)于TreeSet。我們通常都應(yīng)該使用HashSet歇盼,在我們需要排序的功能時(shí)舔痕,我們才使用TreeSet。
HashSet的元素存放順序和我們添加進(jìn)去時(shí)候的順序沒有任何關(guān)系豹缀,而LinkedHashSet 則保持元素的添加順序伯复。TreeSet則是對(duì)我們的Set中的元素進(jìn)行排序存放。
一般來說邢笙,當(dāng)您要從集合中以有序的方式抽取元素時(shí)如捅,TreeSet 實(shí)現(xiàn)就會(huì)有用處速挑。為了能順利進(jìn)行,添加到 TreeSet 的元素必須是可排序的。 而您同樣需要對(duì)添加到TreeSet中的類對(duì)象實(shí)現(xiàn) Comparable 接口的支持艘绍。一般說來,先把元素添加到 HashSet,再把集合轉(zhuǎn)換為 TreeSet 來進(jìn)行有序遍歷會(huì)更快。
Comparable和Comparator
Comparable 接口以提供自然排序順序说莫。
對(duì)于那些沒有自然順序的類、或者當(dāng)您想要一個(gè)不同于自然順序的順序時(shí)寞焙,您可以實(shí)現(xiàn)
Comparator 接口來定義您自己的排序函數(shù)储狭。可以將Comparator傳遞給Collections.sort或Arrays.sort棺弊。
Comparator接口
當(dāng)一個(gè)類并未實(shí)現(xiàn)Comparable晶密,或者不喜歡缺省的Comaparable行為擒悬∧K可以實(shí)現(xiàn)Comparator接口
直接實(shí)現(xiàn)Comparator的compare接口完成自定義比較類。
例:Arrays.sort(results, new Comparator() 數(shù)組排序 RepDataQueryExecutor
例:Collections.sort(lst,new Comparator()
本文是在學(xué)習(xí)中的總結(jié)懂牧,歡迎轉(zhuǎn)載但請(qǐng)注明出處:http://blog.csdn.net/pistolove/article/details/41346969