java中set集合基礎(chǔ)內(nèi)容

set集合的基本使用

無序并且不重復(fù)的集合,我們一般叫它為集。并且只能有一個null元素。
這個集合的作用是性能好。
Java.uitl 包里邊的內(nèi)容。
HashSet()

集合的遍歷:
因為HashSet集合的遍歷是先轉(zhuǎn)化成迭代器,然后通過迭代器進行遍歷。如下代碼:
迭代器的兩個方法:
hashNext() 表示的是判斷下一個是否還有數(shù)據(jù)
next()取出下一個數(shù)據(jù)

代碼:

package com.demo;

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

public class ListDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str1="blue";
        String str2="green";
        String str3="yellow";
        String str4="red";
        String str5="white";
        
        //生成一個集合
        Set hashset=new HashSet();
        //集合里邊添加新的數(shù)據(jù)
        hashset.add(str1);
        hashset.add(str2);
        hashset.add(str3);
        hashset.add(str4);
        hashset.add(str5);
        
        //轉(zhuǎn)換成迭代器
        Iterator it=hashset.iterator();
        //然后循環(huán)遍歷這個迭代器
        while(it.hasNext()) {
            System.out.println(it.next()+",");
        }
    }

}

輸出的結(jié)果是:
red,
green,
blue,
white,
yellow,

實例

Cat類的代碼:

package com.dem.set;

public class Cat {
    //先定義屬性
    private String name;
    private int age;
    private String species;
    
    //構(gòu)造方法
    public Cat(String name,int age,String species) {
        super();
        this.name=name;
        this.age=age;
        this.species=species;
    }
    
    //get and  seT方法
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name=name;
    }

    public int getAge() {
        return this.age;
    }
    public void setAge(int age) {
        this.age=age;
    }
    public String getSpecies() {
        return this.species;
    }
    public void setSpcies(String species) {
        this.species=species;
    }

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

cat類運行測試的代碼:

package com.dem.set;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
public class CatTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Cat cat1=new Cat("花花",10,"英國短毛貓");
        Cat cat2=new Cat("凡凡",8,"中華田園貓");
        
        Set catSet=new HashSet();
        catSet.add(cat1);
        catSet.add(cat2);
        Iterator it=catSet.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }

}


** 測試代碼輸出的結(jié)果是:**
Cat [姓名=花花, 年齡=10,品種=英國短毛貓]
Cat [姓名=凡凡, 年齡=8,品種=中華田園貓]

HashCode和equels的原理。
為什么要重寫。
以及這一次的Cat類的重寫。

equels方法是用來判斷類是否相等的默認方法。所以一個集合的兩個類是否相等調(diào)用的就是這個類的方法。
所以,我們只要重寫這個方法就可以改變類的是否相等方法。
類的對象都有默認的equels方法,一般指的是這個類的對象的地址。
如下代碼,對象的內(nèi)容是一樣的,但是兩個對象都可以添加進集合(set集合里邊是不重復(fù)):

        Cat cat1=new Cat("花花",10,"英國短毛貓");
        Cat cat2=new Cat("凡凡",8,"中華田園貓");
        //cat3和cat1的內(nèi)容是一樣的
        Cat cat3=new Cat("花花",10,"英國短毛貓");

輸出的結(jié)果是:
Cat [姓名=花花, 年齡=10,品種=英國短毛貓]
Cat [姓名=花花, 年齡=10,品種=英國短毛貓]
Cat [姓名=凡凡, 年齡=8,品種=中華田園貓]

修改eques方法后
equels方法改寫后的,如下代碼:

@Override
    public boolean equals(Object obj) {
        //如果兩個對象的引用是相等,那么這兩個對象肯定是相等的
        if(this==obj) {
            return true;
        }
        //判斷某個對象的類方法是getClass,這個判斷只能雙等于
        if(obj.getClass()==this.getClass()) {
            //如果要使用這個類的方法,就需要轉(zhuǎn)成這個類
            Cat objCat=(Cat)obj;
            return objCat.getName()==this.getName() && 
                    objCat.getAge()==this.getAge() && objCat.getSpecies()==this.getSpecies();
        }
        
        return false;
    }

修改后的輸出結(jié)果:
Cat [姓名=花花, 年齡=10,品種=英國短毛貓]
Cat [姓名=凡凡, 年齡=8,品種=中華田園貓]

泛型

就是規(guī)定某個集合、或者某個迭代器、或者某個變量接收的內(nèi)容是固定的某個類型。
泛型的語法是<類型>這樣的方式表示的。
例如以下代碼:

        Set<Cat> catSet=new HashSet<Cat>();
        catSet.add(cat1);
        catSet.add(cat2);
        catSet.add(cat3);
        Iterator<Cat> it=catSet.iterator();

集合的的for循環(huán)遍歷

for(Cat cat:set){} 這樣的方式進行遍歷的。
set表示集合,cat表示集合里邊的每一個內(nèi)容。
因為set的無序的集合,所以遍歷的時候也是無序的。如果在遍歷的過程中出現(xiàn)刪除的現(xiàn)象,那么集合的順序又會別打亂,這時遍歷就會報錯。
如下時報錯的代碼:

Cat cat1=new Cat("花花",10,"英國短毛貓");
        Cat cat2=new Cat("凡凡",8,"中華田園貓");
        //cat3和cat1的內(nèi)容是一樣的
        Cat cat3=new Cat("花花",10,"英國短毛貓");
        
        Set<Cat> catSet=new HashSet<Cat>();
        catSet.add(cat1);
        catSet.add(cat2);
        catSet.add(cat3);
        for(Cat cat:catSet) {
            if(cat.getName()=="花花") {
                //set集合是無序的,刪除后集合會有變動。這樣會報錯。
                catSet.remove(cat);
            }
            System.out.println("結(jié)束了");
        }

所報錯誤:
結(jié)束了
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMapHashIterator.nextNode(Unknown Source) at java.util.HashMapKeyIterator.next(Unknown Source)
at com.dem.set.CatTest.main(CatTest.java:19)

解決辦法
如果是刪除一個元素,那么刪除后直接break;
如果刪除多個元素可以用,set.removeAll(集合);可以把多個元素放入到這個集合再進行刪除。

Map

Map是鍵值對的方式。
可以為null,但是不能夠重復(fù)。
HashMap是這個Map的一個子類,使用Hash完成商品的信息。
實例如下:

Scanner consle=new Scanner(System.in);
        Map<String,Good> goodMap=new HashMap<String,Good>();
        
        int i=0;
        while(i<3) {
            System.out.println("請輸入商品的3條信息:");
            System.out.println("**********************");
            System.out.println("請輸入商品的id");
            String goodId=consle.next();
            System.out.println("請輸入商品的名稱");
            String goodName=consle.next();
            System.out.println("請輸入商品的價格");
            double goodPrice=consle.nextDouble();
            //把輸入的內(nèi)容添加到商品
            Good good=new Good(goodId,goodName,goodPrice);
            goodMap.put(goodId, good);
            i++;
        }
        //關(guān)閉輸入流
        consle.close();
        //輸出商品的內(nèi)容
        Iterator<Good> itGood=goodMap.values().iterator();
        while(itGood.hasNext()) {
            System.out.println(itGood.next());
        }
        
        System.out.println("***程序結(jié)束***");
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Java集合類可用于存儲數(shù)量不等的對象,并可以實現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 2,089評論 0 13
  • 四、集合框架 1:String類:字符串(重點) (1)多個字符組成的一個序列,叫字符串。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 874評論 0 2
  • 今日任務(wù)1、TreeSet介紹(掌握TreeSet集合的應(yīng)用)2、Comparable 接口介紹(掌握)3、Com...
    Villain丶Cc閱讀 1,962評論 0 1
  • 1 集合 1.1 集合介紹 ??集合是java中提供的一種容器,可以來存儲多個數(shù)據(jù)。在前面的學習中,我們知道數(shù)據(jù)多...
    圣堂刺客_x閱讀 338評論 0 0
  • 今日任務(wù) 1、集合框架繼承體系(理解)2、Collection接口介紹(掌握常用Collection方法)3、迭代...
    Villain丶Cc閱讀 991評論 0 12

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