黑馬程序員--Java學習日記之集合(collection類與list接口)及泛型概述



                                        ------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------


一,集合概念
  之前我們存儲大量的對象,可以使用數組:
  但數組有兩個缺陷:
  1.其長度一旦確定,後期不能更改;對於元素的新增、刪除就十分的不方便;
  2.數組只能存儲一種類型的數據。
  
  爲了解決上述問題,也爲了我們程序員更加方便的存儲大量的對象,Java爲我們提供了一種"類":集合類;
  1.集合:它的作用跟數組一樣,就是存儲大量對象的;
  2.跟數組不同的:
  1).使用集合可以是我們程序員不用關心"長度"的概念,"集合"對於我們來說,似乎像個"無底洞",可以存儲無限數量的對象;
  2).集合可以存儲任何的"對象";(但後期我們也是經常會存儲一種對象)
public class Demo {
public static void main(String[] args) {
//1.定義容器:集合類:ArrayList
ArrayList list = new ArrayList();
//2.實例化若干多的Student對象
for(int i = 0;i < 10000; i++){
//直接實例化,並向集合中添加對象(注意:這裏添加的也是對象的引用)
list.add( new Student("姓名:" + i,i + 10));//姓名:0,10
}

//經過上述的第2步後,集合中添加了10000個Student對象的引用;
//3.遍歷集合
for(int i = 0;i < list.size();i++){
//從集合中取出Student引用
Student s = (Student)list.get(i);//跟數組差不多,這裏調用的是get()方法,獲取一個Student的引用.由於get方法返回的是Object類型,所以這裏強轉一下
System.out.println(s.name + "," + s.age);

}
//假如,原集合存儲的對象有增加,這時可以直接向集合中繼續添加元素
for(int i = 10000;i < 20000; i++){
//直接實例化,並向集合中添加對象(注意:這裏添加的也是對象的引用)
list.add( new Student("姓名:" + i,i + 10));//姓名:0,10
}
}
}
                                                                                                                           
第二講 Collection
一,Collection

      1.它是所有List和Set集合的跟接口;
      2.它內部定義了List和Set所應具有的方法;
      學習:從Collection接口開始;
      使用:從子類開始:ArrayList 
      Collection中定義的常用方法:
  
  1.添加:
  //大家以後看到某個方法的形參或返回值是E的話,那麼就先把它視作:Object類型:
  boolean add(Object e):向集合中添加元素;如果此 collection 由於調用而發生更改,則返回 true
  boolean addAll(Collection c)
  2.刪除:
  boolean remove(Object o):移除元素:此 collection 由於調用而發生更改),則返回 true 。
void clear():清空集合
boolean removeAll(Collection c)


  3.判斷:
  boolean contains(Object o):判斷參數在集合中是否存在;存在:返回true,否則返回false
boolean isEmpty():判斷集合爲空;
boolean containsAll(Collection c)


  4.獲取:
  int size():獲取集合內的元素的數量;
  boolean retainAll(Collection c)
二,Collection中的一些批量操作 的方法:
  添加
  boolean addAll(Collection c):指定 collection 中的所有元素都添加到此 collection 中(可選操作)。
  刪除
  boolean removeAll(Collection c):移除此 collection 中那些也包含在指定 collection 中的所有元素(可選操作)。
  判斷:
  boolean containsAll(Collection c):如果此 collection 包含指定 collection 中的"所有元素",則返回 true。
  boolean retainAll(Collection c):移除此 collection 中未包含在指定 collection 中的所有元素。 

代碼:

import java.util.ArrayList;
import java.util.Collection;

public class CollectionMethod {
    public static void main(String[] args) {
        methodSingle();
        System.out.println("====================");
        methodAll();

    }
    public static void methodSingle(){
        //使用子類ArrayList
        Collection list = new  ArrayList();
        //向集合中添加引用(這裏添加字符串)
        list.add("劉若英");
        list.add("劉德華");
        list.add("劉詩詩");
        list.add("劉惜君");

        //打印集合:
        System.out.println("原集合:" + list);
        //測試:remove(Object o);
        System.out.println("移除劉若英:" + list.remove("劉若英"));//true
        System.out.println("移除後:" + list);

        //4.void clear():清空集合
        /*list.clear();
        System.out.println("集合被清空了:" + list);*/

        //5.boolean contains(Object o):判斷參數在集合中是否存在;存在:返回true,否則返回false
        System.out.println("判斷劉若英是否存在:" + list.contains("劉若英"));
        System.out.println("判斷劉德華是否存在:" + list.contains("劉德華"));

        //6.boolean isEmpty():判斷集合爲空;
        /*System.out.println("集合是否爲空:" + list.isEmpty());
        list.clear();
        System.out.println("清空後,判斷是否爲空:" + list.isEmpty());*/

        //7.int size():獲取集合內的元素的數量;
        System.out.println("集合內元素的數量:" + list.size());
    }
    public static void methodAll(){
        //集合1
        Collection list1 = new ArrayList();
        list1.add("劉若英");
        list1.add("劉德華");
        list1.add("劉詩詩");
        list1.add("劉惜君");

        //集合2
        Collection list2 = new ArrayList();
        list2.add("王心凌");
        list2.add("王力宏");
        list2.add("王光良");
        list2.add("王菲");

        //addAll()
        list1.addAll(list2);//合班
        System.out.println("合班之後list1中的元素:" + list1);
        System.out.println("list2中的元素:" + list2);

        //removeAll();
    /*  list1.removeAll(list2);//再分班
        System.out.println("分班後,list1中的元素:" + list1);
        System.out.println("list2中的元素:" + list2);
        */
        //containsAll
        System.out.println("list1中包含list2中的所有元素嗎?" + list1.containsAll(list2));

        Collection list3 = new ArrayList();
        list3.add("毛爺爺");
        list3.add("鐵娘子");
        list3.add("奧巴馬");
        list3.add("金正恩");
        System.out.println("list1中包含list3中的所有元素嗎?" + list1.containsAll(list3));

        //retainAll()
        list2.retainAll(list3);
        System.out.println("移除list2中未包含在list3中的所有元素:" + list2);
        System.out.println("list2中的元素;" + list2);
        System.out.println("list3中的元素:" + list3);

        Collection list4 = new ArrayList();
        list4.add("aa");
        list4.add("bb");

        Collection list5 = new ArrayList();
        list5.add("cc");
        list5.add("dd");
        list4.retainAll(list5);
        System.out.println("list4 中的所有元素:" + list4);
        System.out.println("list5 中的所有元素:" + list5);
    }
}



 三,迭代器:java.util.Iterator(接口)
    成員方法:
      1.boolean hasNext():判斷是否可以返回下一個元素;
      2.Object next():返回下一個元素;

兩種遍歷方式:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
 * 
 * 
 * 
 */
public class CollectionTraverse {
    public static void main(String[] args) {
        methodTraverseFirst();
        System.out.println("===========");
        methodTraverseSecond();
    }
    /*
     * 方法一:
     * 
     */
    public static void methodTraverseFirst() {
        //實例化一個集合
        Collection list = new ArrayList();
        //填充集合
        list.add("王心凌");
        list.add("張韶涵");
        list.add("辛曉琪");
        list.add("蔡依林");

        //獲取數組
        Object[] objArray = list.toArray();
        //遍歷數組
        for(int i = 0;i < objArray.length ; i++){
            //由於toArray()方法返回的是Object類型的數組,而我們存儲的是String對象。可以將Object強制轉換爲String
            String s =(String) objArray[i];
            System.out.println("數組:"+s);
        }
    }
    public static void methodTraverseSecond(){
        //1.實例化一個集合
        Collection list = new ArrayList();
        //2.填充集合
        list.add("王心凌");
        list.add("張韶涵");
        list.add("辛曉琪");
        list.add("蔡依林");

        //3.使用迭代器遍歷:
        Iterator it = list.iterator();
        while(it.hasNext()){
            Object o = it.next();
            System.out.println("Iterator:" + o);
        }
    }
}



                                                                                                                               
第三講 List
一,層次

Collection(接口):
     |--List(接口):
  |--ArrayList(類)
二,List接口的特點
  1.有序的;
  2.可以根據整數的索引訪問元素(類似於數組的使用);
  3.允許重複的元素;
三,List接口中的特有方法:
  void add(int index,Object element):在index的位置上插入元素element,原索引上的元素依次後移;
  Object remove(int index):移除列表中指定位置的元素(可選操作)。將所有的後續元素向左移動(將其索引減 1)。返回從列表中移除的元素。
  Object get(int index):取index位置上的元素。(它就類似於數組的下標)
  Object set(int index,E element):將element替換原index位置上的元素; 
  LitsIterator listIterator():List接口特有的Iterator(),同樣是用來遍歷元素的。
四,|--List接口
  |--ArrayList類:內部數組實現;線程不安全的。效率高
  |--Vector類:內部數組實現;線程安全的。效率低;
  |--LinkedList類:鏈表實現:線程不安全的。效率高;                                                
五,Iterator接口:是單向的,只能向下遍歷
  |--ListIterator接口:
  |--特有的方法:
  hasPrevious():如果可以向上遍歷,返回true
  previous():獲取前一個元素;

import java.util.ArrayList;
import java.util.List;

public class ListMethod {
    public static void main(String[] args) {
        //實例化一個集合
        List list = new ArrayList();
        //先使用Collection的add添加一些元素
        list.add("紫薇");
        list.add("爾康");
        list.add("五阿哥");

        //1.void add(int index,Object element)
        //在ccc前面加一個XXX
        list.add(2,"小燕子");
        System.out.println("add方法之後的集合:" + list);

        list.add(3,"漱芳齋");//OK的
        System.out.println("add方法之後的集合:" + list);

        //2.Object remove(int index):
        list.remove(3);
        System.out.println("移除掉之後的元素:" + list);

        //3.Object get(int index)
        System.out.println("獲取索引爲3的元素:" + list.get(3));

        //4.Object set(int index,E element)
        //將XXX改爲YYY
        list.set(3, "皇阿瑪");
        System.out.println("替換後爲:" + list);
    }
}1


     
六,Collection(接口)
  |--List(接口):特點:1.有序的;2.可以存儲重複元素;
  |--ArrayList:
  1.數組實現:
  2.線程不安全,效率高;
  |--Vector:
  1.數組實現:
  2.線程安全,效率低;
  |--LinkedList:
  1.鏈表:
  2.線程不安全的,效率高;
七,Collection(接口)
  |--List(接口):
  |--Vector(類):
  1.數組實現。查詢快,增刪慢;
  2.線程安全,效率低;
    Vector是List的子類,所以:它具有List和Collection的所有功能;
   另外Vector又增加了一些特有的功能:
   public void addElement(Object obj):向集合添加一個obj,添加到集合的末尾;
   public Object elementAt(int index):獲取index位置上的元素;作用等同於:List-->get(int index);
   
   public Enumeration elements():返回一個枚舉;
八,LinkedList的特有方法:
  public void addFirst(E e)及addLast(E e)
  public E getFirst()及getLast()
  public E removeFirst()及public E removeLast()
 
  如果將LinkeList作爲鏈表使用:
  1.使用addFirst()進行添加;
    使用get(int index)進行獲取;
  2.使用addFirst()進行添加;
    使用getFirst()獲取;
    使用removeFirst()移除第一個元素;
  3.使用add(Object o)進行添加;
    使用getLast()進行獲取
    使用removeLast()移除最後的元素;
    
  如果將LinkedList作爲普通的集合使用:
  1.使用add()添加;
  2.使用get()獲取;
                                                                               第四講 泛型
一,泛型概念

  1.集合就像倉庫,可以裝任何的引用類型;因爲它的add()方法接收的是Object類型的。
  2.對於集合類,看似功能比較強大,可以添加任何類型的引用。
    但取出的時候,也比較費事,
  3.我們以後使用集合類,經常是向集合中添加一種類型的引用;
  4.這時,Java爲我們提供了一種語法功能:可以將一個集合,在定義時,同時定義這個集合中只能存放
    什麼類型的元素。這種功能就叫:泛型;
  5.例如:我們需要定義一個只存儲"字符串"的集合
        ArrayList<String> list = new ArrayList<String>();
        或
        ArrayList<String> list = new ArrayList<>();(我會經常使用這種形式)
        或
        ArrayList<String> list = new ArrayList();
        
  6.通過JAD查看反編譯的class文件,我們發現,泛型的信息已經沒有了。
    所以:泛型只是在編譯期所具有的一種行爲,這種行爲能夠規範一個集合內只能存儲我們定義的某種類型。
       如果向集合中存儲其它類型,編譯器會產生編譯錯誤。
  7.泛型可以定義泛型類,泛型方法,泛型接口
二,泛型的通配符
    1.<?>:
  1).這種變量可以指向什麼樣的對象:具有任何泛型的集合。
  2).這種集合可以存儲什麼類型的數據:什麼都不能存;
  3).這種集合獲取時,可以用什麼類型接收:只能用Object。因爲使用了?,所以不確定裏面存了什麼類型;
  作用:這種聲明的引用,只能獲取,不能存入。它一般用於"方法的返回值"的聲明;
    2.<? extends E>:
  1).這種變量可以指向什麼樣的對象:此聲明的集合意味着此變量只能指向具有E或E的子類泛型的集合對象;
  2).這種集合可以存儲什麼類型的數據:因爲某個具體的子類不確定,所以什麼類型的對象都不能存;
  3).這種集合獲取時,可以用什麼類型接收:使用E及E的父類類型接收都可以;
  作用:這種聲明的引用,只能獲取,不能存入。它一般也是用於"方法的返回值"聲明;
    3.<? super E>:
  1).這種變量可以指向什麼樣的對象:任何具有E及E的父類類型泛型的集合對象;
  2).這種集合可以存儲什麼類型的數據:任何的E及E的子類類型都可以;
  3).這種集合獲取時,可以用什麼類型接收:取出時只能用Object接收。
  作用:這種聲明的引用,可以存入元素,但不能用除Object外的其它類型接收。這種聲明的格式一般用在"方法的形參"
                                                                                                                               
 第五講  增強for循環
一,格式:for(數據類型   變量名     :   集合對象名/數組名) 

  1.增強for不使用循環變量;
  2.根據自己的需要,如果需要使用循環變量,那麼就使用普通的for循環;
    如果不需要循環變量,只是簡單的遍歷一下集合或數組,那麼使用增強for的語法會簡潔許多。
  3.增強for類似於迭代器,通過它對集合進行遍歷時,仍然不能使用集合對象對集合內部進行修改,否則將拋出:併發修改異常:java.util.ConcurrentModificationException
                                                                               第六講 Set(接口)
一,Collection(接口):
  |--List(接口):有序的,可以存儲重複值;
      |--ArrayList(類):
  |--Vector(類):
   |--LinkedList(類):
  |--Set(接口):無序的(取出時跟存入的順序不一致)。不能存儲重複值
          它沒有新增任何方法,我們使用Collection中的方法就可以操作Set集合了。
           |--HashSet(子類):
           
       注意:Set保證唯一性的方式:先判斷hashCode,如果hashCode一致再判斷equals()
二,LinkedHashSet類
    特點:
       1.由鏈表保證:有序(取出時跟存入的順序一致);
       2.由哈希表保證元素唯一: 
       它沒有特有的成員,都是繼承下來的。
三,TreeSet類
   1.內部使用"樹"結構:
   2."樹"結構,存儲數據的特點:將數據進行排序:
  這種排序會先進行比較,比較有兩種方式
使用TreeSet存儲元素,要求元素必須具有"比較的功能"
  我們怎麼才能具有比較的功能:
  方式一:將我們的類實現:Comparable接口,重寫compareTo()-->自然排序;
  方式二:我們的類不用實現任何接口,在實例化TreeSet時,給TreeSet傳遞一個"比較器對象",這個比較器
       對象一定要是:實現Comparator接口,重寫compare()方法
                                                                                                                   
  第七講 List接口和Set接口的小結
一,Collection:

  |--List:有序的;可以存儲重複值;
  |--ArrayList:數組實現。線程不安全的,效率高;
  |--Vector:數組實現。線程安全,效率低;
  |--LinkedList:鏈表實現。線程不安全,效率高;
  |--Set:無序的;不能存儲重複值;
  |--HashSet:哈希表實現。線程不安全的,效率高;
  判斷重複元素:
  利用元素對象的:hashCode()和equals()
  兩個方法如果都返回true,那麼就認爲是重複元素,不存儲;
  |--LinkedHashSet:鏈表和哈希表實現。線程不安全的,效率高;
  利用鏈表保證"有序";
  利用哈希表保證"唯一";
  |--TreeSet:二叉樹實現。線程不安全,效率高;
  可對元素排序。判斷重複元素,以及對元素排序的方式:
  1.自然排序:我們自定義的類必須實現Comparable接口
  重寫裏面的compareTo()方法;
  2.比較器:我們的類不需要實現任何接口。
  在實例化TreeSet時,要爲TreeSet傳遞一個比較器對象,這個對象必須實現Comparator接口
                       重寫裏面compare()方法;
               --比較器優先
                                                                                                                           
    第八講 Map接口
一,1.Map接口跟Collection接口沒有關係:

   2.Map接口是一個單獨的接口,它使用另外的同Collection完全不同的方式存儲、管理數據;
   3.Map集合存儲元素的特點:使用"鍵值對";
   4.之前我們使用Collection集合,存入時,就是簡單的向集合中存儲;
    取出時:使用數組、迭代器、List集合中增加了一個帶"索引"的
   5.有時候,我們存儲一個對象,會給它"起個名字",獲取對象時,用這個名字就可以取出這個對象。
    這時候,對於我們取出對象,非常的方便;
   6.使用Map存儲對象:存儲時,要給對象起個名字,存入時,連名字和對象一起存儲。
    名字:鍵(key) 要存儲的對象:值(Value);
二,Map接口的基本方法:
  1.添加:
  V put(K key,V value):向集合中添加元素;如果存儲相同的鍵,不同的值,新值會替換舊值,鍵不變;
  2.刪除:
  V remove(Object key):根據某個"鍵",刪除元素;返回被刪除的Value
  void clear():清空集合;
  3.判斷:
 boolean containsKey(Object key):集合是否包含鍵key,包含返回true,否則返回false
 boolean containsValue(Object value):集合是否包含值value,包含返回true,否則返回false
 boolean isEmpty():判斷集合是否爲空。
 4.獲取
 int size()
 V get(Object key)
 Set<K> keySet()
 Collection<V> values()
 Set<Map.Entry<K,V>> entrySet()
三,LinkedHashMap類
   1.內部使用鏈表結構,和哈希表結構;
   2.此Map是有序的;
四,TreeMap類:
  1.內部使用紅黑樹結構;
  2.樹結構會對內部的"鍵"進行排序:
  1).自然排序:類要實現Comparable接口,重寫compareTo()
  2).比較器排序:類要實現Comparator接口,重寫compare()方法;
                             第九講 Collections工具類
一,此類沒有提供能使用的構造方法,內部包含了大量對Collection集合進行操作的一些"靜態方法";
  
  public static <T> void sort(List<T> list):根據元素的自然順序 對指定列表按升序進行排序。
  public static <T> int binarySearch(List<?> list,T key):在集合list中查找key,使用二分查找:
   參數說明:
   list - 要搜索的列表。
   key - 要搜索的鍵。 
  public static <T> T max(Collection<?> coll):根據元素的自然順序,返回給定 collection 的最大元素。
  public static void reverse(List<?> list):反轉指定列表中元素的順序。
  public static void shuffle(List<?> list):將內部的元素隨機打亂
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章