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.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é)束***");