黑马程序员——java集合中的HashSet

 

 

 

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

1.        java集合框架中的Set接口:

Java的集合类主要由两个接口派生而出:Collection和Map.

Collection接口派生出了两个重要的子接口:List、Set;

在实现Set接口中的子类中有两个非常重要的类:HashSet 和TreeSet;

2.        Set集合中元素特点:

a)      元素的唯一性:存入Set集合中的每个元素都必须是唯一的,Set集合不允许重复元素的存在。这与List集合完全不同,List集合允许对同一个对象进行多次存入;

b)      元素存取的无序性:该无序指的是元素取出时的顺序与存入时的顺序在大多情况下都是不一致的;而List集合取出时元素的顺序与存入时的顺序完全相同;

c)      元素在内存中的有序性:虽然Set集合中的元素在取出时看起来像是无序的,但是这些元素在内存中的排列时有序的,比如HashSet集合中的元素实际上是按元素的hashcode值的大小依次排列的,而TreeSet集合中的元素则是按对象的自然顺序或是程序员指定的顺序进行排列的;

3.       Set集合中的HashSet:

HashSet集合底层数据结构是哈希表,它是线程不同步的。

HashSet保证元素唯一性的方式是通过元素的hashCode()方法和equals()方法完成的。所以要把自定义类的对象存入HashSet集合时,一般都需要复写类中的hashCode() 和 equals() 方法。

由于HashSet集合要求存入其中的元素具有唯一性,所以当有元素要存入HashSet集合时,集合会将该元素与集合中已有元素进行比较,以便查看该元素是否已存在。

HashSet集合判断元素是否已存在的方法是:先判断两个对象的hashcode值,若它们的hashcode值不同,则不是同一个对象;若它们的hashcode值相同,就再根据equals() 方法中定义的方式,判断两个对象的内容是否相同:若不相同则不是同一个对象,若相同则就判定这两个对象为同一个对象,这时该对象就不能被存储进HashSet集合。注意:当元素的hashCode值相同时,才继续判断元素的equals()方法返回值是否为true。

4.       HashSet集合的应用:

自定义Person类,创建多个Person类对象并把对象存储在HashSet 集合中,认为姓名相同且年龄相同即为同一个人。

代码如下:

import java.util.HashSet;

 

public class HashSetDemo {

 

       public static void main(String[] args) {

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

              hs.add(newPerson("zhangsan",20,"male"));

              hs.add(newPerson("lisi",22,"male"));

              hs.add(new Person("zhangsan",20,"male")); //向集合中添加姓名,年龄,性别均相同的对象;

              hs.add(new Person("zhangsan",20,"female"));//向集合中添加姓名,年龄相同,性别不同的对象;

              for (Person p : hs){

                     System.out.println(p);

              }

       }

}

class Person{

       private String name;

       private int age;

       private String sex;

       public Person(String name, int age, String sex) {

              super();

              this.name = name;

              this.age = age;

              this.sex=sex;

       }

       @Override    //用MyEclipse自动生成的方式复写hashCode()方法;

       public int hashCode() {

              final int prime = 31;

              int result = 1;

              result = prime * result + age;

              result = prime * result + ((name == null) ? 0 : name.hashCode());

              return result;

       }

       @Override   用MyEclipse自动生成的方式复写equals()方法;

       public boolean equals(Object obj) {

              if (this == obj)

                     return true;

              if (obj == null)

                     return false;

              if (getClass() != obj.getClass())

                     return false;

              Person other = (Person) obj;

              if (age != other.age)

                     return false;

              if (name == null) {

                     if (other.name != null)

                            return false;

              } else if (!name.equals(other.name))

                     return false;

              return true;

       }

       @Override    复写hashCode()方法;

       public String toString() {

              return "Person [name=" + name + ",age=" + age + ", sex=" + sex + "]";

       }

}

该段代码打印结果为:

Person [name=lisi,age=22, sex=male]

Person[name=zhangsan, age=20, sex=male]

该段代码在编写时向HashSet集合中添加了四个对象,但是最终添加成功的只有两个对象,这是由于:复写hashCode()方法时,参与hashcode值元素的只有name 和 age两个属性,所以当两个对象的姓名和年龄相同时将会调用equals()方法;而复写的equals()方法只是比较了对象的姓名和年龄,而对性别视而不见,所以当两个对象的姓名和年龄相同时即认为是同一个人,经他们的性别并不相同;


---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值