JavaSE集合類

JavaSE集合類

  • 概述
    • Java中集合類概述
    • Java中數(shù)組與集合的比較
    • Java中集合框架層次結(jié)構(gòu)
  • Collection接口
    • Collection接口常用方法
  • Set接口
  • List接口
    • List接口常用方法
    • ArrayList
    • LinkedList
  • Map接口
    • Map接口常用方法
    • HashMap類
    • HashMap與TreeMap的比較
    • HashMap與Hashtable的比較

概述

Java中集合類概述

Java中集合類是用來存放對象的
集合相當(dāng)于一個(gè)容器,里面包容著一組對象 —— 容器類
其中的每個(gè)對象作為集合的一個(gè)元素出現(xiàn)
Java API提供的集合類位于java.util包內(nèi)

Java中數(shù)組與集合的比較

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

Java中集合框架層次結(jié)構(gòu)

Collection接口

· 一組稱為元素的對象
· 一個(gè)Collection中可以放不同類型的數(shù)據(jù)
· 是Set接口和List接口的父類
· 是否有特定的順序以及是否允許重復(fù),取決于它的實(shí)現(xiàn)

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

Collection接口常用方法

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

Set接口

Set接口
· Collection的子接口
· 用來包含一組 無序無重復(fù) 的對象
無序 — 是指元素存入順序和集合內(nèi)存儲的順序不同;
無重復(fù) — 兩個(gè)對象e1和e2,如果e1.equals(e2)返回true,則認(rèn)為e1和e2重復(fù),在set中只保留一個(gè)。
Set接口的實(shí)現(xiàn)類
· HashSet — HashSet的特性在于其內(nèi)部對象的散列存取,即采用哈希技術(shù)
· 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) {
        //類的構(gòu)造
        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());

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

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

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

        //判斷是否包含某個(gè)元素
        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("移除后的元素個(gè)數(shù): "+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
    }

}

運(yùn)行效果:

set.size(): 3
set2.size(): 3
set2.isEmpty(): false
set2.contains(60): true
set2.contains(200): true
元素: 50
元素: 200
元素: 60
移除后的元素個(gè)數(shù): 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中如果存在多個(gè)重復(fù)元素,indexOf()
ListIterator listIterator() 返回列表中元素的列表迭代器
Object remove(int index) 移除列表中指定位置的元素
Object set(int index,Object element) 用指定元素替換列表中指定位置的元素

ArrayList與LinkedList的比較:
存儲結(jié)構(gòu):
ArrayList是線性順序存儲。
LinkedList對象間彼此串連起來的一個(gè)鏈表。
操作性能:
ArrayList適合隨機(jī)查詢的場合。
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("========================================================");
        //通過下標(biāo)的形式訪問每一個(gè)元素
//        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("=======================增強(qiáng)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是否重復(fù)
        if(list3.indexOf("def") != list3.lastIndexOf("def")){
            System.out.println("def重復(fù)了");
        }

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

}

運(yùn)行結(jié)果:

list1.size()    4
list2.size()    4
========================================================
list1.get(0)    張三
list1.get(1)    李四
list1.get(2)    李四
list1.get(3)    王五
=======================增強(qiáng)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("========================================================");
        //通過下標(biāo)的形式訪問每一個(gè)元素
//        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("=======================增強(qiáng)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是否重復(fù)
        if(list3.indexOf("def") != list3.lastIndexOf("def")){
            System.out.println("def重復(fù)了");
        }

        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);

    }

}

運(yùn)行結(jié)果:

list1.size()    4
list2.size()    4
========================================================
list1.get(0)    張三
list1.get(1)    李四
list1.get(2)    李四
list1.get(3)    王五
=======================增強(qiáng)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內(nèi)存儲的是鍵/值對這樣以成對的對象組(可以把一組對象當(dāng)成一個(gè)元素),通過“鍵”對象來查詢“值”對象。
Map是不同于Collection的另外一種集合接口。
Map中,key值是唯一的(不能重復(fù)),而key對象是與value對象關(guān)聯(lián)在一起的。
Map接口有兩個(gè)實(shí)現(xiàn):
HashMap — key/value對 是按照Hash算法存儲的。
TreeMap — key/value對是排序 (按key排序)存儲的。

Map接口常用方法

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

HashMap類

HashMap類是Map接口的實(shí)現(xiàn)類 基于哈希表的 Map 接口的實(shí)現(xiàn)

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) {

        //對象的創(chuàng)建
        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));

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

        //put key不可以重復(fù)
        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根據(jù)key獲取指定的元素,底層使用hash計(jì)算索引,快速查找元素
        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());
        }
    }
}

運(yùn)行結(jié)果:

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基于哈希表實(shí)現(xiàn)。
TreeMap基于樹實(shí)現(xiàn)。
HashMap可以通過調(diào)優(yōu)初始容量和負(fù)載因子,優(yōu)化HashMap空間的使用。
TreeMap沒有調(diào)優(yōu)選項(xiàng),因?yàn)樵摌淇偺幱谄胶鉅顟B(tài)
HashMap性能優(yōu)于TreeMap。

HashMap與Hashtable的比較

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

看完如果對你有幫助,感謝點(diǎn)贊支持!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容