【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

时间: 2024-08-25 17:00:12

【java】HashSet的相关文章

【Java】【Flume】Flume-NG启动过程源码分析(二)

本节分析配置文件的解析,即PollingPropertiesFileConfigurationProvider.FileWatcherRunnable.run中的eventBus.post(getConfiguration()).分析getConfiguration()方法.此方法在AbstractConfigurationProvider类中实现了,并且这个类也初始化了三大组件的工厂类:this.sourceFactory = new DefaultSourceFactory();this.s

【Java】为ArrayList去重

ArrayList没有封装好的去重方法,比如对于一个[2, 5, 2, 3, 2, 4]的ArrayList,我要去除其中的重复的元素, 我也不想把语句也这么长,也不想用for循环的方法去重,那么可以先考虑把ArrayList转化为一个临时的HashSet,再把这个临时的HashSet转化回ArrayList, 因为HashSet里面的元素是不可重复的嘛!至于什么是ArrayList与HashSet,在<[Java]Java中的Collections类--Java中升级版的数据结构>(点击打开

【Java】Java中的Collections类——Java中升级版的数据结构

一般来说课本上的数据结构包括数组.单链表.堆栈.树.图.我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组.二维数组无法完全表达你要表达的东西,而定义一个类Class有太过麻烦,这时候,你可以考虑一下用Java中的Collections类.使用Collections类,必须在文件头声明import java.util.*; 一.动态.有序.可变大小的一维数组Vector与ArrayList Collection

【Java】两个ArrayList之间求交并补

同样的方法应该也使用在<[Java]Java中的Collections类--Java中升级版的数据结构>(点击打开链接)中提及到Java中的各类集合,这里拿各位编程最常用的ArrayList做例子.这个东西除了用来做可变形数组以外,有时候还会出现要在两个ArrayList之间进行集合运算,我在这里举出最常见的求交并补的例子,其余的复杂的集合运算,请自己打开<离散数学>或者<数理逻辑>一书慢慢推导吧.我们是程序猿,不是数学家,要在两个ArrayList之间求交并补已经很少

【Java】边集转化为邻接矩阵

图的边集是可以转化为邻接矩阵的. 邻接矩阵的定义如下: 邻接矩阵(Adjacency Matrix):是表示顶点之间相邻关系的矩阵.设G=(V,E)是一个图,其中V={v1,v2,-,vn}.G的邻接矩阵是一个具有下列性质的n阶方阵: ①对无向图而言,邻接矩阵一定是对称的,而且对角线一定为零(在此仅讨论无向简单图),有向图则不一定如此. ②在无向图中,任一顶点i的度为第i列所有元素的和,在有向图中顶点i的出度为第i行所有元素的和,而入度为第i列所有元素的和. ③用邻接矩阵法表示图共需要n^2个空

【Java】Java还是.Net

网友一: 现在也跟着团队做了几个项目了,慢慢我觉得.Net无论是在语言设计.框架设计等各方面都比Java来得漂亮,是真正的后起之秀,在Studio环境下编程那是行云流水.但每次我写Java程序时,一打开Jbuilder或者Eclipse时,那慢得如牛的启动速度,极不人性化的操作就直皱眉头,可现实是,人家Java比.Net混得滋润得多,因为人家大度,人家海纳百川,所以钱财滚滚. 每次我们去谈项目的时候,金融.电信行业的用户就明确表示不用.Net,为什么?人家的服务器都是Unix的,.Net在这里连

【Java】String,StringBuffer与StringBuilder的区别??

String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以

【java】Windows7 下设置环境变量

Windows 7下配置JDK环境变量參数设置: 1.    安装JDK,安装过程中能够自己定义安装文件夹等信息,比如我们选择安装文件夹为:D:\Program Files (x86)\Java\jdk1.6.0_25 2.    安装完毕后,右击"我的电脑",点击"属性",单击"高级系统设置",点击"环境变量",如图: 4.    在"系统变量"中,设置3项属性,JAVA_HOME,PATH,CLASSP

【Java】使用switch 计算一个日期是当年的第几天

计算一个日期是当年的第几天 这是去年做的一个Java题目,老师当时说这段代码里的switch用的很好. 现在工作一年了,明显感觉当时还很稚嫩,那个时候考虑问题很简单, 现在遇到问题会想更多的方面,说到这里,真的要谢谢带我的经理, 这段时间真的学到很多东西,每天都是在解决问题,每天都能学到新东西, 短短几个月时间进步了好多. 1 import java.util.Scanner; 2 3 /** 4 * 计算一个日期是当年的第几天 5 */ 6 public class CountDays { 7