JavaSE集合類

JavaSE集合類

  • 概述
    • Java中集合類概述
    • Java中數組與集合的比較
    • Java中集合框架層次結構
  • Collection接口
    • Collection接口常用方法
  • Set接口
  • List接口
    • List接口常用方法
    • ArrayList
    • LinkedList
  • Map接口
    • Map接口常用方法
    • HashMap類
    • HashMap與TreeMap的比較
    • HashMap與Hashtable的比較

概述

Java中集合類概述

Java中集合類是用來存放對象的
集合相當于一個容器,里面包容著一組對象 —— 容器類
其中的每個對象作為集合的一個元素出現
Java API提供的集合類位于java.util包內

Java中數組與集合的比較

數組也是容器,它是定長的,訪問較快,但是數組不會自動擴充
數組可以包含基本數據類型或引用類型的對象,而集合中只能包含引用類型的對象

Java中集合框架層次結構

Collection接口

· 一組稱為元素的對象
· 一個Collection中可以放不同類型的數據
· 是Set接口和List接口的父類
· 是否有特定的順序以及是否允許重復,取決于它的實現

Set - 無序的集合;不允許重復(HashSet)
List - 有序的集合;允許重復(ArrayList,LinkedList)

Collection接口常用方法

方法 含義
boolean add(Object) 集合中加入一個對象,成功時返回true
boolean addAll(Collection) 集合中加入另外一個集合對象
int size() 集合內容納的元素數量
boolean isEmpty() 集合是否為空
boolean contains(Object) 集合內是否含有參數對象
Iterator iterator() 產生一個迭代器
Object[] toArray() 返回一個包含所有元素的對象數組
boolean remove(Object) 從集合中刪除對象
boolean removeAll(Collection) 清空指定集合
boolean containsAll(Collection) 判斷集合內是否包含子集
boolean retainAll(Collection) 僅保留此 collection 中那些也包含在指定 collection 的元素

Set接口

Set接口
· Collection的子接口
· 用來包含一組 無序無重復 的對象
無序 — 是指元素存入順序和集合內存儲的順序不同;
無重復 — 兩個對象e1和e2,如果e1.equals(e2)返回true,則認為e1和e2重復,在set中只保留一個。
Set接口的實現類
· HashSet — HashSet的特性在于其內部對象的散列存取,即采用哈希技術
· TreeSet — TreeSet存入的順序跟存儲的順序不同,但是存儲是按照排序存儲的
使用foreach方式遍歷Set集合

樣例代碼:

package com.training.csdn;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * Keafmd
 *
 * @ClassName: MySet
 * @Description: Set講解
 * @author: 牛哄哄的柯南
 * @date: 2020-11-26 19:23
 */
public class MySet {

    public static void main(String[] args) {
        //類的構造
        Set set =  new HashSet(); //面向接口編程

        //add
        set.add(50);
        set.add(60); //int     Integer
        set.add(200);
        set.add(new Integer(200));

        //size() 獲取集合長度
        System.out.println("set.size(): "+set.size());

        //使用另外一個集合構造set對象
        Set set2 = new HashSet();
        set2.addAll(set);  // 全部添加進去

        // 打印元素個數
        System.out.println("set2.size(): "+set2.size());

        //isEmpty 是否為空
        System.out.println("set2.isEmpty(): "+set2.isEmpty());

        //判斷是否包含某個元素
        System.out.println( "set2.contains(60): "+set2.contains(60));
        System.out.println( "set2.contains(200): "+set2.contains(new Integer(200)));

        //迭代器 遍歷Set
        Iterator it = set2.iterator();

        while(it.hasNext()){
            Object item = it.next();
            System.out.println("元素: "+item);
        }

        //移除元素, 通過equals 和hashcode 判斷是否存在元素
        set.remove(50);
        System.out.println("移除后的元素個數: "+set.size());

        Set set3 = new HashSet();
        set3.add("abc");
        set3.add("def");
        set3.add("ghi");
        set3.add("aaa");

        Set set4 = new HashSet();
        set4.add("abc");
        set4.add("def");
        set4.add("kkk");
        set4.add("aaa");

        System.out.println("set3.size: "+set3.size());

        //  從set3中移除set3和set4的 交集元素
//        set3.removeAll(set4);
//        System.out.println("移除后的集合長度: "+set3.size());
//
//
//        for (Object o : set3) {
//            System.out.println("set3的元素有: "+o);
//        }

        // 保留 set3 和 set4 的交集元素
        set3.retainAll(set4);
        System.out.println("retainAll.size: "+set3.size());

        for (Object o : set3) {
            System.out.println("set3的元素有: "+o);
        }

        //清空set集合
        set3.clear();
        System.out.println(set3.size()); //0
    }

}

運行效果:

set.size(): 3
set2.size(): 3
set2.isEmpty(): false
set2.contains(60): true
set2.contains(200): true
元素: 50
元素: 200
元素: 60
移除后的元素個數: 2
set3.size: 4
retainAll.size: 3
set3的元素有: aaa
set3的元素有: abc
set3的元素有: def
0

Process finished with exit code 0

List接口

List接口常用方法

方法 含義
void add(int index,Object element) 在列表中的index位置,添加element元素
Object get(int index) 返回列表中指定位置的元素
int indexOf(Object o) 在list中查詢元素的索引值,如不存在,返回-1。
int lastIndexOf(Object o) List中如果存在多個重復元素,indexOf()
ListIterator listIterator() 返回列表中元素的列表迭代器
Object remove(int index) 移除列表中指定位置的元素
Object set(int index,Object element) 用指定元素替換列表中指定位置的元素

ArrayList與LinkedList的比較:
存儲結構:
ArrayList是線性順序存儲。
LinkedList對象間彼此串連起來的一個鏈表。
操作性能:
ArrayList適合隨機查詢的場合。
LinkedList元素的插入和刪除操作性高。
LinkedList功能要多一些。

ArrayList

講解代碼:

package com.CSDN.day26;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
 * Keafmd
 *
 * @ClassName: MyArrayList
 * @Description: ArrayList
 * @Author: 牛哄哄的柯南
 * @Date: 2020/11/26 21:01
 **/
public class MyArrayList {
    public static void main(String[] args) {
        //
        List list1 = new ArrayList();
        list1.add("張三");
        list1.add("李四");
        list1.add("李四");
        list1.add("王五");

        System.out.println("list1.size()\t"+list1.size());

        List list2 = new ArrayList(list1);
        System.out.println("list2.size()\t"+list2.size());

        System.out.println("========================================================");
        //通過下標的形式訪問每一個元素
//        System.out.println("list1.get(0)\t"+list1.get(0));
//        System.out.println("list1.get(1)\t"+list1.get(1));
//        System.out.println("list1.get(2)\t"+list1.get(2));
        for (int i = 0; i < list1.size(); i++) {
            System.out.println("list1.get("+i+")\t"+list1.get(i));
        }

        System.out.println("=======================增強for遍歷=================================");
        for (Object o : list2) {
            System.out.println("item\t"+o);
        }

        System.out.println("=======================Iterator遍歷=================================");
        for(Iterator it = list2.iterator(); it.hasNext() ; ){
            System.out.println("iterator Item \t"+it.next());
        }
        System.out.println("=======================forEach遍歷=================================");
//        list2.forEach(System.out::println);
        list2.forEach(x->System.out.println("forEach item\t"+x));

        System.out.println("=======================add(index,Object el)=================================");

        List list3 =new  ArrayList();
        list3.add("abc");
        list3.add("def");
        list3.add("jqk");

        //list3 add(index ,el)
        list3.add(1,"insert");
        list3.forEach(x->System.out.println("list3 item\t"+x));
        System.out.println("=======================add(index,Object el)=================================");
        //list3 update(index ,el)
        list3.set(1,"update");
        list3.forEach(x->System.out.println("list3 item\t"+x));

        //indexOf/lastIndexOf ,返回索引位置,如果找不到則返回-1

        System.out.println("list3.indexOf(\"def\")\t"+list3.indexOf("def"));
        //判斷def是否重復
        if(list3.indexOf("def") != list3.lastIndexOf("def")){
            System.out.println("def重復了");
        }

        //listIterator
        ListIterator listIter = list3.listIterator(list3.size()-1);
        while (listIter.hasPrevious()){
            System.out.println("listIter.previous()\t"+listIter.previous());
        }
    }

}

運行結果:

list1.size()    4
list2.size()    4
========================================================
list1.get(0)    張三
list1.get(1)    李四
list1.get(2)    李四
list1.get(3)    王五
=======================增強for遍歷=================================
item    張三
item    李四
item    李四
item    王五
=======================Iterator遍歷=================================
iterator Item   張三
iterator Item   李四
iterator Item   李四
iterator Item   王五
=======================forEach遍歷=================================
forEach item    張三
forEach item    李四
forEach item    李四
forEach item    王五
=======================add(index,Object el)=================================
list3 item  abc
list3 item  insert
list3 item  def
list3 item  jqk
=======================add(index,Object el)=================================
list3 item  abc
list3 item  update
list3 item  def
list3 item  jqk
list3.indexOf("def")    2
listIter.previous() def
listIter.previous() update
listIter.previous() abc

Process finished with exit code 0

LinkedList

講解代碼:

package com.CSDN.day26;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

/**
 * Keafmd
 *
 * @ClassName: MyLinkedList
 * @Description: LinkedList
 * @Author: 牛哄哄的柯南
 * @Date: 2020/11/26 21:06
 **/
public class MyLinkedList {
    public static void main(String[] args) {
        //
        List list1 = new LinkedList();
        list1.add("張三");
        list1.add("李四");
        list1.add("李四");
        list1.add("王五");

        System.out.println("list1.size()\t"+list1.size());

        List list2 = new LinkedList(list1);
        System.out.println("list2.size()\t"+list2.size());

        System.out.println("========================================================");
        //通過下標的形式訪問每一個元素
//        System.out.println("list1.get(0)\t"+list1.get(0));
//        System.out.println("list1.get(1)\t"+list1.get(1));
//        System.out.println("list1.get(2)\t"+list1.get(2));
        for (int i = 0; i < list1.size(); i++) {
            System.out.println("list1.get("+i+")\t"+list1.get(i));
        }

        System.out.println("=======================增強for遍歷=================================");
        for (Object o : list2) {
            System.out.println("item\t"+o);
        }

        System.out.println("=======================Iterator遍歷=================================");
        for(Iterator it = list2.iterator(); it.hasNext() ; ){
            System.out.println("iterator Item \t"+it.next());
        }
        System.out.println("=======================forEach遍歷=================================");
//        list2.forEach(System.out::println);
        list2.forEach(x->System.out.println("forEach item\t"+x));

        System.out.println("=======================add(index,Object el)=================================");

        List list3 =new  LinkedList();
        list3.add("abc");
        list3.add("def");
        list3.add("jqk");

        //list3 add(index ,el)
        list3.add(1,"insert");
        list3.forEach(x->System.out.println("list3 item\t"+x));
        System.out.println("=======================add(index,Object el)=================================");
        //list3 update(index ,el)
        list3.set(1,"update");
        list3.forEach(x->System.out.println("list3 item\t"+x));

        //indexOf/lastIndexOf ,返回索引位置,如果找不到則返回-1

        System.out.println("list3.indexOf(\"def\")\t"+list3.indexOf("def"));
        //判斷def是否重復
        if(list3.indexOf("def") != list3.lastIndexOf("def")){
            System.out.println("def重復了");
        }

        System.out.println("================================================");

        ListIterator listIter = list3.listIterator();
        while (listIter.hasNext()){
            System.out.println("listIter.next()\t"+listIter.next());
        }
        System.out.println("=============================");
        //listIterator
//        ListIterator listIter2 = list3.listIterator(list3.size());
//        while (listIter2.hasPrevious()){
//            System.out.println("listIter2.previous()\t"+listIter2.previous());
//        }

        LinkedList lList = new LinkedList();
        lList.addAll(list3);

        Object popItem = lList.pop(); //如果沒有元素會拋異常
        Object pollItem = lList.poll();

        System.out.println(pollItem);

    }

}

運行結果:

list1.size()    4
list2.size()    4
========================================================
list1.get(0)    張三
list1.get(1)    李四
list1.get(2)    李四
list1.get(3)    王五
=======================增強for遍歷=================================
item    張三
item    李四
item    李四
item    王五
=======================Iterator遍歷=================================
iterator Item   張三
iterator Item   李四
iterator Item   李四
iterator Item   王五
=======================forEach遍歷=================================
forEach item    張三
forEach item    李四
forEach item    李四
forEach item    王五
=======================add(index,Object el)=================================
list3 item  abc
list3 item  insert
list3 item  def
list3 item  jqk
=======================add(index,Object el)=================================
list3 item  abc
list3 item  update
list3 item  def
list3 item  jqk
list3.indexOf("def")    2
================================================
listIter.next() abc
listIter.next() update
listIter.next() def
listIter.next() jqk
=============================
update

Process finished with exit code 0

Map接口

Map內存儲的是鍵/值對這樣以成對的對象組(可以把一組對象當成一個元素),通過“鍵”對象來查詢“值”對象。
Map是不同于Collection的另外一種集合接口。
Map中,key值是唯一的(不能重復),而key對象是與value對象關聯在一起的。
Map接口有兩個實現:
HashMap — key/value對 是按照Hash算法存儲的。
TreeMap — key/value對是排序 (按key排序)存儲的。

Map接口常用方法

方法 含義
Object put(Object key,Object value) 將指定的值與此映射中的指定鍵相關聯
void putAll(Map t) 將映射t中所有映射關系復制到此映射中
Object get(Object key) 返回此映射中映射到指定鍵的值
Object remove(Object key) 若存在此鍵的映射關系,將其從映射中移除
boolean containsKey(Object key) 若此映射包含指定鍵的映射關系,返回 true
boolean containsValue(Object value) 若此映射為指定值映射一個或多個鍵,返回 true
int size() 返回此映射中的鍵-值映射對數
void clear() 從此映射中移除所有映射關系
boolean isEmpty() 若此映射未包含鍵-值映射關系,返回 true
Set keySet() 返回此映射中包含的鍵的 set 視圖

HashMap類

HashMap類是Map接口的實現類 基于哈希表的 Map 接口的實現

Student 類:

package com.CSDN.day26;

/**
 * Keafmd
 *
 * @ClassName: Student
 * @Description:
 * @Author: 牛哄哄的柯南
 * @Date: 2020/11/26 21:16
 **/
public class Student {
    String name;
    int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

講解代碼:

package com.CSDN.day26;

import java.util.*;

/**
 * Keafmd
 *
 * @ClassName: MyMap
 * @Description: Map
 * @Author: 牛哄哄的柯南
 * @Date: 2020/11/26 21:15
 **/
public class MyMap {
    public static void main(String[] args) {

        //對象的創建
        Map<String,Student> map = new HashMap<>();

        List<Student> stuList = new ArrayList();
        stuList.add(new Student("張飛",50));
        stuList.add(new Student("張飛1",36));
        stuList.add(new Student("張飛2",20));
        stuList.add(new Student("張飛3",58));

        //如果要查找某一個元素的屬性,需要遍歷集合后查找元素才能獲取舒心
        for (Student student : stuList) {
            if("張飛3".equals(student.getName())){
                System.out.println("student.age\t"+student.getAge());
                break;
            }
        }

        //put key不可以重復
        map.put("張飛",new Student("張飛",50));
        map.put("張飛1",new Student("張飛1",36));
        map.put("張飛2",new Student("張飛2",20));
        map.put("張飛3",new Student("張飛3",58));

        //get根據key獲取指定的元素,底層使用hash計算索引,快速查找元素
        Student stu = (Student) map.get("張飛3");
        System.out.println(stu.getAge());

        /**
         * int size()
         * void clear()
         * boolean isEmpty()
         */

//        map.clear();
        System.out.println("map.size\t"+map.size());
        System.out.println("map.isEmpty\t"+map.isEmpty());

        Map map2 = new HashMap();
        map2.put("張飛3",new Student("張飛3",999));
        map2.put("張飛4",new Student("張飛4",20));
        Student zf5 = new Student("張飛5", 58);
        map2.put("張飛5",zf5);

        map.putAll(map2);
        System.out.println("map.size\t"+map.size());

        System.out.println("map.get(\"張飛3\")\t"+map.get("張飛3").getAge());

        System.out.println("map.containsKey(\"張飛\")\t"+map.containsKey("張飛"));
        System.out.println("map.containsKey(\"張飛99\")\t"+map.containsKey("張飛99"));

        System.out.println("map.containsValue(new Student(\"張飛5\",58)\t"+map.containsValue(zf5));

        System.out.println("========================size==============================");
        System.out.println("map.size\t"+map.size());
        map.remove("張飛3");
        System.out.println("map.size\t"+map.size());

        //HashMap的遍歷

        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            System.out.printf("key:%s\tvalue:%s\r\n",key,map.get(key).toString());
        }

        System.out.println("================================================");

        Set<Map.Entry<String, Student>> entrySet = map.entrySet();
        for (Map.Entry<String, Student> stringStudentEntry : entrySet) {
            String key = stringStudentEntry.getKey();
            Student value = stringStudentEntry.getValue();
            System.out.printf("key:%s\tvalue:%s\r\n",key,value.toString());
        }
    }
}

運行結果:

student.age 58
58
map.size    4
map.isEmpty false
map.size    6
map.get("張飛3")  999
map.containsKey("張飛")   true
map.containsKey("張飛99") false
map.containsValue(new Student("張飛5",58) true
========================size==============================
map.size    6
map.size    5
key:張飛5 value:Student{name='張飛5', age=58}
key:張飛4 value:Student{name='張飛4', age=20}
key:張飛  value:Student{name='張飛', age=50}
key:張飛2 value:Student{name='張飛2', age=20}
key:張飛1 value:Student{name='張飛1', age=36}
================================================
key:張飛5 value:Student{name='張飛5', age=58}
key:張飛4 value:Student{name='張飛4', age=20}
key:張飛  value:Student{name='張飛', age=50}
key:張飛2 value:Student{name='張飛2', age=20}
key:張飛1 value:Student{name='張飛1', age=36}

Process finished with exit code 0

HashMap與TreeMap的比較

HashMap基于哈希表實現。
TreeMap基于樹實現。
HashMap可以通過調優初始容量和負載因子,優化HashMap空間的使用。
TreeMap沒有調優選項,因為該樹總處于平衡狀態
HashMap性能優于TreeMap。

HashMap與Hashtable的比較

Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現。
Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的。
HashMap允許將null作為一個entry的key或者value,而Hashtable不允許用null。

看完如果對你有幫助,感謝點贊支持!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內容