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

首頁 > 學院 > 開發設計 > 正文

3)Java容器

2019-11-14 21:56:34
字體:
來源:轉載
供稿:網友
3)java容器

3)Java容器Java的集合框架核心主要有三種:List、Set和Map。這里的 Collection、List、Set和Map都是接口(Interface)。 List lst = new ArrayList(); 這是我們平常經常使用的創建一個新的List的語句,在這里, List是接口,ArrayList才是具體的類。常用集合類的繼承結構如下:Collection<--List<--VectorCollection<--List<--ArrayListCollection<--List<--LinkedListCollection<--Set<--HashSetCollection<--Set<--HashSet<--LinkedHashSetCollection<--Set<--SortedSet<--TreeSetMap<--TreeMapMap<--HashMap下面的表格是各個容器的特性一覽表:
Collection/Map接口成員重復性元素存放順序(Ordered/Sorted元素中被調用的方法基于那中數據結構來實現的
HashSetSetUnique elementsNo orderequals()hashCode()Hash表
LinkedHashSetSetUnique elementsInsertion orderequals()hashCode()Hash表和雙向鏈表
TreeSetSortedSetUnique elementsSortedequals()compareTo()平衡樹(Balanced tree)
ArrayListListAllowedInsertion orderequals()數組
LinkedListListAllowedInsertion orderequals()鏈表
VectorListAllowedInsertion orderequals()數組
HashMapMapUnique keysNo orderequals()hashCode()Hash表
LinkedHashMapMapUnique keysKey insertion order/access order of entriesequals()hashCode()Hash表和雙向鏈表
HashtableMapUnique keysNo orderequals()hashCode()Hash表
TreeMapSortedMapUnique keysSorted in key orderequals()compareTo()平衡樹(Balanced tree)
下文會對各個容器做分開詳述。
(0)collection:(interfere) java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是為各種具體的集合提供了最大化的統一操作方式。
  1. boolean add(Object element)
  2. boolean remove(Object element)
Collection 接口還支持查詢操作:
  1. int size()
  2. boolean isEmpty()
  3. boolean contains(Object element)
  4. Iterator iterator()
  5. boolean containsAll(Collection collection)//是否包含某集合的所有元素
  6. boolean addAll(Collection collection)//并集
  7. void clear()//清空整個集合
  8. void removeAll(Collection collection)//從一個集合中去除了另一個集合的所有元素。集合的減法
  9. void retainAll(Collection collection) //集合的交集
轉換為Object數組的方法:
  1. Object[] toArray()
  2. Object[] toArray(Object[] a)//a 應該是集合中所有存放的對象的類的父類
Collection接口的iterator()方法返回一個Iterator。publicclassIteratorDemo {publicstaticvoidmain(String[] args) {Collection collection =newArrayList();collection.add("s1");collection.add("s2");collection.add("s3");Iterator iterator = collection.iterator();//得到一個迭代器while(iterator.hasNext()) {//遍歷Object element = iterator.next();System.out.(1)List(interface) List是有序的Collection.使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數組下標)來訪問List中的元素,這類似于Java的數組。(1.1)Vector:基于數組(Array)的List,封裝了數組所不具備的一些功能方便我們使用,所以它難以避免數組的限制,同時性能也不可能超越數組。另外很重要的一點就是Vector是線程同步的(sychronized)。(1.2)ArrayList:同Vector一樣是一個基于數組上的List,但是不同的是ArrayList不是同步的。所以在性能上要比Vector好一點,但是當運行到多線程環境中時,需要自己在管理線程的同步問題。(1.3)LinkedList:LinkedList不同于前面兩種List,它不是基于數組的,所以不受數組性能的限制。LinkedList 添加了一些處理列表兩端元素的方法, addFirst()、addLast() 、 getFirst()、 getLast()、 removeFirst() 、removeLast() 這些方法可以當作堆棧,隊列使用publicclassListExample {publicstaticvoidmain(String args[]) { LinkedList queue =newLinkedList(); queue.addFirst("Bernadine"); queue.addFirst("Elizabeth"); queue.addFirst("Gene"); queue.addFirst("Elizabeth"); queue.addFirst("Clara"); System.out.println(queue); queue.removeLast(); queue.removeLast(); System.out.println(queue); }}List總結: 所有的List中只能容納單個不同類型的對象組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ] 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ] 所有的List中可以有null元素,例如[ tom,null,1 ] 基于Array的List(Vector,ArrayList)適合查詢,而LinkedList 適合添加,刪除操作
(2) set(interfece)Set是一種不包含重復的元素的無序Collection。(2.1) HashSet:HashSet的存儲方式是把HashMap中的Key作為Set的對應存儲項。value值不用。(2.2) LinkedHashSet(2.3)TreeSet:不同于HashSet的根本就是TreeSet是有序Set總結: HashSet實現的基礎是Map,TreeSet的實現基礎是平衡二叉樹 Set中的元素是不能重復的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象packagec08;importjava.util.*;publicclassSetSortExample {publicstaticvoidmain(String args[]) { Set set1 =newHashSet(); Set set2 =newLinkedHashSet();for(inti=0;i<5;i++){ //產生一個隨機數,并將其放入Set中 ints=(int) (Math.random()*100); set1.add(newInteger( s)); set2.add(newInteger( s)); System.out.println("第"+i+"次隨機數產生為:"+s); } System.out.println("未排序前HashSet:"+set1); System.out.println("未排序前LinkedHashSet:"+set2);//使用TreeSet來對另外的Set進行重構和排序 Set sortedSet =newTreeSet(set1); System.out.println("排序后TreeSet:"+sortedSet); }} 該程序的一次執行結果為: 第 0 次隨機數產生為: 96 第 1 次隨機數產生為: 64 第 2 次隨機數產生為: 14 第 3 次隨機數產生為: 95 第 4 次隨機數產生為: 57 未排序前HashSet :[64, 96, 95, 57, 14] 未排序前LinkedHashSet :[96, 64, 14, 95, 57] 排序后 TreeSet :[14, 57, 64, 95, 96] 從這個例子中,我們可以知道 HashSet的元素存放順序和我們添加進去時候的順序沒有任何關系,而 LinkedHashSet 則保持元素的添加順序。 TreeSet則是對我們的 Set中的元素進行排序存放。
(3) map: (interfece) Map 是一種把鍵對象和值對象進行關聯的容器。對于鍵對象來說,像Set一樣,一個 Map容器中的鍵對象不允許重復,這是為了保持查找結果的一致性。Map一樣容易擴展成多維Map ,無需增加新的概念,只要讓Map中的鍵值對的每個“值”也是一個Map即可。(3.1)HashMap:里面最重要的3個屬性: transientEntry[] table:用來存放鍵值對的對象Entry數組,也就是Hash表 transientintsize:當前Map中存放的鍵值對的個數 finalfloatloadFactor:負載因子,用來決定什么情況下應該對Entry進行擴容 intthreshold;重構因子,其值為負載因子與數組容積的乘積。當數組存入元素超過該值時,table需要擴容向HashMap中添加一個條目的過程: 1.創建一個Entry對象用來存放鍵值對。 2.添加該鍵值對---- Entry對象到鏈表中 3.最后在size屬性加一,并判斷是否需要對當前的Hash表進行重構( voidresize(intnewCapacity) )(3.2)LinkedHashMap:保留鍵的原有插入順序。 System.out.println("未排序前HashMap:"+map1);System.out.println("未排序前LinkedHashMap:"+map2);//使用TreeMap來對另外的Map進行重構和排序Map sortedMap;System.out.println("排序后:"+newTreeMap(map1));System.out.println("排序后:"+newTreeMap(map2)); 在實際的使用中我們也經常這樣做:使用 HashMap或者 LinkedHashMap 來存放元素,當所有的元素都存放完成后,如果使用需要一個經過排序的 Map的話,我們再使用 TreeMap來重構原來的 Map對象。這樣做的好處是:因為 HashMap和 LinkedHashMap 存儲數據的速度比直接使用 TreeMap 要快,存取效率要高。當完成了所有的元素的存放后,我們再對整個的 Map中的元素進行排序。這樣可以提高整個程序的運行的效率,縮短執行時間。 需要注意的是,TreeMap中是根據鍵(key)進行排序的,而如果我們要使用TreeMap來進行正常的排序的話,key中存放的對象必須實現Comparable。
Collection/Map接口成員重復性元素存放順序(Ordered/Sorted元素中被調用的方法基于那中數據結構來實現的
HashSetSetUnique elementsNo orderequals()hashCode()Hash表
LinkedHashSetSetUnique elementsInsertion orderequals()hashCode()Hash表和雙向鏈表
TreeSetSortedSetUnique elementsSortedequals()compareTo()平衡樹(Balanced tree)
ArrayListListAllowedInsertion orderequals()數組
LinkedListListAllowedInsertion orderequals()鏈表
VectorListAllowedInsertion orderequals()數組
HashMapMapUnique keysNo orderequals()hashCode()Hash表
LinkedHashMapMapUnique keysKey insertion order/Access order of entriesequals()hashCode()Hash表和雙向鏈表
HashtableMapUnique keysNo orderequals()hashCode()Hash表
TreeMapSortedMapUnique keysSorted in key orderequals()compareTo()平衡樹(Balanced tree)
如何選擇?

1 、容器類和 Array的區別、擇取 * 容器類僅能持有對象引用(指向對象的指針),而不是將對象信息 copy 一份至數列某位置。 * 一旦將對象置入容器內,便損失了該對象的型別信息。2 * 在各種 Lists 中,最好的做法是以 ArrayList作為缺省選擇。當插入、刪除頻繁時,使用 LinkedList() ; Vector總是比 ArrayList 慢,所以要盡量避免使用。 * 在各種 Sets 中,HashSet 通常優于TreeSet (插入、查找)。只有當需要產生一個經過排序的序列,才用 TreeSet 。 TreeSet存在的唯一理由:能夠維護其內元素的排序狀態。 * 在各種 Maps 中 HashMap用于快速查找。 * 當元素個數固定,用 Array ,因為Array 效率是最高的。

結論:最常用的是ArrayListHashSetHashMapArray。而且,我們也會發現一個規律,用TreeXXX都是排序的。

注意:1、Collection沒有get()方法來取得某個元素。只能通過iterator()遍歷元素。2、Set和Collection擁有一模一樣的接口。3、List,可以通過get()方法來一次取出一個元素。使用數字來選擇一堆對象中的一個,get(0)...。(add/get)4、一般使用ArrayList。用LinkedList構造堆棧stack、隊列queue。5、Map用 put(k,v) / get(k),還可以使用containsKey()/containsValue()來檢查其中是否含有某個key/value。6、Map中元素,可以將key序列、value序列單獨抽取出來。 使用keySet()抽取key序列,將map中的所有keys生成一個Set。 使用values()抽取value序列,將map中的所有values生成一個Collection。 為什么一個生成Set,一個生成Collection?那是因為,key總是獨一無二的,value允許重復。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平潭县| 北京市| 西城区| 正阳县| 大同市| 乌拉特中旗| 阳信县| 淮滨县| 丹东市| 广平县| 理塘县| 贵溪市| 维西| 阳高县| 永丰县| 西宁市| 木兰县| 益阳市| 辽阳县| 广元市| 双柏县| 刚察县| 连平县| 都江堰市| 海口市| 信丰县| 银川市| 池州市| 固始县| 岳普湖县| 贵德县| 延寿县| 永胜县| 尤溪县| 沙坪坝区| 南和县| 巴楚县| 大足县| 肥西县| 义乌市| 建湖县|