1三、Java的集合

數組和集合的區別:數組

一、數組的長度是固定的,集合的長度是可變的安全

二、數組中存儲的是同一類型的元素,能夠存儲基本數據類型值。集合存儲的都是對象,並且對象的類型能夠不一致。數據結構

 

Collection:因此單列集合的父接口,定義了單列集合通用的一些方法工具

示例代碼:this

public class Demo {
    public static void main(String [] args) {
        Collection<String> coll = new ArrayList<>();
        System.out.println(coll);

        boolean b1=coll.add("讀者A");
        boolean b2=coll.add("讀者B");
        System.out.println(coll);

        boolean b3=coll.remove("讀者C");
        boolean b4=coll.remove("讀者B");
        boolean b5=coll.contains("讀者A");
        boolean b6=coll.isEmpty();
        System.out.println(b1);
        System.out.println(b2);
        System.out.println(b3);
        System.out.println(b4);
        System.out.println(b5);
        System.out.println(b6);
        System.out.println(coll.size());
        System.out.println(coll.toArray()[0]);

    }
}

iterator :迭代器接口,迭代,就是collection集合元素的通用獲取方式。在取元素以前先要判斷集合中有沒有元素,若是有,就把這個元素取出來,繼續判斷,若是還有就再取出來,一直到集合中的全部元素都取出。對象

示例代碼:索引

public class Demo {
    public static void main(String [] args) {
        Collection<String> coll = new ArrayList<>();
        System.out.println(coll);

        boolean b1=coll.add("讀者A");
        boolean b2=coll.add("讀者B");
        Iterator<String> it = coll.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

加強for循環:底層使用迭代器,使用for循環的格式,簡化迭代器書寫,用來遍歷集合和數組接口

格式 : for(集合/數組的數據類型 變量名 : 集合名/數組名){方法體}rem

示例代碼:get

public class Demo {
    public static void main(String [] args) {
        Collection<String> coll = new ArrayList<>();
        System.out.println(coll);

        boolean b1=coll.add("讀者A");
        boolean b2=coll.add("讀者B");
        for (String str:coll) {
            System.out.println(str);
        }
    }
}

注意:加強for循環的目標只能是集合或者數組

 

泛型:是一種未知的數據類型,當咱們不知道使用什麼數據類型的時候,可使用泛型 E e :Element 元素 ,T t :Type 類型

 

建立集合,不使用泛型:

好處:集合不使用泛型,默認類型就是Object類型,能夠存儲任意類型的數據

壞處:不安全,容易引起異常

建立集合,使用泛型:

好處:一、避免了類型轉換的麻煩,存儲的是什麼數據,取出的就是什麼類型

         二、把運行期間的異常提高到了編譯期間

壞處:泛型是什麼類型,只能存儲什麼類型的數據

 

定義一個泛型的類:修飾符 class 類名<表明泛型的變量>{}

定義一個泛型的方法: 修飾符 <泛型> 返回值類型 方法名 (參數列表(使用泛型)){方法體},含有泛型的方法在調用方法的時候肯定泛型的數據類型,參數傳遞什麼類型,泛型就是什麼類型

定義一個泛型的接口: 修飾符 interface 接口名<泛型>{}

含義泛型的接口的使用方式:一、定義接口的實現類,實行接口,指定接口的泛型

                                       二、接口使用什麼泛型,實現類就使用什麼泛型

 

泛型通配符:當使用泛型類或者接口時,傳遞的數據中,泛型的類型不肯定,能夠經過通配符<?>表示。可是一旦使用了泛型通配符後,只能使用Object類中的共性方法,集合中的元素自身方法沒法使用

示例代碼

public class Demo {
    public static void main(String[] args){}
    
    private class Demo2<E>{
        private E name;

        public E getName() {
            return name;
        }

        public void setName(E name) {
            this.name = name;
        }
        
        public <M> void method(M m){
            
        }
        
        public void printArray(ArrayList<?> list){
            Iterator<?>it = list.iterator();
            while (it.hasNext()){
                System.out.println(it.next());
            }
        }
    }
}

List接口:一、他是一個元素存取有序的集合

              二、他是一個帶有索引的集合

              三、集合中能夠有重複的元素

注意:要防止索引的越界異常

示例代碼

public class Demo {
    public static void main(String[] args){
        List<String> list =new ArrayList<>();
        list.add("讀者A");
        list.add("讀者B");
        list.add("讀者A");
        System.out.println(list);
        list.add(1,"讀者C");
        System.out.println(list);
        list.remove(1);
        System.out.println(list);
        list.set(1,"讀者D");
        System.out.println(list);
    }
}

ArrayList:前面已經用過,再也不講述,底層是數組數據結構

LinkedList:鏈表數據結構

示例代碼

public class Demo {
    public static void main(String[] args){
       LinkedList<String> list = new LinkedList<>();
       list.add("讀者A");
       list.add("讀者B");
       list.add("讀者A");
        System.out.println(list);
       list.addFirst("讀者C");
        System.out.println(list);
        list.addLast("讀者D");
        System.out.println(list);
        list.push("讀者E");
        System.out.println(list);
        list.pop();
        System.out.println(list);
        System.out.println(list.getFirst());
        System.out.println(list.getLast());
        list.removeFirst();
        list.removeLast();
    }
}

Vector:底層是數組數據結構,如今多用ArrayList代替使用

 

Set接口類:一、不容許存儲重複的元素

                二、沒有索引,沒有帶索引的方法,也不能使用普通的for循環遍歷

 

HashSet實現類:一、不容許存儲重複的元素

                        二、沒有索引,沒有帶索引的方法,也不能使用普通的for循環遍歷

                        三、是一個無序的集合,存儲元素和取出元素的順序有可能不一致

                        四、底層是一個哈希表結構(查詢的速度很是的快)

示例代碼:

public class Demo {
    public static void main(String[] args){
       Set<Integer> set = new HashSet<>();
       set.add(96);
       set.add(97);
       set.add(98);
       set.add(99);
       set.add(100);
       set.add(97);
        System.out.println(set);
       Iterator it = set.iterator();
       while (it.hasNext()){
           System.out.println(it.next());
       }
    }
}

擴展:哈希值,是一個十進制的整數,由系統隨機給出(就是對象的地址值,是一個邏輯地址,是模擬出來獲得地址,不是數據實際存儲的物理地址)

注意:使用HashSet存儲自定義類型的元素時,要重寫hashCode和equals方法

 

LinkedHashSet:HashSet的子類,元素不能夠重複,可是有序,底層是一個哈希表+鏈表

示例代碼:

public class Demo {
    public static void main(String[] args){
       LinkedHashSet<Integer> set = new LinkedHashSet<>();
       set.add(96);
       set.add(97);
       set.add(98);
       set.add(99);
       set.add(97);
        System.out.println(set);
        Iterator it = set.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

 可變參數:當方法的參數列表數據類型已經肯定,可是參數的個數不肯定,就可使用可變參數 , 修飾符 返回值類型 方法名(數據類型...變量名){},可變參數底層就是一個數組,根據傳遞的參數個數不一樣,會建立不一樣長度的數組,來存儲這些參數。

public class Demo {
    public static void main(String[] args){
        System.out.println(sum(1,2,3));
        System.out.println(sum(1,2));
    }

    public static int sum (int...a){
        int sum =0;
        for (int b:a) {
            sum+=b;
        }
        return sum;
    }
}

Collections:操做集合的工具類,對集合進行操做

示例代碼:

public class Demo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(96);
        list.add(97);
        list.add(98);
        list.add(99);
        list.add(100);
        Collections.shuffle(list);
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
    }
}

Map集合接口:一、Map集合是一個雙列集合,一個元素包含兩個值(Key,Value)

               二、Map集合中的元素,Key和Value的數據類型能夠相同也能夠不一樣

               三、Map集合中的元素,Key是不容許重複的,Value是能夠重複的

               四、Map集合中的元素,Key和Value是一一對應的

HashMap<K,V>,Map接口的實現類:一、底層是哈希表,查詢速度快

                                                    二、是一個無序的集合,存儲元素和取出元素的順序不一致

LinkedHashMap<K,V>,HashMap的子類:一、底層是哈希表+鏈表

                                                           二、集合是一個有序的集合,存儲元素和取出元素的順序一致

Map接口的示例代碼

public class Demo {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("讀者A","做品A");
        map.put("讀者B","做品B");
        map.put("讀者C","做品C");
        map.put("讀者D","做品D");
        System.out.println(map);
        map.remove("讀者D");
        System.out.println(map);
        System.out.println(map.get("讀者A"));
        System.out.println(map.containsKey("讀者A"));

        Set<String> set =map.keySet();
        Iterator<String> it1 = set.iterator();
        while(it1.hasNext()){
            String str = it1.next();
            System.out.println(map.get(str));
        }

        Set<Map.Entry<String,String >> set2 = map.entrySet();
        Iterator<Map.Entry<String ,String >> it2 = set2.iterator();
        while (it2.hasNext()){
            Map.Entry<String ,String > entry = it2.next();
            System.out.println(entry.getKey()+"="+entry.getValue());
        }




    }
}
相關文章
相關標籤/搜索