有关list和set的contains问题和对象的hashcode问题

问题描述

有关list和set的contains问题和对象的hashcode问题

import java.util.ArrayList;
import java.util.HashSet;
public class Foo {
int value;
Foo(int value){
this.value=value;
}
/*
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + value;
return result;
}*/
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Foo other = (Foo) obj;
if (value != other.value)
return false;
return true;
}
public static void main(String[] args) {
ArrayList list=new ArrayList();
HashSet set = new HashSet();
list.add(new Foo(1));
set.add(new Foo(1));
System.out.println(list.contains(new Foo(1))+":"+set.contains(new Foo(1)));
}
}
一个Foo类,在没有hashcode方法的时候,list的contain返回true set是false
在加上hashcode之后,两个都为false,这是为什么?
list的contain和set的contain是怎么判断的?

解决方案

简单来说你这里是比较两个对象,那么在比较两个对象是否相等时,是需要看equal和hashCode这2个方法的;set因其结果的不同不允许存储重复的值或对象,所以存储每个元素的hashcode值来唯一确定一个元素。
对应你的代码,没有hashcode时,结果为true、false;
加上hashcode时,应该是true、true。
另:建议楼主看一下java编程思想中容器一节的内容。

解决方案二:

因为ArrayList的存储方式相当与数组,他存储的时候不会根据hashCode去存储,但是hashSet存储到时候会根据hashCode去存储,而且hashSet在比较两个对象相等时要求除了要求两个对象满足equals返回0以外,还要求两个对象两个对象的hashCode必须相等。所以你不重写hashCode方法就会导致两个本来相等的对象因为他们hashCode不等从而返回你出现的结果。

时间: 2024-10-21 20:57:00

有关list和set的contains问题和对象的hashcode问题的相关文章

jspSmartUpload上传下载全攻略

js|攻略|上传|下载 一.安装篇 jspSmartUpload是由www.jspsmart.com网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中.该组件有以下几个特点: 1.使用简单.在JSP文件中仅仅书写三五行JAVA代码就可以搞定文件的上传或下载,方便. 2.能全程控制上传.利用jspSmartUpload组件提供的对象及其操作方法,可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),方便存取. 3.能对上传的文件在大小.类

专访阿里云异构计算负责人:异构计算,GPU、FPGA、ASIC芯片将三分天下

在IT界,异构计算并不是一个新兴的词. 近十年来,计算行业经历了从32bit."x86-64".多核心.通用GPGPU以及2010年"CPU-GPU"异构计算的变迁.而最近几年,随着人工智能.高性能数据分析和金融分析等计算密集型领域的兴起,异构计算才突然火了起来. 因为传统通用计算的方式已经无法满足我们对计算能力的需求,异构计算被认为是现阶段挑起计算大梁的关键技术,阿里云异构计算产品解决方案就在这样的大环境下诞生了,这支团队的掌舵人正是张献涛. 张献涛,花名旭卿,武

Spring.Net在Mvc4.0中应用的说明

案例Demo:http://yunpan.cn/cJ5aZrm7Uybi3 访问密码 414b Spring.Net在Mvc4.0中应用的说明 1.引用dll       2.修改Global文件 (SpringMvcApplication)       3.控制器添加属性     4.WebConfig配置   <!--必须紧跟着configuration之后-->   <configSections>     <sectionGroup name="spring

深入RESTful无状态原则

前言 在上篇RESTful基础知识中整体的介绍了RESTful架构设计思想的框架,在往后的RESTful主题博文中,我们在这个框架的基础上不断的为其填充更加深入的知识材料.  RESTful基础知识,传送门:http://blog.csdn.net/jmilk/article/details/50452595 无状态原则 Statelessness:无状态原则是RESTful架构设计中一个非常重要的原则,无状态是相对于有状态而言的.在理解什么是无状态的交互请求之前,首先我们需要了解什么是有状态,

MathType符号模板找不到了怎么办

  MathType符号模板消失示例 具体操作过程如下: 1.打开MathType软件进入到公式编辑状态,打开方式可以根据自己习惯来决定,可以在Word中通过"插入"--"对象"来完成,也可以双击现有的公式来打开,还可以直接双击MathType桌面图标来打开. 2.在MathType编辑窗口后,在MathType菜单栏中点击"视图"--"符号面板",再点击"视图"会发现"符号面板"的左边

教你通过控制网络流量来优化局域网

  一.用掩码将网段划分为不同的网段,这样可以减少一定的网络广播,可以实现邻近的网点快速的通信. 二.建立Vlan 第一个优点是:能有效遏制机构范围内的广播和组广播,进行跨园区的带宽和性能管理.如果不管理(或限制)这些工作组的整个范围,各站点发送数据包之前都要广播查询所要到达目的地的MAC地址,同时,由于大量应用层软件需要广播传送某些数据包,而这些数据广播包只须发向某一组用户,此时如果没有VLAN,这些数据包会很快占用整个网络大量的资源,使得正常数据包无法抢得正常带宽,严重影响到网络效率及性能.

怎样在photoshop中设计3D纹理字体

  效果图: 第一步: 我们先打开AI,然后在里面输入字体,这里可以随便适用任何字体,我们要学的是技巧. 第二步: 然后我们到效果>3D>凸出与斜角.设置如下: 然后选择字体,然后换个颜色.到对象>扩展外观.使用魔术棒工具把字体上面一层选取出来,在用直接选择工具,把这一层拖开. 第三步: 现在在按照下面的方式操作. 点击箭头工具.点击一个字母.然后取消编组,都取消以后选取所有字母,按CTRL+G合并.下面的图层也合并,这里注意了,是两个分开合并的. 做完后我们导出为PSD格式文件. 第四

PhotoShop CS5的增强3D功能详细教程

很多初学者都对Photoshop CS5中3D效果功能很感兴趣,来信询问我该功能的使用方法,在此专门为大家开发了这篇教程,供大家讨论学习. 平时我们所看到的一些立体感.质感超强的3D图像,在Photoshop CS5中也可轻松的实现.Photoshop CS5在菜单栏中新增了"3D"菜单,同时还配备了"3D"调板,使用户可以使用材质进行贴图,制作出质感逼真的3D图像,进一步推进了2D和3D的完美结合. 该教程精心为大家安排了一组3D图像,通过整个操作过程能熟练的掌握

网页动画的十二原则

  作为前端的设计师和工程师,我们用 CSS 去做样式.定位并创建出好看的网站.我们经常用 CSS 去添加页面的运动过渡效果甚至动画,但我们经常做的东西不会超过这些. 动效是一个有助于访客和消费者理解我们设计的强有力工具.这里有些原则能最大限度地应用在我们的工作中. 迪士尼经过基础工作练习的长时间累积,在 1981 年出版的 The Illusion of Life: Disney Animation 一书中发表了动画的十二个原则 (12 Principles of Animation) .这些

值得学习的19个jQuery和CSS按钮教程

jQuery是继prototype之后又一个优秀的Javascrīpt框架,使用户能更方便地处理HTML documents.events.实现动画效果,并且方便地为网站提供AJAX交互.相对于传统HTML的表现而言,CSS能够对网页中的对象的位置排 版进行像素级的精确控制,支持几乎所有的字体字号样式,拥有对网页对象盒模型的能力,并能够进行初步交互设计,是目前基于文本展示最优秀的表现设计语言. 这里就将分享国外19个值得学习的jQuery和CSS按钮教程,希望能有所帮助. Awesome CSS