集合之ArrayList,HashSet,HashMap


結合框架的體系結構:

一、List(列表)

1. List的特點

(1)List是元素有序並且可以重復的集合,稱為序列

(2)List可以精確的控制每個元素的插入位置,或刪除某個位置的元素

(3)List的兩個主要實現類是ArrayList和LinkList

2. ArrayList的特點

(1)ArrayList底層是由數組實現的

(2)動態增長,以滿足應用程序的需求

(3)在列比餓哦尾部插入或刪除數據非常有效

(4)更適合查找和更新元素

(5)ArrayList中的元素可以為null

以下是通過例題演示常用方法的使用:

在ArrayList中存儲並操作字符串信息

例一需求:用ArrayList存儲編程語言的名稱並輸出,名稱報告Java,C,C++,Go,Swift

package com.mpp.set;

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

public class ListDemo1 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("java");
        list.add("python");
        list.add("c");
        list.add("swift");

        //輸出list中的元素個數
        System.out.println(list.size());
        //遍歷輸出所有變成語言
        for(int i=0;i<list.size();i++){
            System.out.print(list.get(i)+" ");
        }
        System.out.println();
        //移除Python
//        list.remove(1);  //根據indexof移除
        list.remove("python");   //根據元素內容移除
        for(int i=0;i<list.size();i++){
            System.out.print(list.get(i)+" ");
        }

    }
}

在ArrayList中添加自定義的類的對象

例二需求:公告管理,公告的添加和顯示,在指定位置處插入公告,刪除公告,修改公告

  公告類屬性:編號id,標題title,創建人creator,創建時間createTime

  公告類方法:構造方法,獲取和設置屬性值的方法(get/set方法)

公告類的代碼:

package com.mpp.set;

import java.util.Date;

public class Notice {
    //屬性:id,title,crator,creatTime
    private int id;
    private String title;
    private String creator;
    private Date createTime;

    public Notice(){}  //無參構造

    //帶參構造
    public Notice(int id,String title,String creator,Date createTime){
        super();
        this.id = id;
        this.title = title;
        this.creator = creator;
        this.createTime = createTime;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getCreator() {
        return creator;
    }

    public void setCreator(String creator) {
        this.creator = creator;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}

公告管理類的代碼:package com.mpp.set;

 

package com.mpp.set;

import com.sun.tools.corba.se.idl.constExpr.Not;

import java.util.ArrayList;
import java.util.Date;

public class NoticeTest {
    public static void main(String[] args) {
        //創建notice的對象,生成三條公告
        Notice no1 = new Notice(1,"hello word!","admin",new Date());
        Notice no2 = new Notice(2,"交作業!","teacher",new Date());
        Notice no3 = new Notice(3,"考勤通知","teacher",new Date());

        //添加公告
        ArrayList noList = new ArrayList();
        noList.add(no1);
        noList.add(no2);
        noList.add(no3);

        //顯示公告
        System.out.println("公告的內容為:");
        for(int i=0;i<noList.size();i++){
            Notice notice = (Notice)(noList.get(i));
            System.out.println(i+1+":"+notice.getTitle());
        }

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

        //在第一條公告后面添加一條新公告
        Notice no4 = new Notice(4,"在線編輯器可以使用了","admin",new Date());
        noList.add(1,no4);
        System.out.println("公告的內容為:");
        for(int i=0;i<noList.size();i++){
            Notice notice = (Notice)(noList.get(i));
            System.out.println(i+1+":"+notice.getTitle());
        }

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

        //刪除公告
        noList.remove(2);
        System.out.println("公告的內容為:");
        for(int i=0;i<noList.size();i++){
            Notice notice = (Notice)(noList.get(i));
            System.out.println(i+1+":"+notice.getTitle());
        }

        System.out.println("************************");
        
        //修改公告
        no4.setTitle("修改title:python在線編譯器可以使用了");
        noList.set(1,no4);     //我發現有沒有這一行都不影響修改后的list的顯示
        System.out.println("公告的內容為:");
        for(int i=0;i<noList.size();i++){
            Notice notice = (Notice)(noList.get(i));
            System.out.println(i+1+":"+notice.getTitle());
        }
    }
}

二、Set(集合)

1.Set的特點

  (1)Set是元素無序並且不可以重復的集合, 被稱為集

2.HashSet的特點 

  (1)HashSet是Set的一個重要實現類,稱為哈希集

  (2)HashSet中的元素無序並且不可以重復

  (3)HashSet中只允許一個null元素

  (4)具有良好的存取和查找性能

注意:在Set顯示所有元素需要用到Iterator(迭代器),迭代器有以下特點:

  (1)Iterator接口可以以統一的方式對各種集合元素進行遍歷

  (2)hasNext()方法檢測集合中是否還有下一個元素

  (3)next()方法返回集合中的下一個元素

以下是通過例題演示常用方法的使用:

在HashSet中存儲並操作字符串信息

例一需求:用HashSet存儲多個標識顏色的英文單詞,並輸出,比如:blue,red,black,yellow等等

package com.mpp.set;

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

public class WordDemo {
    public static void main(String[] args) {
        //將英文檔次添加到HashSet中
        Set set = new HashSet();
        //向集合中添加元素
        set.add("red");
        set.add("blue");
        set.add("black");
        set.add("yellow");
        set.add("white");
        //顯示集合的內容
        System.out.println("集合中的元素為:");
        Iterator it = set.iterator();   //放進迭代器,使用迭代器遍歷顯示元素
        //遍歷迭代器並輸出元素
        while(it.hasNext()){
            System.out.print(it.next()+ " ");
        }
//        set.add("green"); //set是無序的,所以插入就是增加
        System.out.println();
        set.add("red");   //set不允許插入重復元素,插入失敗,但是不會報錯
        it = set.iterator();
        System.out.println("插入重復元素后:");
        while(it.hasNext()){
            System.out.print(it.next()+ " ");
        }
    }
}

運行結果如下:

集合中的元素為:
red blue white black yellow 
插入重復元素后:
red blue white black yellow 

在HashSet中添加自定義的類的對象

例二需求:寵物貓信息管理

添加和顯示寵物貓信息

查找某只寵物貓的信息並輸出

修改寵物貓的信息

刪除寵物貓的信息

寵物貓的屬性:name,month,species

寵物貓的方法:構造方法,獲取和設置屬性值的方法(get/set),其他方法

Cat類:

package com.mpp.set;

public class Cat {
    private String name;    //名字
    private int mounth;     //年齡
    private String species;//品種

    public Cat(String name,int mounth,String species){
        super();
        this.setName(name);
        this.setMounth(mounth);
        this.setSpecies(species);
    }

    public String getName() {
        return name;
    }

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

    public int getMounth() {
        return mounth;
    }

    public void setMounth(int mounth) {
        this.mounth = mounth;
    }

    public String getSpecies() {
        return species;
    }

    public void setSpecies(String species) {
        this.species = species;
    }
}

 CatTest類:

package com.mpp.set;

import javax.swing.text.html.HTMLDocument;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class CatTest {
    public static void main(String[] args) {
        //定義寵物貓對象
        Cat cafe = new Cat("cafe",12,"英短");
        Cat milk = new Cat("milk",1,"藍貓");
        //將寵物貓對象放入HashSet中
        Set set = new HashSet();
        set.add(cafe);
        set.add(milk);

        //顯示寵物貓的信息
        Iterator it = set.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

運行結果:

com.mpp.set.Cat@610455d6
com.mpp.set.Cat@511d50c0

這里顯示的是對象再內存中的地址信息,因此我們需要在Cat類中重寫toString方法

    //toString方法重寫
    @Override
    public String toString(){
        return "[姓名:"+name+",年齡:"+mounth+",品種:"+species+"]";
    }

再次運行結果:

[姓名:cafe,年齡:12,品種:英短]
[姓名:milk,年齡:1,品種:藍貓]

添加重復的寵物貓數據

Cat類不變,CatTest類的代碼修改如下:

package com.mpp.set;

import javax.swing.text.html.HTMLDocument;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class CatTest {
    public static void main(String[] args) {
        //定義寵物貓對象
        Cat cafe = new Cat("cafe",12,"英短");
        Cat milk = new Cat("milk",1,"藍貓");
        //將寵物貓對象放入HashSet中
        Set set = new HashSet();
        set.add(cafe);
        set.add(milk);

        //顯示寵物貓的信息
        Iterator it = set.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }

        //再添加一個與milk屬性一樣的貓
        Cat milk01 = new Cat("milk",1,"藍貓");
        set.add(milk01);
        System.out.println("添加重復數據,milk01:");
        it = set.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

運行結果:

[姓名:cafe,年齡:12,品種:英短]
[姓名:milk,年齡:1,品種:藍貓]
添加重復數據,milk01:
[姓名:cafe,年齡:12,品種:英短]
[姓名:milk,年齡:1,品種:藍貓]
[姓名:milk,年齡:1,品種:藍貓]

這里的運行結果,添加重復的寵物貓信息添加成功了

再次修改Cat類的代碼,重寫hashCode和equals方法,CatTest類代碼不動:

package com.mpp.set;

public class Cat {
    private String name;    //名字
    private int mounth;     //年齡
    private String species;//品種

    public Cat(String name,int mounth,String species){
        super();
        this.setName(name);
        this.setMounth(mounth);
        this.setSpecies(species);
    }

    public String getName() {
        return name;
    }

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

    public int getMounth() {
        return mounth;
    }

    public void setMounth(int mounth) {
        this.mounth = mounth;
    }

    public String getSpecies() {
        return species;
    }

    public void setSpecies(String species) {
        this.species = species;
    }

    //toString方法重寫
    @Override
    public String toString(){
        return "[姓名:"+name+",年齡:"+mounth+",品種:"+species+"]";
    }

    @Override
    public int hashCode(){
        final int prime = 31;
        int result = 1;
        result = prime * result + mounth;
        result = prime * result +((name == null)?0:name.hashCode());
        result = prime * result +((species == null)?0:species.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj){
        if(this==obj){    //判斷對象是都相等,相等則返回true,不用繼續比較屬性
            return true;
        }
        if(obj.getClass()==Cat.class){  //判斷obj是是不是Cat的對象
            Cat cat = (Cat)obj;
            return cat.getName().equals(name)&&(cat.getMounth()==mounth)&&(cat.getSpecies().equals(species));
        }
        return false;
    }
}

運行結果:

[姓名:milk,年齡:1,品種:藍貓]
[姓名:cafe,年齡:12,品種:英短]
添加重復數據,milk01:
[姓名:milk,年齡:1,品種:藍貓]
[姓名:cafe,年齡:12,品種:英短]

查找寵物貓信息:

第一種:通過對象名查找

第二種:通過寵物貓的名字查找

在CatTest增加代碼:

//重新插入一個新寵物貓
        Cat cafe02 = new Cat("cafe2.0",2,"中華田園貓");
        set.add(cafe02);
        System.out.println("添加cafe2.0后的寵物貓信息");
        it = set.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }

        //在集合中查找cafe的信息並輸出,第一種方法:使用對象名去查找
        if(set.contains(cafe)){
            System.out.println("cafe找到了");
            System.out.println(cafe);
        }
        else{
            System.out.println("cafe沒找到");
        }

        //通過寵物貓的名字查找,遍歷set中的元素,取出name,和要查找的寵物名對比
        System.out.println("通過寵物貓名字查找:");
        boolean flag = false;
        Cat c= null;
        it = set.iterator();
        while(it.hasNext()){
            c = (Cat)(it.next());
            if(c.getName().equals("cafe")){
                flag = true;
                break;
            }
        }
        if(flag){
            System.out.println("cafe找到了");
            System.out.println(c);
        }
        else{
            System.out.println("cafe沒找到");
        }

引入泛型(<Cat>)的概念后刪除數據,代碼如下:

package com.mpp.set;

import javax.swing.text.html.HTMLDocument;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class CatTest {
    public static void main(String[] args) {
        //定義寵物貓對象
        Cat cafe = new Cat("cafe",12,"英短");
        Cat milk = new Cat("milk",1,"藍貓");
        //將寵物貓對象放入HashSet中
        Set<Cat> set = new HashSet<Cat>();    //<Cat>泛型,限制加入hashset中的元素都得是Cat類型
        set.add(cafe);
        set.add(milk);

        //顯示寵物貓的信息
        Iterator<Cat> it = set.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }

        //再添加一個與milk屬性一樣的貓
        Cat milk01 = new Cat("milk",1,"藍貓");
        set.add(milk01);
        System.out.println("添加重復數據,milk01:");
        it = set.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }

        //重新插入一個新寵物貓
        Cat cafe02 = new Cat("cafe2.0",2,"中華田園貓");
        set.add(cafe02);
        System.out.println("添加cafe2.0后的寵物貓信息");
        it = set.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }

        //在集合中查找cafe的信息並輸出,第一種方法:使用對象名去查找
        if(set.contains(cafe)){
            System.out.println("cafe找到了");
            System.out.println(cafe);
        }
        else{
            System.out.println("cafe沒找到");
        }

        //通過寵物貓的名字查找,遍歷set中的元素,取出name,和要查找的寵物名對比
        System.out.println("通過寵物貓名字查找:");
        boolean flag = false;
        Cat c= null;
        it = set.iterator();
        while(it.hasNext()){
            c = (it.next());
            if(c.getName().equals("cafe")){
                flag = true;
                break;
            }
        }
        if(flag){
            System.out.println("cafe找到了");
            System.out.println(c);
        }
        else{
            System.out.println("cafe沒找到");
        }

        //刪除cafe02的信息並重新輸出
        for(Cat cat:set){
            if("cafe2.0".equals(cat.getName())){
                set.remove(cat);
            }
        }
        System.out.println("刪除cafe2.0后的數據:");
        for(Cat cat:set){
            System.out.println(cat);
        }

        //刪除集合中的所有寵物貓信息
        System.out.println("刪除所有寵物貓信息");
        boolean flag1 = set.removeAll(set);
        if(set.isEmpty()){    //這里可以通過判斷flag1是否為空和set.isEmpty()兩種辦法來判斷是否刪除完數據
            System.out.println("貓都沒了");
        }
        else{
            System.out.println("貓還在---");
        }
    }
}

注意:set.remove(set)  這里的第二個set可以是set的一個子集

三、Map

1. Map的特點

(1)Map中的數據是以鍵值對的形式存儲的

(2)k-v以Entry類型的對象實例存在

(3)可以通過key值快速地查找value

(4)一個映射不能包含重復的鍵

(5)每個鍵最多只能映射到一個值

2. HashMap的特點

(1)基於哈希表的Map接口的實現

(2)允許使用null值和null鍵

(3)key值不允許重復

(4)HashMap中的Entry對象是無序排列的

以下是通過例題演示常用方法的使用:

在HashMap中存儲並操作字符串信息

例一需求:完成一個類似字典的功能

  將單詞以及單詞的注釋存儲到HashMap中

  顯示HashMap中的內容

  查找某個單詞的注釋並顯示

package com.mpp.set;

import java.util.*;

public class DictionaryDemo {
    public static void main(String[] args) {
        //定義一個HashMap的對象
        Map<String,String> animal = new HashMap<String,String>();
        System.out.println("請輸入三組單詞對應的注釋,並存放到HashMap中");
        Scanner console = new Scanner(System.in);
        //添加數據
        int i = 0;
        while(i<3){
            System.out.println("請輸入key值:");
            String key = console.next();
            System.out.println("請輸入value值:");
            String value = console.next();
            animal.put(key,value);
            i++;
        }
        //打印輸出value的值(直接使用迭代器)
        System.out.println("使用迭代器輸出所有value:");
        Iterator<String> it = animal.values().iterator();
        while (it.hasNext()){
            System.out.print(it.next()+" ");
        }
        System.out.println();

        //打印輸出key和value的值
        //通過entrySet方法
        System.out.println("通過entrySet得到k-v:");
        Set<Map.Entry<String,String>> entrySet = animal.entrySet();
        for(Map.Entry<String,String> entry:entrySet){
            System.out.print(entry.getKey()+"-");
            System.out.print(entry.getValue());
            System.out.println();
        }

        //通過單詞找到注釋並輸出
        //使用keySet方法
        System.out.println("請輸入要查找的單詞:");
        String strSearch =console.next();
        //1. 取到keySet
        Set<String> keySet = animal.keySet();
        //2.遍歷keySet
        for(String key:keySet){
            if(strSearch.equals(key)){
                System.out.println("找到了!鍵值對為:"+key+animal.get(key));
                break;
            }
        }
    }
}

在HashMap中添加自定義的類的對象

例二需求:商品信息管理

  使用HashMap對商品信息進行管理

    其中key為商品編碼,value為商品對象

  對HashMap中的商品信息進行增刪改查操作

商品信息類

屬性:商品編號,名稱,價格

方法:構造方法,獲取和設置屬性值的方法,其他方法

商品類:

package com.mpp.set;

public class Goods {
    private String id;
    private String name;
    private double price;

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public void setId(String id) {
        this.id = id;
    }

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

    public void setPrice(double price) {
        this.price = price;
    }

    public Goods(String id,String name,double price){
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public String toString(){
        return "商品編號:"+id+",商品名稱:"+name+",商品價格:"+price;
    }

}

商品信息類:

package com.mpp.set;

import java.util.*;

public class GoodsTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //定義HashMap對象
        Map<String,Goods> goodsMap = new HashMap<String,Goods>();
        System.out.println("請輸入三條商品信息:");
        int i= 0;
        while(i<3){
            System.out.println("請輸入第"+(i+1)+"條商品信息:");
            System.out.println("請輸入商品編號:");
            String goodsId = sc.next();
            //判斷商品編號id是否已存在
            if(goodsMap.containsKey(goodsId)){
                System.out.println("商品編號已存在!請重新輸入!");
                continue;//結束當前循環,進入下一次循環
            }
            System.out.println("請輸入商品名稱:");
            String goodsName = sc.next();
            System.out.println("請輸入商品價格:");
            double goodsPrice = 0;
            try{
                goodsPrice = sc.nextDouble();
            }
            catch (InputMismatchException e){
                System.out.println("商品價格的格式不正確,請輸入數值型數據!");
                sc.nextInt();  //如果沒有這一句,出現異常時,這里輸入的價格直接變成下一個輸入的商品編號
                continue;
            }


            Goods goods = new Goods(goodsId,goodsName,goodsPrice);
            //將商品信息添加到HashMap中
            goodsMap.put(goodsId,goods);
            i++;
        }
        //比那里Map,輸出商品信息
        System.out.println("商品的全部信息為:");
        Iterator<Goods> itGoods = goodsMap.values().iterator();
        while(itGoods.hasNext()){
            System.out.println(itGoods.next());
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM