摘要:集合集合類(lèi)存放于包中。迭代器,可以通過(guò)迭代器遍歷集合中的數(shù)據(jù)是映射表的基礎(chǔ)接口有序集合的是非常常用的數(shù)據(jù)類(lèi)型。按照指定的迭代器所返回的元素順序,將該中的所有元素添加到此列表的尾部。
集合
集合類(lèi)存放于Java.util包中。
集合類(lèi)型主要有3種:set(集)、list(列表包含Queue)和map(映射)。
Collection:Collection是集合的基本接口,List、Set、Queue的最基本的接口。
Iterator:迭代器,可以通過(guò)迭代器遍歷集合中的數(shù)據(jù)
Map:是映射表的基礎(chǔ)接口
List 有序集合
Java的List是非常常用的數(shù)據(jù)類(lèi)型。List是有序的Collection。Java List一共三個(gè)實(shí)現(xiàn)類(lèi):分別是ArrayList、Vector和LinkedList。
ArrayList:ArrayList是最常用的List實(shí)現(xiàn)類(lèi),內(nèi)部是通過(guò)數(shù)組實(shí)現(xiàn)的,它允許對(duì)元素進(jìn)行快速隨機(jī)訪問(wèn)。數(shù)組的缺點(diǎn)是每個(gè)元素之間不能有間隔,當(dāng)數(shù)組大小不滿(mǎn)足時(shí)需要增加存儲(chǔ)能力,就要講已經(jīng)有數(shù)組的數(shù)據(jù)復(fù)制到新的存儲(chǔ)空間中。當(dāng)從ArrayList的中間位置插入或者刪除元素時(shí),需要對(duì)數(shù)組進(jìn)行復(fù)制、移動(dòng)、代價(jià)比較高。因此,它適合隨機(jī)查找和遍歷,不適合插入和刪除。
Vector:Vector與ArrayList一樣,也是通過(guò)數(shù)組實(shí)現(xiàn)的,不同的是它支持線(xiàn)程的同步,即某一時(shí)刻只有一個(gè)線(xiàn)程能夠?qū)慥ector,避免多線(xiàn)程同時(shí)寫(xiě)而引起的不一致性,但實(shí)現(xiàn)同步需要很高的花費(fèi),因此,訪問(wèn)它比訪問(wèn)ArrayList慢。
LinkedList:LinkedList是用鏈表結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)的,很適合數(shù)據(jù)的動(dòng)態(tài)插入和刪除,隨機(jī)訪問(wèn)和遍歷速度比較慢。另外,他還提供了List接口中沒(méi)有定義的方法,專(zhuān)門(mén)用于操作表頭和表尾元素,可以當(dāng)作堆棧、隊(duì)列和雙向隊(duì)列使用。
說(shuō)明:
ArrayList在內(nèi)存不夠時(shí)默認(rèn)是擴(kuò)展50% + 1個(gè),Vector是默認(rèn)擴(kuò)展1倍。
Vector屬于線(xiàn)程安全級(jí)別的,但是大多數(shù)情況下不使用Vector,因?yàn)榫€(xiàn)程安全需要更大的系統(tǒng)開(kāi)銷(xiāo)。
一般使用ArrayList和LinkedList比較多
對(duì)于隨機(jī)訪問(wèn)get和set,ArrayList覺(jué)得優(yōu)于LinkedList,因?yàn)長(zhǎng)inkedList要移動(dòng)指針
對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì),因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)
ArrayList
ArrayList是最常用的List實(shí)現(xiàn)類(lèi)。ArrayList內(nèi)部是通過(guò)數(shù)組實(shí)現(xiàn)的。所以只適合遍歷或者隨機(jī)查找。
常用的接口:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
list.add(int index,E element) 將數(shù)據(jù)新增到指定位置
list.add(E element) 將指定的元素添加到此列表的尾部。
list.addAll(Collection extendsE> c) 按照指定 collection 的迭代器所返回的元素順序,將該 collection 中的所有元素添加到此列表的尾部。
list.addAll(int index,Collection extendsE> c) 從指定的位置開(kāi)始,將指定 collection 中的所有元素插入到此列表中。
list.clear() 移除此列表中的所有元素。
list.set(int index,E element) 用指定的元素替代此列表中指定位置上的元素。
list.get(int index) 返回此列表中指定位置上的元素。
list.size() 查看元素總個(gè)數(shù)
list.contains() 包含
例子:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test2 {
/** * 入口函數(shù) * @param args */ public static void main(String[] args) throws Exception { /* 初始化一個(gè)數(shù)組 */ Listlist = new ArrayList (); /* 新增數(shù)據(jù) */ for (int j = 0; j < 5; j++) { list.add(j); } /* 總長(zhǎng)度 */ System.out.println(list.size()); /* 刪除一條數(shù)據(jù) key=1 */ list.remove(1); /* 遍歷 */ for (int i = 0; i < list.size(); i++) { System.out.println("for:" + list.get(i)); //獲取值 } /* 將一個(gè)集合合并 */ List list2 = new ArrayList (); list2.add(99); list2.add(100); list.addAll(list2); /* 遍歷2 */ Iterator it = list.iterator(); while (it.hasNext()) { System.out.println("Iterator:" + it.next()); //獲取值 } /* 是否包含 */ if (list.contains(2)) { System.out.println("包含"); } /* 清空列表 */ list.clear(); //清除整個(gè)列表 }
}
LinkedList
是以鏈表的結(jié)構(gòu)進(jìn)行存儲(chǔ)對(duì)象的,動(dòng)態(tài)新增和刪除是很快,但是遍歷就很慢,并且不存在get()的操作,不能單個(gè)定位。說(shuō)白了,ArrayList是順序存儲(chǔ)結(jié)構(gòu),LinkedList是鏈表存儲(chǔ)結(jié)構(gòu)。
常用接口:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public LinkedList() 生成空的鏈表
public LinkedList(Collection col): 復(fù)制構(gòu)造函數(shù)
public boolean add(Object element) 添加元素
public boolean add(int index, Object element)
public boolean addFirst(Object element)
public boolean addLast(Object element)
list.addAll(Collection extendsE> c) 按照指定 collection 的迭代器所返回的元素順序,將該 collection 中的所有元素添加到此列表的尾部。
list.removeFirst();
list.removeLast();
list.clear();
list.subList(2, 5).clear();
list.remove("2"); #刪除特定元素
List
lList.indexOf("2") 查找元素位置
lList.lastIndexOf("2");
lList.set(3, "Replaced");
lList.contains("4"); 確認(rèn)是否存在
例子:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test2 {
/** * 入口函數(shù) * @param args */ public static void main(String[] args) throws Exception { /* 生成一個(gè)LinkedList */ LinkedListlist = new LinkedList (); list.add("a"); list.add("b"); list.add("c"); list.add("d"); /* list的size */ int size = list.size(); System.out.println(size); /* 獲取第一個(gè)和最后一個(gè)元素 */ String first = list.getFirst(); String last = list.getLast(); System.out.println("First:" + first + " Last:" + last); /* 新增第一個(gè)和最后一個(gè)元素 */ list.addFirst("first"); list.addLast("last"); System.out.println("List內(nèi)容 :" + list); /* 移除最后一個(gè)和第一個(gè) */ list.removeFirst(); list.removeLast(); System.out.println("List內(nèi)容 :" + list); /* 刪除特定元素 */ list.remove("b"); System.out.println("List內(nèi)容 :" + list); /* 查找元素位置 */ int i = list.indexOf("c"); System.out.println("位置 :" + i); /* 是否包含某個(gè)元素 */ if (list.contains("c")) { System.out.println("包含"); } /* 設(shè)置某個(gè)元素 */ list.set(1, "sadsad"); System.out.println("List內(nèi)容 :" + list); /* 轉(zhuǎn)為ArrayList */ List aList = new ArrayList (list); for (String s : aList) { System.out.println("s = " + s); } /* 轉(zhuǎn)為數(shù)組 */ String[] my = list.toArray(new String[list.size()]); for (int j = 0; j < my.length; j++) { System.out.println(my[j]); } /* 組裝list */ LinkedList list2 = new LinkedList (); list.add("ffffd"); list.add("111"); list.addAll(list2); System.out.println("List內(nèi)容 :" + list); /* 遍歷 */ Iterator lit = list.iterator(); while (lit.hasNext()) { System.out.println(lit.next()); } /* 清除 */ list.clear(); System.out.println("List內(nèi)容 :" + list); }
}
Set 集合
Set集合的幾個(gè)特點(diǎn):
Set集合不允許出現(xiàn)重復(fù)數(shù)據(jù)
允許包含值為null的元素,但最多只能有一個(gè)null元素。
TreeSet
TreeSet的幾個(gè)特點(diǎn):
TreeSet中不能有重復(fù)的元素;
TreeSet具有排序功能,缺省是按照自然排序進(jìn)行排列
TreeSet中的元素必須實(shí)現(xiàn)Comparable接口并重寫(xiě)compareTo()方法,TreeSet判斷元素是否重復(fù) 、以及確定元素的順序 靠的都是這個(gè)方法
基于TreeMap實(shí)現(xiàn)
例子:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test {
public static void main(String[] agrs) { /** * TreeSet中不能有重復(fù)的元素; * TreeSet具有排序功能; * TreeSet中的元素必須實(shí)現(xiàn)Comparable接口并重寫(xiě)compareTo()方法,TreeSet判斷元素是否重復(fù) 、以及確定元素的順序 靠的都是這個(gè)方法 * 如果自定義類(lèi),則可以實(shí)現(xiàn)Comparable接口,并且實(shí)現(xiàn)compareTo,完成自定義去重 */ TreeSetset = new TreeSet (); /* 新增數(shù)據(jù) */ set.add("abc"); set.add("xyz"); set.add("bcd"); set.add("bac"); TreeSet set2 = new TreeSet (); set2.add("TTT"); set2.add("zzz"); set2.add("zzz"); /* 新增一個(gè)集合 */ set.addAll(set2); Iterator it = set.iterator(); while (it.hasNext()) { System.out.println(it.next()); } /* 獲取第一個(gè)元素 */ String first = set.first(); System.out.println("first:" + first); /* 獲取最后一個(gè)元素 */ String last = set.last(); System.out.println("last:" + last); /* 是否包含某個(gè)元素 */ if (set2.contains("TTT")) { System.out.println("contains:true"); } /* 判斷是否為空 */ if (set.isEmpty()) { System.out.println("空"); } /* 元素個(gè)數(shù) */ System.out.println("元素個(gè)數(shù):" + set.size()); /* 清空集合 */ set.clear(); }
}
HashSet
HashSet的幾個(gè)特點(diǎn):
HashSet中不能有重復(fù)的元素;
HashSet是無(wú)序的
HashSet也是基于HashMap實(shí)現(xiàn)
例子:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test {
public static void main(String[] agrs) { /** * HashSet中不能有重復(fù)的元素; * HashSet是無(wú)序的 * HashSet也是基于HashMap實(shí)現(xiàn) */ Setset = new HashSet (); /* 新增數(shù)據(jù) */ set.add("abc"); set.add("xyz"); set.add("bcd"); set.add("bac"); Set set2 = new HashSet (); set2.add("TTT"); set2.add("zzz"); set2.add("zzz"); /* 新增一個(gè)集合 */ set.addAll(set2); /* 判斷是否為空 */ if (set.isEmpty()) { System.out.println("空"); } /* 元素個(gè)數(shù) */ System.out.println("元素個(gè)數(shù):" + set.size()); /* 移除元素 */ set.remove("zzz"); Iterator it = set.iterator(); while (it.hasNext()) { System.out.println(it.next()); } /* 是否包含某個(gè)元素 */ if (set2.contains("TTT")) { System.out.println("contains:true"); } /* 清空集合 */ set.clear(); }
}
Map
Map集合主要有:HashMap,TreeMap
HashMap
HashMap特點(diǎn):
HashMap是無(wú)序的散列映射表;
HashMap通過(guò)Hash 算法來(lái)決定存儲(chǔ)位置
底層實(shí)現(xiàn)是哈希表
例子:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test {
public static void main(String[] agrs) { /** * HashMap是無(wú)序的散列映射表; * HashMap通過(guò)Hash 算法來(lái)決定存儲(chǔ)位置 */ HashMapmap = new HashMap (); /* 填充數(shù)據(jù) */ map.put("username", "initphp"); map.put("age", "100"); /* 獲取元素個(gè)數(shù) */ System.out.println(map.size()); /* put all */ HashMap map2 = new HashMap (); map2.put("username2", "initphp2"); map2.put("age2", "1002"); map.putAll(map2); /* 通過(guò)Key遍歷HashMap */ Iterator it = map.keySet().iterator(); while (it.hasNext()) { String key = (String) it.next(); System.out.println("key:" + key + " value:" + map.get(key)); } /* 是否包含某個(gè)key */ if (map.containsKey("age")) { System.out.println("是否包含某個(gè)key"); } /* 判斷是否為空 */ if (map.isEmpty()) { System.out.println("空"); } /* 刪除某個(gè)元素 */ map.remove("age"); /* 清空Map表 */ map.clear(); }
}
TreeMap
TreeMap的特點(diǎn):
適用于按自然順序或自定義順序遍歷鍵(key)。
底層是二叉樹(shù)
提供compareTo,可以定義排序方法
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test {
public static void main(String[] agrs) { /** * 1. 適用于按自然順序或自定義順序遍歷鍵(key)。 * 2. 底層是二叉樹(shù) * 3. 提供compareTo,可以定義排序方法 */ TreeMapmap = new TreeMap (); /* 填充數(shù)據(jù) */ map.put("username", "initphp"); map.put("age", "100"); /* 獲取元素個(gè)數(shù) */ System.out.println(map.size()); /* put all */ TreeMap map2 = new TreeMap (); map2.put("username2", "initphp2"); map2.put("age2", "1002"); map.putAll(map2); /* 通過(guò)Key遍歷HashMap,是有序的 */ Iterator it = map.keySet().iterator(); while (it.hasNext()) { String key = (String) it.next(); System.out.println("key:" + key + " value:" + map.get(key)); } /* 是否包含某個(gè)key */ if (map.containsKey("age")) { System.out.println("是否包含某個(gè)key"); } /* 判斷是否為空 */ if (map.isEmpty()) { System.out.println("空"); } String first = map.firstKey(); String last = map.lastKey(); System.out.println("first:" + first); System.out.println("last" + last); /* 刪除某個(gè)元素 */ map.remove("age"); /* 清空Map表 */ map.clear(); }
}
Queue
LinkedList就是一個(gè)Queue。
常用的Queue有:PriorityQueue、ConcurrentLinkedQueue、ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue
PriorityQueue
例子:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test {
public static void main(String[] agrs) { /* 生成一個(gè)LinkedList */ PriorityQueuequeue = new PriorityQueue (); queue.add("a"); queue.add("b"); queue.add("c"); queue.add("d"); /* queue的size */ int size = queue.size(); System.out.println(size); /* 刪除特定元素 */ queue.remove("b"); System.out.println("List內(nèi)容 :" + queue); /* 是否包含某個(gè)元素 */ if (queue.contains("c")) { System.out.println("包含"); } /* 組裝list */ PriorityQueue queue2 = new PriorityQueue (); queue2.add("ffffd"); queue2.add("111"); queue.addAll(queue2); System.out.println("List內(nèi)容 :" + queue); /* 遍歷 */ Iterator lit = queue.iterator(); while (lit.hasNext()) { System.out.println(lit.next()); } /* 從隊(duì)列頭部彈出一個(gè)元素 */ String string = queue.poll(); System.out.println("poll:" + string); string = queue.poll(); System.out.println("poll:" + string); /* 從尾部頭部彈出一個(gè)元素 */ string = queue.peek(); System.out.println("peek:" + string); System.out.println("List內(nèi)容 :" + queue); /* 清除 */ queue.clear(); System.out.println("List內(nèi)容 :" + queue); }
}
轉(zhuǎn)載自:http://blog.csdn.net/initphp/...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66946.html
摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄?,我的目?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來(lái)的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開(kāi)始了螞蟻金...
摘要:本文是作者自己對(duì)中線(xiàn)程的狀態(tài)線(xiàn)程間協(xié)作相關(guān)使用的理解與總結(jié),不對(duì)之處,望指出,共勉。當(dāng)中的的數(shù)目而不是已占用的位置數(shù)大于集合番一文通版集合番一文通版垃圾回收機(jī)制講得很透徹,深入淺出。 一小時(shí)搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解) 是一個(gè)接口,程序可以通過(guò)...
摘要:深入理解集合中的問(wèn)題由來(lái)之所以今天想寫(xiě)這篇文章完全是一個(gè)偶然的機(jī)會(huì)。昨晚,微信技術(shù)群里的一位猿友我,問(wèn)了我一個(gè)問(wèn)題,代碼如下。他問(wèn)我,這樣寫(xiě)有沒(méi)有問(wèn)題,會(huì)不會(huì)報(bào)錯(cuò)然后他說(shuō)這是他今天去面試的面試官出的題目,結(jié)果他回答不出來(lái)。 深入理解Java集合中的Iterator 問(wèn)題由來(lái) 之所以今天想寫(xiě)這篇文章完全是一個(gè)偶然的機(jī)會(huì)。昨晚,微信技術(shù)群里的一位猿友@我,問(wèn)了我一個(gè)問(wèn)題,代碼如下。他問(wèn)我,...
摘要:中的詳解必修個(gè)多線(xiàn)程問(wèn)題總結(jié)個(gè)多線(xiàn)程問(wèn)題總結(jié)有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開(kāi)源的運(yùn)行原理從虛擬機(jī)工作流程看運(yùn)行原理。 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 基于 POI 封裝 ExcelUtil 精簡(jiǎn)的 Excel 導(dǎo)入導(dǎo)出 由于 poi 本身只是針對(duì)于 ...
閱讀 2985·2023-04-26 02:29
閱讀 592·2019-08-30 15:54
閱讀 1672·2019-08-29 13:13
閱讀 609·2019-08-28 17:51
閱讀 2731·2019-08-26 13:58
閱讀 1543·2019-08-26 13:27
閱讀 2829·2019-08-26 11:39
閱讀 3454·2019-08-26 10:46