摘要:集合框架的基本接口類層次結構其中表示接口,表示實現類和在實際開發中,需要將使用的對象存儲于特定數據結構的容器中。實例是迭代器,擁有兩個方法方法迭代器用于遍歷集合元素。返回值則是轉換后的數組,該數組會保存集合中的所有元素。
Java Collections Framework是Java提供的對集合進行定義,操作,和管理的包含一組接口,類的體系結構。
Java集合框架的基本接口/類層次結構:
java.util.Collection [I] +--java.util.List [I] +--java.util.ArrayList [C] +--java.util.LinkedList [C] +--java.util.Vector [C] +--java.util.Stack [C] +--java.util.Set [I] +--java.util.HashSet [C] +--java.util.SortedSet [I] +--java.util.TreeSet [C] java.util.Map [I] +--java.util.SortedMap [I] +--java.util.TreeMap [C] +--java.util.Hashtable [C] +--java.util.HashMap [C] +--java.util.LinkedHashMap [C] +--java.util.WeakHashMap [C]
其中I表示接口,C表示實現類
1 List和Set在實際開發中,需要將使用的對象存儲于特定數據結構的容器中。JDK提供了這樣的容器---集合(Collection)。Collection是一個接口,定義了集合相關的操作方法,其有兩個子接口:List與Set
List:可重復集合 Set:不可重復的集合 其中判斷元素是否重復,取決于元素的equals()比較的結果2 集合持有對象的引用
集合中存儲的都是引用類型元素,并且集合只保存每個元素對象的引用,而并非將元素對象本身存入集合。
Collection定義了一個add方法用于向集合中添加新元素。 boolean add(E e) 該方法返會將給定的元素添加進集合,若添加成功,則返回true,否則返回false。
實例1
import java.util.ArrayList; import java.util.Collection; public class Test00{ public static void main(String[] args) { Collection3.2 contains方法c = new ArrayList (); System.out.println(c); c.add("a"); c.add("b"); c.add("c"); System.out.println(c); } }
boolean contains(Object o) 該方法用于判定給定的元素是否被包含在集合中。若包含則返回true,反則返回false。 注意:集合在判斷元素是否被包含在集合中是根據每個元素的equals方法進行比較的結果。 通常有必要重寫equals()保證contains()方法的合理結果
實例2:
import java.util.ArrayList; import java.util.Collection; public class Test00{ public static void main(String[] args) { Collection3.3 size clear isEmptyc = new ArrayList (); System.out.println(c); c.add("a"); c.add("b"); c.add("c"); System.out.println(c); Collection b = new ArrayList (); b.add("b"); b.add("c"); System.out.println(c.contains(b)); System.out.println(c.contains("b")); c.addAll(b); System.out.println(c); System.out.println(c.contains(b)); System.out.println(c.contains("h")); } }
int size() 該方法用于返回當前集合中的元素總數 void clear() 該方法用于清空當前集合。 boolean isEmpty() 該方法用于判定當前集合中是否不包含任何元素
實例3 :
import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; public class Test00{ public static void main(String[] args) { Collectionc = new HashSet (); System.out.println(c.isEmpty()); c.add("java"); c.add("cpp"); c.add("php"); c.add("c#"); c.add("cpp"); System.out.println("isEmpty : " + c.isEmpty() + ",size : "+ c.size()); c.clear();// 清空該集合 System.out.println("isEmpty : "+ c.isEmpty() + ",size : " + c.size()); } } addAll containsAll boolean addAll(Collection extends E> c) 該方法需要我們傳入一個集合,并將該集合中的所有元素添加到當前集合中。 boolean containsAll(Collection> c) 該方法用于判定當前結合是否包含給定集合中的所有元素,若包含則返回true。
實例4
import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; public class Test00{ public static void main(String[] args) { Collection4 Iteratorc1 = new ArrayList (); c1.add("java"); c1.add("cpp"); c1.add("php"); c1.add("c#"); c1.add("objective-c"); c1.add("cppc"); System.out.println(c1); Collection c2 = new HashSet (); c2.addAll(c1); System.out.println(c2); Collection c3 =new ArrayList (); c3.add("java"); c3.add("cpp"); System.out.println(c1.containsAll(c3)); } }
Iterator是迭代器,擁有兩個方法
4.1 hasNext,next方法迭代器用于遍歷集合元素。獲取迭代器可以使用Collection定義的方法:
Iterator iterator()
迭代器Iterator是一個借口,集合在重寫Collection的iterator()方法時利用內部類提供了迭代器的實現。 Iterator提供了統一的遍歷元素集合的方法,其提供了用于遍歷集合的兩個方法: boolean hasNext():判斷集合是否還有元素可以遍歷 E next():返回迭代的下一個元素
實例4
import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; public class Test00{ public static void main(String[] args) { Collection4.2 remove方法c = new HashSet (); c.add("java"); c.add("cpp"); c.add("php"); c.add("c#"); c.add("objective-c"); Iterator iterator = c.iterator(); while(iterator.hasNext()){ String str = iterator.next(); System.out.println(str); } } }
在使用迭代器遍歷集合時,不能通過集合的remove方法刪除集合元素,否則會拋出并發更改異常。我們可以通過迭代器自身提供的remove()方法來刪除通過next()迭代出的元素
void remove()
迭代器的刪除方法是在原集合中刪除元素。
這里需要注意的是:在調用remove方法前必須通過迭代器的next方法迭代過的元素,那么刪除的就是這個元素。并且不能夠再次調用remove方法,除非再次調用next()后方可再次調用。
實例5:
import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; public class Test00{ public static void main(String[] args) { Collection4.3 增強型for循環c = new HashSet (); c.add("java"); c.add("cpp"); c.add("php"); c.add("c#"); c.add("objective-c"); Iterator it = c.iterator(); while(it.hasNext()){ String str = it.next(); if(str.indexOf("c")!=-1){ it.remove();// 刪除包含字母c的元素 } } System.out.println(c); } }
Java5.0之后推出了一個新的特性,增強for循環,也成為新循環。該循環不通用于傳統循環的工作,其只用于遍歷集合或數組。
語法: for(元素類型 e:集合或數組){ 循環體 }
實例7
import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; public class Test00{ public static void main(String[] args) { Collectionc = new HashSet (); c.add("java"); c.add("cpp"); c.add("php"); c.add("c#"); c.add("objective-c"); for(String str : c) { System.out.print(str.toUpperCase()+" "); //C# CPP OBJECTIVE-C JAVA PHP } } }
新循環并非新的語法,而是在編譯過程中,編譯器會將新循環轉為迭代器模式。所以新循環本質上是迭代器。
5 泛型機制泛型是Java SE5.0引入的特性,泛型的本質是參數化類型。在類、接口、和方法的定義過程中,所操作的數據類型被傳入的參數指定。
Java泛型機制廣泛的應用在集合框架中。所有的集合類型都帶有泛型的參數,這樣在創建集合時可以指定放入集合中的元素的類型。Java編譯器可以據此進行類型檢查,這樣可以減少代碼在運行時出現錯誤的可能性。
6 ListList接口是Collection的子接口,用于定義線性表數據結構。可以講List理解為存放對象的數組,只不過其元素可以動態的增加或減少。
List接口的兩個常見實現類為ArrayList和LinkList,分別用動態數組和鏈表的方式實現了List接口。
可以認為ArrayList和LinkedList的方法在邏輯上完全一樣,只是在性能上有一定差別。ArrayList更適合于隨機訪問,LinkList更適合于插入和刪除。在性能要求不是特別苛刻的情形下可以忽略這個差別。
List除了繼承Collection定義方法外,還根據其線性表的數據結構定義了一系列的方法,其中最常用的就是基于下標的get和set方法
E get(int index) 獲取集合執行下標對應的元素,下標從0開始。 E set(int index,Element) 將給定的元素存入給定位置,并將原位置的元素返回。
實例8
import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; public class Test00{ public static void main(String[] args) { Listc = new ArrayList (); c.add("java"); c.add("cpp"); c.add("php"); c.add("c#"); c.add("objective-c"); for(int i = 0;i 6.2 插入和刪除 List根據下標的操作還支持插入語刪除操作
void add(int index,Element);
將給定的元素插入到指定位置,原位置及后續元素都順序向后移動。E remove(int index);
6.3 List轉換為數組
刪除給定位置的元素,并將被刪除的元素返回。List的toArray方法用于將集合轉換為數組。但實際上該方法是在Collection中定義的,所以所有的集合都具備這個功能。
其有兩個方法: Object[] toArray()T[] toArray(T[] a) 其中第二個方法是比較常用的,我們可以傳入一個指定類型的數組,該數組的元素類型與集合的元素類型一致。返回值則是轉換后的數組,該數組會保存集合中的所有元素。
6.4 數組轉換為ListArrays類中提供了一個靜態方法asList,使用該方法我們可以將一個數組轉換為對應的List集合。
其方法定義為:staticList asList 返回的List的集合元素類型由傳入的數組的元素類型決定。
6.5 List排序
并且要注意的是,返回的集合我們不能對其增刪元素。并且對集合的元素進行修改hi影響數組對應的元素。Collection.sort方法實現排序
Collection是集合的工具類,它提供了很多便于我們操作集合的方法,其中就有用于集合排序的sort方法。該方法定義為:void sort(List6.6 Comparablelist) 該方法的作用是對給定的集合元素進行自然排序。 Collection的sort方法是對集合元素進行自然排序,那么兩個元素對象之間就一定要有大小之分。這個代銷之分是如何界定的?
實際上,在使用Collection的sort排序的結合都必須是Comparable接口實現類,該接口表示其子類是可比較的,因為實現該接口必須重寫抽象方法:
int compareTo(T t); 該方法返回值要求: 若o1>o2則返回值應>0 若o16.7 LinkedList 雙向鏈表 雙端效率高方法
add(數據) 添加數據 get(i) 訪問指定位置的收 remove(i) 移除指定位置的數據 size() 元素的數量 addFirst() 在鏈表首處添加元素 addLast() 在鏈表末尾添加元素 getFirst() 獲得第一個元素 getLast() 獲得末尾元素 removeFirst() 刪除第一個元素 removeLast() 刪除最后一個元素 iterator() 輔助創建迭代器對象進行設置LinkedList實例:
import java.lang.reflect.Array; import java.util.Arrays; import java.util.Iterator; import java.util.LinkedList; import java.util.Queue; public class Test00{ public static void main(String[] args) { LinkedListlist = new LinkedList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ffffd"); list.add("eee"); list.add("fff"); list.add("ggg"); list.add("hhh"); list.add("iii"); list.add("jjj"); list.add("kkk"); list.add("lll"); System.out.println("獲取鏈表數組的大?。?"+list.size());// 獲取鏈表的大小 System.out.println("get方法獲取元素 "+list.get(0)); System.out.println("獲取第一個元素"+list.getFirst()); System.out.println("獲取鏈表的之后一個元素 "+list.getLast()); LinkedList list1 = new LinkedList<>(); list1.addAll(list); for(String s1:list1){// 元素遍歷 System.out.println(s1); } // 通過迭代器來遍歷 Iterator iterator = list.iterator(); if(iterator.hasNext()){ String str = iterator.next(); System.out.println(str); } System.out.println("刪除鏈表的第一個元素 "+list.removeFirst()); System.out.println("刪除鏈表的最后一個元素: "+list.removeLast()); System.out.println("找到第一個相等的元素進行刪除 "+list.remove("ffffd")); System.out.println("指定刪除鏈表中的某個元素:"+list.remove(4)); System.out.println(list.toArray());// 將list鏈表轉為數組 Object[] listarr = list.toArray();// 將list轉為數組,并利用數組的方式進行答應 System.out.println(Arrays.toString(listarr)); } } 6.8 ArrayList和LinkedList的大致區別如下:
1.ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。 2.對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。 3.對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據示例如下:
import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class Test00{ static final int N = 500000; static long timeList(List list){ long start = System.currentTimeMillis(); Object o = new Object(); for(int i = 0;i7 隊列和棧 7.1 Queue(隊列) 隊列是常用的數據結構,可以將隊列看成特殊的線性表,隊列限制了線性表的訪問方式:只能從線性表 的一端添加(offer)元素,從另一端取出(poll)元素。 隊列遵循先進先出(FIFO First Input First Output)的原則。 JDK中提供了Queue接口,同時使用LinkedList實現了該接口(選擇LinkList實現Queue的原因在于 Queue經常要進行添加和刪除的操作,而LinkList在這方面效率較高)。Queue接口中主要方法如下:
boolean off(E e) 將一個元素添加至隊尾,如果添加成功則返回true。 E poll() 從隊首刪除并返回一個元素。 E peek() 返回隊首的元素(但并不刪除).7.2 DequeDeque是Queue的子接口,定義了所謂的"雙端隊列",即從隊列的兩端分別可以入隊(offer)和出隊(poll),LinkList實現了該接口。
如果將Deque限制為只能從一端入隊和出隊,則可實現"棧"(Stack)數據結構,對棧而言,入棧稱之為push,出棧稱之為pop。
棧遵循先進后出(FILO First Input Last Output)的原則。import java.util.LinkedList; import java.util.Queue; public class Test00{ public static void main(String[] args) { Queuequeue = new LinkedList (); queue.offer("a");// 將一個對象添加至隊尾,如果添加成功則返回true queue.offer("b"); queue.offer("c"); System.out.println(queue); String str =queue.peek(); System.out.println(str); while(queue.size()>0){ // 從隊首刪除并返回一個元素 str = queue.poll(); System.out.println(str + " "); } } } 文章參考:http://blog.sina.com.cn/s/blo...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76605.html
摘要:常用的抓包工具有當然還有其他的工具我三個都用過不過太復雜了不是太懂用抓到的信息太詳細了反而不是太容易分辨找出自己想要的內容其實是因為懶懶的學并且對網絡知識了解較少境界不夠境界到了自然會用我一般都是開發的時候用到抓包工具開發網頁自帶的就已經很 常用的抓包工具有fiddler,charles,wireshark(當然還有其他的工具)我三個都用過,不過wireshark太復雜了,不是太懂用,...
摘要:服務提供者代碼上面這個類會被封裝成為一個實例,并新生成一個實例。這樣當網絡通訊層收到一個請求后,會找到對應的實例,并調用它所對應的實例,從而真正調用了服務提供者的代碼。 這次源碼解析借鑒《肥朝》前輩的dubbo源碼解析,進行源碼學習??偨Y起來就是先總體,后局部.也就是先把需要注意的概念先拋出來,把整體架構圖先畫出來.讓讀者拿著地圖跟著我的腳步,并且每一步我都提醒,現在我們在哪,我們下一...
摘要:原文地址與性能分析概要前言在項目中,常常會遇到循環交換賦值的數據處理場景,尤其是,數據交互格式要轉為,賦值是無法避免的。如下預編譯生成代碼提前確定類型,可以解決運行時的反射帶來的性能開銷。 原文地址:for-loop 與 json.Unmarshal 性能分析概要 前言 在項目中,常常會遇到循環交換賦值的數據處理場景,尤其是 RPC,數據交互格式要轉為 Protobuf,賦值是無法避免...
摘要:或者說一直以來我是缺乏開發高性能網頁的意識的,但是想做一個好的前端開發者,是需要在當自己編寫的程序慢慢復雜以后還能繼續保持網頁的高性能的。 不知道有多少人和我一樣,在以前的開發過程中很少在乎自己編寫的網頁的性能?;蛘哒f一直以來我是缺乏開發高性能網頁的意識的,但是想做一個好的前端開發者,是需要在當自己編寫的程序慢慢復雜以后還能繼續保持網頁的高性能的。這需要我們對JavaScript語句,...
閱讀 720·2021-11-24 10:30
閱讀 1254·2021-09-24 09:48
閱讀 3074·2021-09-24 09:47
閱讀 3588·2019-08-29 17:11
閱讀 2875·2019-08-29 15:38
閱讀 2270·2019-08-29 11:03
閱讀 3594·2019-08-26 12:15
閱讀 1008·2019-08-26 10:45