`
k_lb
  • 浏览: 800409 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

java中HashSet的add的使用,以及equals和hashcode的重写

 
阅读更多

平时学了很多的java知识,但是发现自己经常忘记好多的知识点,我以我打算一边学习一边写博客,其实整个写博客的过程也是我自己巩固学习,熟悉理解的过程,希望热心的朋友多多给我指出错误啊。在此也感谢张龙老师的慷慨分享。

这次讲解一下HashSet中add方法的使用以及许多注意的地方,首先大家知道数据结构分为线性结构和非线性结构,前面讲的ArrayList是线性结构的顺序表示法,LinkedList是线性结构的链式表示法,今天讲的hashset是非线性结构的。

首先:

HashSet hashSet = new HashSet();
hashSet.add("zhangsan");
hashSet.add("lisi");

System.out.println(hashSet);

这样打印出来的值并不一定是按顺序出来的,因为它并不像ArrayList那样在内部是有序存放的;

另外,它存放之前会判断之前HashSet里面是否已经存在统一数值,如果有则不会继续存。

看这样的例子:

public class HashSetTest
{
public static void main(String[] args)
{
HashSet hashSet = new HashSet();
hashSet.add(new Persion("zhangran"));
hashSet.add(new Persion("zhangran"));
System.out.println(hashSet);
System.out.println("以上为第一部分----------------");
Persion p1=new Persion("zhangran");
hashSet.add(p1);
hashSet.add(p1);
System.out.println(hashSet);
System.out.println("下面来的为第三部分------------");
String s1 = new String("aa");
String s2 = new String("aa");
hashSet.add(s1);
hashSet.add(s2);
System.out.println(hashSet);

}
}
class Persion
{
String name;
Persion(String name)
{
this.name=name;
}
}

大家可以猜猜那些会真正的加入到hashset当中去

答案是:第一部分加进去两个,第二部分跟第三部分加进去了一个。

讲解:使用add方法是,首先会判断对象是否是相同的如果是相同的一定不会继续往里面加,就像第二部分,如果对象是不同的,例如第一部分是new出来的两个对象,它加了进去,第三部分是new出来的两个对象,但是他就没加进去。所以得再进一步区分。其实判断对象是否相同并不是一眼就能看出来的,而是通过内部定义好了的equals方法来判断的,而用equals方法又是根据对象的hashCode来判断的。比如第一部分,Persion类是Object的子类继承了Object的equals和hashcode方法,而在Object类当中它的不同的实例中的hashcode是不同的,这是Object中本来就定义好了的hashcode();所以继承它的类也都有这样的方法,所以第一部分通过equals之后Persion的两个实例是不相同的,但是String类重写了hashcode方法,使得String实例化出来的对象的hashcode()都是相同的,所以第三部分就得再进一步判断它的具体的数值,结果它的具体数值是相同的所以插不进去。大家可以把上面的代码自己运行一下。

下面咱们自己重写一下,hashcode()以及equals方法,实现:无所谓是不是相同的对象,只根据对对象具体的数值是否相同来进行add的增加

public class HashSet2
{
public static void main(String[] args)
{
HashSet hashSet = new HashSet();
People p1 = new People("zhangsan");
People p2 = new People("lisi");
hashSet.add(p1);
hashSet.add(p2);
System.out.println(hashSet);
}
}
class People
{
String name;
People(String name)
{
this.name=name;
}
public int hashCode()
{
return this.name.hashCode();
}
public boolean equals(Object obj)
{
if(this==obj)
{
return true;
}
if(obj!=null&&obj instanceof People)
{
People p = (People)obj;
if(name.equals(p.name))
{
return true;
}
}
return false;
}

}
我都运行过的,大家也试试吧。。。

分享到:
评论

相关推荐

    重写hashCode()和equals()方法详细介绍

    主要介绍了重写hashCode()和equals()方法详细介绍,涉及重写equals()方法,重写hashCode()方法,重写equals()而不重写hashCode()的风险等相关内容的介绍,具有一定借鉴价值,需要的朋友可以参考下

    equals 和 hashCode两者效果分析详解.docx

    但是为什么JavaDoc明确的告诉我们, hashCode()和equals()要一起重写呢?原因是因为,在Java自带的容器HashMap和HashSet中, 都需同时要用到对象的hashCode()和equals()方法来进行判断,然后再插入删除元素,这点...

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    Java中HashSet的解读_.docx

    Java中HashSet的解读_.docx

    HashSet工作原理_动力节点Java学院整理

    对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:

    java 利用HashSet删除学生

    java 利用HashSet删除学生 java 利用HashSet删除学生

    java HashSet 集合排序

    java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。

    java集合-HashSet的使用

    HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...

    java中set、list和map的使用方法实例

    // java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...

    详解Java中HashSet和TreeSet的区别

    主要介绍了详解Java中HashSet和TreeSet的区别的相关资料,需要的朋友可以参考下

    Java面试题.docx

    1、java中==和equals和hashCode的区别 2、int与integer的区别 3、String、StringBuffer、StringBuilder区别 4、什么是内部类?内部类的作用 5、进程和线程的区别 6、final,finally,finalize的区别 7、...

    HashSet和HashMap的区别_动力节点Java学院整理

    HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有...

    java集合知识-map、set等

    记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。...

    Java中HashSet和HashMap的区别_动力节点Java学院整理

    主要介绍了Java中HashSet和HashMap的区别_动力节点Java学院整理,需要的朋友可以参考下

    hashset类的使用

    这个是关于java语言的hashset集合类的一些基本用法和详解了个方法的使用

    HashSet详解和使用示例_动力节点Java学院整理

    它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素。 HashSet是非同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。

    HashCode作用_动力节点Java学院整理

    Java集合中有两类,一类是List,一类是Set他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的。对于List好处理,但是对于Set而言我们要如何来保证元素不重复呢?通过迭代...

    大厂真题之阿里云-Java实习生

    HashSet 中的 add ()方法会使用 HashMap 的 add ()方法。以下是 HashSet 部分源码: HashMap 的 key 是唯一的,由上面的代码可以看出 HashSet 添加进去的值就是作为 HashMap 的key。所以不会 重复( HashMap 比较...

    Java中的HashSet详解和使用示例_动力节点Java学院整理

    HashSet 是一个没有重复元素的集合。接下来通过实例代码给大家介绍java中的hashset相关知识,感兴趣的朋友一起看看吧

    HashSet、LInkedHashSet的使用和特点

    HashSet、LInkedHashSet的使用和特点

Global site tag (gtag.js) - Google Analytics