• 【java】HashSet


     1 package com.tn.hashSet;
     2 
     3 public class Person {
     4     private int id;
     5     private String name;
     6     private String birthday;
     7     public Person(int id, String name, String birthday) {
     8         super();
     9         this.id = id;
    10         this.name = name;
    11         this.birthday=birthday;
    12     }
    13     public int getId() {
    14         return id;
    15     }
    16     public void setId(int id) {
    17         this.id = id;
    18     }
    19     public String getName() {
    20         return name;
    21     }
    22     public void setName(String name) {
    23         this.name = name;
    24     }
    25     public String getBirthday() {
    26         return birthday;
    27     }
    28     public void setBirthday(String birthday) {
    29         this.birthday = birthday;
    30     }
    31     @Override
    32     public String toString() {
    33         return id +"-" + name;
    34     }
    35     @Override
    36     public int hashCode() {
    37         final int prime = 31;
    38         int result = 1;
    39         result = prime * result + id;
    40         return result;
    41     }
    42     @Override
    43     public boolean equals(Object obj) {
    44         if (this == obj)
    45             return true;
    46         if (obj == null)
    47             return false;
    48         if (getClass() != obj.getClass())
    49             return false;
    50         Person other = (Person) obj;
    51         if (id != other.id)
    52             return false;
    53         return true;
    54     }
    55 }
    Person.java
     1 package com.tn.hashSet;
     2 
     3 import java.util.HashSet;
     4 import java.util.Iterator;
     5 
     6 public class HashSetTest {
     7     /*
     8      * HashSet的底层是HashMap
     9      * 注意:
    10      * 1.必须根据实际情况确定唯一标识来重写hashCode和equals方法
    11      * 2.对象一旦放入HashSet容器中,则唯一标识不能再修改,否则移除不了。
    12      * 3.HashSet存放对象时对象位置和对象hashCode算法等到的值相关,查找移除都需要用到hashCode算法
    13      *       值,如果唯一标识被修改则hashCode算法值会和以前不一样,对象位置就改变了,导致找不到对象,长此以往,
    14      *  导致内存泄露。
    15      */
    16     public static void main(String[] args){
    17         HashSet<Person> persons=new HashSet<Person>();
    18         Person p1=new Person(1001,"张三","1990-1-1");
    19         Person p2=new Person(1002,"李四","1988-2-2");
    20         Person p3=new Person(1003,"王五","1989-3-3");
    21         persons.add(p1);
    22         persons.add(p2);
    23         persons.add(p3);
    24         
    25         System.out.println(persons);//即打印容器中每个对象toString的返回值
    26         
    27         //foreach遍历
    28         for(Person p:persons)
    29             System.out.println(p);
    30                 
    31         //迭代器遍历
    32         Iterator<Person> iterator=persons.iterator();
    33         while(iterator.hasNext())
    34             System.out.println(iterator.next());
    35         
    36         /*不能用for遍历,因为HaseSet无get方法。
    37         for(int i=0;i<persons.size();i++){
    38             System.out.println(persons.get(i));
    39         }*/
    40         
    41         //HashSet不能加重复对象
    42         System.out.println(persons.size());
    43         persons.add(p3);
    44         System.out.println(persons.size());
    45         
    46         /*
    47          * 若不重写Person的hashCode和equals方法p4和p3会因地址不同被Object的equals方法判断为
    48          * 两个不同的对象,若重写hashCode和equals,则被会认为同一个对象。
    49          */
    50         Person p4=new Person(1003,"王五","1989-3-3");
    51         
    52         persons.add(p4);
    53         System.out.println(persons.size());//不重写hashCode和equals打印4,重写打印3
    54         
    55         boolean b;
    56         b=persons.remove(p1);
    57         System.out.println(b);
    58         System.out.println(persons.size());
    59         p2.setId(1000);//HashSet容器中的对象唯一标识被改,导致hashCode和equals算法值和以前不一样
    60         b=persons.remove(p2);//移除失败直接返回false,程序不会报错。
    61         System.out.println(b);
    62         System.out.println(persons.size());
    63     }    
    64 }
    HashSetTest.java
  • 相关阅读:
    ZJOI2019爆蛋记
    NOIp2018退役记
    拓展中国剩余定理(exCRT)摘要
    FFT(快速傅里叶变换)摘要
    主席树摘要
    LCT摘要
    替罪羊树摘要
    FHQ Treap摘要
    逻辑回归1-逻辑回归原理详解
    NLP自然语言处理原理及名词介绍
  • 原文地址:https://www.cnblogs.com/xiongjiawei/p/6614075.html
Copyright © 2020-2023  润新知