国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

關于Java的Collection 全方面了解

2019-11-06 07:51:52
字體:
來源:轉載
供稿:網友
深入java 關于Collection 全方面了解搜羅了很多資料,沒有怎么校對,格式也很亂。如有錯漏,有空再改。 一、Collection接口和實現類的層次關系     如圖所示:圖中,實線邊框的是實現類,折線邊框的是抽象類,而點線邊框的是接口     Collection接口是集合類的根接口。List接口,一個有序的集合,可以包含重復元素,提供按索引訪問的方式。Set接口,沒有存儲順序,不能包含重復元素。Map接口,是java.util包中的接口,與Collection接口沒有關系,相互獨立,但屬于集合類的一部分。以鍵值對存儲數據<key,value>,鍵不可重復。可以是對象對對象Iterator接口,迭代器,所有集合類都實現了Iterator接口。二、幾個重要的接口和類簡介List(有序,可重復)存放的對象是有序的,按照add的順序存放,對象是可以重復的。List關注的是索引,擁有一系列和索引相關的方法,查詢速度快。List插入或刪除數據時,要移動數據,所以比較慢。Set(無序,不可重復)存放的對象是無序的,不可重復。集合中的對象不按特定的方式排序,只是簡單地把對象加入到集合。Map(鍵值對、鍵唯一、值可以重復)存儲的是鍵值對,鍵不可重復,值可以重復,根據鍵得到值。對Map集合遍歷時要先得到鍵的Set集合,對Set集合進行遍歷,得到對應的值。Iterator(迭代器)所有集合類都實現了遍歷并選擇序列中的對象,可以從迭代器所指向的Collection移除元素。
接口實現類是否有序是否重復內部實現優缺點
List(自帶索引的,除了迭代器獲取元素方法外,可以使用get(int index方法來獲取元素)ArrayList基于數組查找快,增刪慢
LinkedList鏈表實現增刪快,查找慢(可以實現隊列或棧的數據結構)
Vector于ArrayList相同,線程同步線程安全,效率低,浪費空間(相對于ArrayList)
Set(底層其實就是Map接口實現的,想一想Map的鍵唯一)HashSet否(取決于hashCode和equals方法)哈希表實現存取速度快,線程不安全
LinkedHashSet帶有雙向鏈表的哈希表結構非線程安全,保持存取順序,保持了查詢速度較快特點
TreeSet是(二叉排序樹)紅黑樹非線程安全,按自然排序或比較器存入元素以保證元素有序。元素唯一性取決于ComparaTo方法或Comparator比較器
MapHsahMap使用key-value來映射和存儲數據,key必須唯一,value可以重復哈希表實現存取速度快,線程不安全
HashTable哈希表實現保留了存取速度,線程安全
TreeMap是(二叉排序樹)紅黑樹認對元素進行自然排序
PS:     Vector 為什么不推薦     Vector唯一的優勢就是線程安全,但是現在有Collections.synchronizedListt方法拿同步的List,于是Vector被淘汰了。并且相對ArrayList來說很浪費空間。Vector滿空間后需要擴容一倍。     關于hashCode和equals方法在以哈希表為數據結構的容器中,其存放地址取決于hashCode方法計算的值,如果hashCode的值相同,則用equals方法判斷是否相同,如果都相同則判定為相同元素。在以哈希表為數據結構的容器使用過程中,已經加入的元素不可以變更hashCode方法所依賴的域的值,否則會導致元素hashCode值已變化,但是其在容器中的位置卻沒有變化,后果是接下來的remove等操作將因為無法找到該元素而移除失敗,進一步導致內存泄露。     比較器     1. Comparable接口     自定義類如果實現該接口,那么重寫該接口唯一的方法comparaTo(E),可以讓該類具有可比較性。     2. Comparator接口     實現該接口的類被稱之為比較器,一般只具有一個方法,就是重寫的這個接口的compara(E o1, E o2)方法,實現兩個對象之間的比較。三、遍歷方式在類集中提供了以下四種的常見輸出方式:Iterator:迭代輸出,是使用最多的輸出方式。Object next( ) : 返回迭代器剛越過的元素的引用,返回值是Objectboolean hasNext( ) : 判斷容器是否還有可供方位的元素void remove( ): 刪除迭代器剛越過的元素ListIterator:是Iterator的子接口,專門用于輸出List中的內容。boolean hasprevious( ) : 判斷是否有前一個元素Object PRevious( ) : 獲取前一個元素void add(e):添加元素int nextIndex( ) : 獲取next后續元素的索引void set(E e) : 替換制定的元素可以并發執行操作, Iterator執行并發操作會出現不確定性行為foreach輸出:JDK1.5之后提供的新功能,可以輸出數組或集合。底層還是迭代器for循環PS: 迭代器指向的位置是元素之前的位置     這里假設集合List由四個元素List1、List2、List3和List4組成,當使用語句Iterator it = List.Iterator()時,迭代器it指向的位置是上圖中Iterator1指向的位置,當執行語句it.next()之后,迭代器指向的位置后移到上圖Iterator2所指向的位置最常用的是Iterator的形式
Iterator it = arr.iterator(); // 獲取迭代器while(it.hasNext()){ // 進行遍歷     Object o = it.next;     ...}          對于List的遍歷
// 遍歷List:List<String> list = new ArrayList<String>();list.add("a");list.add("b");list.add("c");// 1,增強的for循環for (String str: list) {     System.out.println(str);}// 2,下標for (int i = 0; i < list.size(); i++) {     System.out.println(list.get(i));}// 3,迭代器for (Iterator<String> iter = list.iterator(); iter.hasNext();) {     String elt = iter.next();     System.out.println(elt);}     對于Set的遍歷
Set set = new HashSet();set.add(new String("11"));set.add(new String("222"));// 增強的for循環for (String elt : set) {     System.out.println(elt);}// 迭代器Iterator i = set.iterator();//先迭代出來while(i.hasNext()){//遍歷     System.out.println(i.next());}     對于Map的遍歷
// 1、通過獲取所有的key按照key來遍歷Map map = new HashMap();map.put("key1","lisi1");map.put("key2","lisi2");map.put("key3","lisi3");map.put("key4","lisi4");//先獲取map集合的所有鍵的set集合,keyset()Iterator it = map.keySet().iterator(); //獲取迭代器while(it.hasNext()){     Object key = it.next();     System.out.println(map.get(key));}// 2、通過Map.values()遍歷所有的value,但不能遍歷keyfor (String v : map.values()) {    System.out.println("value= " + v);}// 3、通過Map.entrySet遍歷key和value,推薦,尤其是容量大時Map map = new HashMap();//將map集合中的映射關系取出,存入到set集合Iterator it = map.entrySet().iterator();while(it.hasNext()){     Entry e =(Entry) it.next();     System.out.println("鍵"+e.getKey () + "的值為" + e.getValue());}PS:     第一種方法:KeySet()     將Map中所有的鍵存入到set集合中。因為set具備迭代器。所有可以迭代方式取出所有的鍵,再根據get方法。獲取每一個鍵對應的值。 keySet():迭代后只能通過get()取key 。取到的結果會亂序,是因為取得數據行主鍵的時候,使用了HashMap.keySet()方法,而這個方法返回的Set結果,里面的數據是亂序排放的。     第二種方法:entrySet()     Set<Map.Entry<K,V>> entrySet() //返回此映射中包含的映射關系的 Set 視圖。(一個關系就是一個鍵-值對),就是把(key-value)作為一個整體一對一對地存放到Set集合當中的。Map.Entry表示映射關系。entrySet():迭代后可以e.getKey(),e.getValue()兩種方法來取key和value。返回的是Entry接口。     四、主要實現類的區別小結     Vector和ArrayList     1,vector是線程同步的,所以它也是線程安全的,而arraylist是線程異步的,是不安全的。如果不考慮到線程的安全因素,一般用arraylist效率比較高。     2,如果集合中的元素的數目大于目前集合數組的長度時,vector增長率為目前數組長度的100%,而arraylist增長率為目前數組長度的50%。如果在集合中使用數據量比較大的數據,用vector有一定的優勢。     3,如果查找一個指定位置的數據,vector和arraylist使用的時間是相同的,如果頻繁的訪問數據,這個時候使用vector和arraylist都可以。而如果移動一個指定位置會導致后面的元素都發生移動,這個時候就應該考慮到使用linklist,因為它移動一個指定位置的數據時其它元素不移動。          ArrayList 和Vector是采用數組方式存儲數據,此數組元素數大于實際存儲的數據以便增加和插入元素,都允許直接序號索引元素,但是插入數據要涉及到數組元素移動等內存操作,所以索引數據快,插入數據慢,Vector由于使用了synchronized方法(線程安全)所以性能上比ArrayList要差,LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行向前或向后遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入數度較快。     注意:Vector唯一的優勢就是線程安全,但是現在有Collections.synchronizedListt方法拿同步的List,于是Vector被淘汰了。并且相對ArrayList來說很浪費空間。Vector滿空間后需要擴容一倍。     Arraylist和Linkedlist     1.ArrayList是實現了基于動態數組的數據結構,ArrayList的內部實現是基于內部數組Object[ ]     2.LinkedList基于鏈表的數據結構。     3.對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。     4.對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。 這一點要看實際情況的。若只對單條數據插入或刪除,ArrayList的速度反而優于LinkedList。但若是批量隨機的插入刪除數據,LinkedList的速度大大優于ArrayList. 因為ArrayList每插入一條數據,要移動插入點及之后的所有數據。         HashMap與TreeMap     1、 HashMap通過hashcode對其內容進行快速查找,而TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。     2、在Map 中插入、刪除和定位元素,HashMap是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好。使用HashMap要求添加的鍵類明確定義了hashCode()和 equals()的實現。兩個map中的元素一樣,但順序不一樣,導致hashCode()不一樣。     同樣做測試:     在HashMap中,同樣的值的map,順序不同,equals時,false;     而在treeMap中,同樣的值的map,順序不同,equals時,true,說明,treeMap在equals()時是整理了順序了的。     HashTable與HashMap     1、同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的。     2、HashMap允許存在一個為null的key,多個為null的value 。     3、hashtable的key和value都不允許為null。總結:1、如果線程要求安全,使用Vector(不推薦) ,Hashtable2、如果不要求線程安全,應使用ArrayList(推薦),LinkedList,HashMap3、如果要求鍵值對,則使用HashMap(推薦)、Hashtable4、如果數據很大,又要線程安全考慮Vector(不推薦)Java8 更新的新特性1.Lambda表達式 在java8中新增加了一個forEach方法,可以使用Lambda表達式來遍歷集合元素
Collection books=new HashSet();//調用foreach方法循環遍歷集合books.forEach(obj->System.out.println("迭代元素:"+obj));2.使用Lambda遍歷Iterator java8中為Iterator增加了一個forEachRemaining方法,,也可以使用Lambda來遍歷
Collection books=new HashSet();//獲取books集合對應的迭代器Iterator it=books.iterator();
//使用lambda表達式(目標類型是Comsumer)來遍歷集合元素it.forEachRemaining(obj ->System.out.println("輸出的結果是"+obj));3.java8中增加的Predicate操作集合 在java8中為Collection集合增加了一個removeIF方法,也可以用來操作lambda
List<String> list = new ArrayList<String>(){     {          // 為list添加數據          addAll(Arrays.asList("wangzhen456liupei123".split("")));          add("1521"); // 純數字數據          add("wanghzen123") // 數字+字符數據          add("wangzhen"); // 純字符串       }};System.out.println("初始數據:" + list);Pattern pattern = Pattern.compile("//d");//匹配數字Predicate<String> filter = s -> pattern.matcher(s).find();list.removeIf(filter);//移除 System.out.println(list);// 超簡略寫法list.removeIf(s -> Pattern.compile("//d").matcher(s).find()); 4.Stream操作集合 在java8中還增加了Stream、intStream、LongStream、DoubleStream等流式API,并且java8中還為每個API提供了對應的Builder,例如StreamBuilder、IntStreamBuilder等 5.Collection操作集合 在java8中還為Collection提供了stream()默認方法,改方法用來返回該集合對應的流
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 敦化市| 比如县| 镇坪县| 祁阳县| 民权县| 玉龙| 安乡县| 杭锦后旗| 西峡县| 三台县| 娱乐| 武穴市| 彝良县| 吴忠市| 方正县| 商南县| 枣庄市| 安图县| 南部县| 灵石县| 云和县| 莎车县| 汝南县| 基隆市| 济宁市| 藁城市| 弥渡县| 安庆市| 商城县| 耒阳市| 玉门市| 金平| 永年县| 吉木萨尔县| 蓬溪县| 仙桃市| 临泉县| 盐源县| 诏安县| 若尔盖县| 依兰县|