Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 352|回复: 0

[集合学习]老紫竹JAVA提高教程(2)-认识Set集合之HashSet

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-2 00:01:04 | 显示全部楼层 |阅读模式
    集合在java里面的作用非凡,我们常用的有Set,List和Map三种,我们先熟悉一下Set,特别是HashSet的使用

    package collection.lession2;
    import java.util.HashSet;
    import java.util.Set;
    /**
    * 老紫竹JAVA提高教程(2)-认识Set集合之HashSet。<br>
    * Set用来保存不允许重复的数据。可以是任何对象类型。<br>
    * JDK5以后,主类型可以通过autobox 放入Set里面。
    *
    * @author 老紫竹 JAVA世纪网(java2000.net)
    *
    */
    public class Lession2 {
      public static void main(String[] args) {
        // 普通测试
        testNormal();
        // 测试HashSet的特殊性
        testForHashSet();
        testForHashSet2();
      }
      /**
       * 测试保存混合类型的数据.
       */
      public static void testNormal() {
        System.out.println("----- testNormal -----------");
        // Set有多个实现,我们先看看最常用的HashSet
        Set set = new HashSet();
        // 添加一个字符串
        set.add("字符串");
        // 添加一个整数对象
        set.add(new Integer(1));
        // 利用JDK5的特性,增加一个浮点数
        set.add(123.45);
        // 我们看看集合里对象的数量
        System.out.println(set.size());
        // 我们尝试增加一个重复的字符串
        set.add("字符串");
        // 我们再次看看集合里对象的数量
        System.out.println(set.size());
        // 我们来测试看看是否集合里包含了某个数据
        System.out.println(set.contains(123.45));
        // 我们从里面把这个浮点数删除
        set.remove(123.45);
        // 我们再次看看集合里对象的数量
        System.out.println(set.size());
      }
      /**
       * 专门针对HashSet的测试。
       */
      public static void testForHashSet() {
        System.out.println("----- testForHashSet -----------");
        HashSet<MyObject> set = new HashSet<MyObject>();
        // 增加一个null对象
        set.add(null);
        // 我们再次看看集合里对象的数量
        System.out.println(set.size());
        // 再次增加一个null看看
        set.add(null);
        // 我们再次看看集合里对象的数量
        System.out.println(set.size());
        MyObject obj = new MyObject("java2000", 2);
        set.add(obj);
        obj = new MyObject("csdn", 10);
        set.add(obj);
        // 我们再次看看集合里对象的数量
        System.out.println(set.size());
        // 判断是否包含某个对象
        System.out.println(set.contains(obj));
        obj = new MyObject("java2000_net", 2);
        set.add(obj);
        // 我们再次看看集合里对象的数量
        System.out.println(set.size());
        // 我们尝试把obj再次放入set看看
        // 并没有增加,因为是重复的
        set.add(obj);
        System.out.println(set.size());
        // 我们构造一个新的对象,内容和前面的相同
        obj = new MyObject("java2000_net", 2);
        set.add(obj);
        System.out.println(set.size());
        // 我们修改一下obj里面的年龄,再看看
        obj.setAge(3);
        // 我们再测试看看是否包含此对象。
        // 请注意,我们这个obj和前面的obj是同一个对象
        // 我们仅仅修改了一下我们的年龄
        System.out.println(set.contains(obj));
        // 我们尝试把obj再次放入set看看
        // 我们又增加了长度
        set.add(obj);
        System.out.println(set.size());
      }
      /**
       * 专门针对HashSet的测试2。
       */
      public static void testForHashSet2() {
        System.out.println("----- testForHashSet2 -----------");
        HashSet<MyObject2> set = new HashSet<MyObject2>();
        MyObject2 obj = null;
        for (int i = 0; i < 3; i++) {
          obj = new MyObject2("java2000" + i, i);
          set.add(obj);
          System.out.println(set.size());
        }
      }
    }
    class MyObject {
      private int age;
      private String name;
      public int getAge() {
        return age;
      }
      public void setAge(int age) {
        this.age = age;
      }
      public String getName() {
        return name;
      }
      public void setName(String name) {
        this.name = name;
      }
      MyObject(String name, int age) {
        this.name = name;
        this.age = age;
      }
      public boolean equals(Object obj) {
        System.out.println("equals");
        if (obj == null || !(obj instanceof MyObject)) {
          return false;
        }
        MyObject o = (MyObject) obj;
        return this.age == o.age && this.name.equals(o.name);
      }
      public int hashCode() {
        int hashCode = name.hashCode() + String.valueOf(age).hashCode();
        return hashCode;
      }
    }
    class MyObject2 {
      private int age;
      private String name;
      public int getAge() {
        return age;
      }
      public void setAge(int age) {
        this.age = age;
      }
      public String getName() {
        return name;
      }
      public void setName(String name) {
        this.name = name;
      }
      MyObject2(String name, int age) {
        this.name = name;
        this.age = age;
      }
      public boolean equals(Object obj) {
        System.out.println("equals");
        if (obj == null || !(obj instanceof MyObject2)) {
          return false;
        }
        MyObject2 o = (MyObject2) obj;
        return this.age == o.age && this.name.equals(o.name);
      }
      public int hashCode() {
        return 1;
      }
    }
    class MyObject3 {
      private int age;
      private String name;
      // 采用一个变量进行控制
      // 一旦生成了hashCode,则不再变动
      private int HASHCODE = Integer.MIN_VALUE;
      public int hashCode() {
        if (HASHCODE == Integer.MIN_VALUE) {
          // 重新生成本类的hashCode
          HASHCODE = name.hashCode() + String.valueOf(age).hashCode();
        }
        return HASHCODE;
      }
    }[/code]

    说明,针对HashSet:

       
        Set不允许重复
        允许 null,重复的null只算一个
        判断是否存在一个数据(是否重复),先判断其hashCode是否存在,若存在再逐个判断hashCode相同的数据是否相等
        判断是否相等,除了hashCode相等外,还要判断对象引用相等(==),或者 equals
        如果一个对象的hashCode变动了,会造成找不到这个对象,也就出现了内存泄漏的危险。
       

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/2/000104687.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 16:27 , Processed in 0.351292 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表