Set接口的特點及HashSet

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

//使用HashSet存儲字符串并遍歷

/*Set集合的特點:

無序存放(存儲和讀取的順序有可能不一樣)

沒有索引和list不同

不允許元素重復(元素是惟一的)*/

public class HashSetDemo {

public static void main(String[] args) {

//創建集合對象

//HashSet<String> hs = new HashSet<String>();

Set<String> set = new HashSet<String>();//父類接口引用指向子類對象,因為接口不能實例化所以后面必須跟new? HashSet

//不過需要注意的是,如果使用父類的引用去指向子類的對象,那就沒辦法去使用子類成員的方法。

//添加集合元素

set.add("Hello");

set.add("World");

//集合轉成數組,然后遍歷集合對象

/*Object[] obj = set.toArray();

for(int x=0;x<obj.length;x++){

System.out.println(obj[x]);

}*/

//迭代器遍歷集合

/*Iterator<String>? it = set.iterator();

while(it.hasNext()){

String s = it.next();

System.out.println(s);

}*/

//增強for遍歷

for(String s:set){

System.out.println(s);

}

}

}

2.使用HashSet存儲自定義對象并遍歷:

package set_day01;

//使用HashSet存儲自定義對象并遍歷

//存儲的自定義對象無法去重,所以下面重寫了equals方法和HashCode方法

/*HashSet的add()方法不能去重的原因:

* 1.通過查找源碼發現,HashSet的add方法,首先會使用當前集合的每一個元素

* 和新添加的元素進行hash值(也可以說是地址值的比較),如果hash值不一樣,則直接添加新的元素。

* 2.如果hash值一樣,則進行比較地址值或者使用equals方法進行其他東西的比較,

* 所有東西的比較結果都不一樣,則添加元素。

* 實現HashSet存儲自定義對象并去重的步驟

* 第一步:重寫hashCode方法,默認返回相等,先比較hash值,如果相等

* 則進行第二步,執行equals方法

* 第二步:重些equals方法,默認返回true,即說明兩個元素是相等的

* 不予以添加。

*

*/

import java.util.HashSet;

public class HashSetDemo2 {

public static void main(String[] args) {

//創建集合對象

HashSet<Student> hs = new HashSet<Student>();

//創建元素對象

Student s = new Student("liqianqian",18);

Student s2 = new Student("fanhaolan",18);

Student s3 = new Student("fanhaolan",18);

//添加元素對象

hs.add(s);

hs.add(s2);

hs.add(s3);

//遍歷集合對象,使用增強for

for (Student student : hs) {

System.out.println(student);

}

}

}

class Student{

String name;

int? age;

public Student(String name,int age){

this.name=name;

this.age=age;

}

@Override

public String toString() {

return "Student [name=" + name + ", age=" + age + "]";

}

@Override

public boolean equals(Object obj) {

Student s = (Student) obj;//向下轉型,可以獲取子類特有成員

//比較年齡是否相等,如果不相等,返回false

if(this.age !=s.age){

return false;

}

//比較姓名是否相等,如果相等返回false

if(!(this.name).equals(s.name)){

return false;

}

//默認返回true,說明兩個學生時相等的

return true;

}

@Override

public int hashCode() {

// TODO Auto-generated method stub

return 1;

}

}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容