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 hs = new HashSet();

Set set = new HashSet();//父类接口引用指向子类对象,因为接口不能实例化所以后面必须跟new  HashSet

//不过需要注意的是,如果使用父类的引用去指向子类的对象,那就没办法去使用子类成员的方法。

//添加集合元素

set.add("Hello");

set.add("World");

//集合转成数组,然后遍历集合对象

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

for(int x=0;x

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

}*/

//迭代器遍历集合

/*Iterator  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 hs = new HashSet();

//创建元素对象

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;

}

}

你可能感兴趣的:(Set接口的特点及HashSet)