当前位置: 首页 > news >正文

用asp怎么做网站/网络营销软件排行

用asp怎么做网站,网络营销软件排行,广州网站设计培训,网站建设前期策划Java中的HashCode(1)之hash算法基本原理2012-11-16 14:58:59 我来说两句 作者:woshixuye收藏 我要投稿一、为什么要有Hash算法 Java中 的集合有两类,一类是List,一类是Set。List内的元素是有序的,元素可以重复。Set元…
Java中的HashCode(1)之hash算法基本原理
2012-11-16 14:58:59     我来说两句       作者:woshixuye
收藏    我要投稿

 

一、为什么要有Hash算法

Java中 的集合有两类,一类是List,一类是Set。List内的元素是有序的,元素可以重复。Set元素无序,但元素不可重复。要想保证元素不重复,两个元素 是否重复应该依据什么来判断呢?用Object.equals方法。但若每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就 非常多了。也就是说若集合中已有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。于是 Java采用了哈希表的原理。哈希(Hash)是个人名,由于他提出哈希算法的概念就以他的名字命名了。

 

 

二、Hash算法原理

当Set接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪一个区间,在这个区间里调用equeals方法。

 

 \

确实提高了效率。但一个面临问题:若两个对象equals相等,但不在一个区间,根本没有机会进行比较,会被认为是不同的对象。所以Java对于eqauls方法和hashCode方法是这样规定的:

1 如果两个对象相同,那么它们的hashCode值一定要相同。也告诉我们重写equals方法,一定要重写hashCode方法。

2 如果两个对象的hashCode相同,它们并不一定相同,这里的对象相同指的是用eqauls方法比较。

 

 

三、例子

 

1 没有重写hashCode和equals的方法 

package cn.xy.test;

public class Point1
{
 private int x;
 private int y;

 public Point1(int x, int y)
 {
  super();
  this.x = x;
  this.y = y;
 }

 public int getX()
 {
  return x;
 }

 public void setX(int x)
 {
  this.x = x;
 }

 public int getY()
 {
  return y;
 }

 public void setY(int y)
 {
  this.y = y;
 }

}

public class HashSetAndHashCode
{
 public static void main(String[] args)
 {
  HashSet<Point1> hs1 = new HashSet<Point1>();
  Point1 p11 = new Point1(3, 3);
  Point1 p12 = new Point1(3, 3);
  Point1 p13 = new Point1(3, 5);
  hs1.add(p11);
  hs1.add(p11);
  hs1.add(p12);
  hs1.add(p13);
  System.out.println(hs1.size());
 }
}

答案是3

 


2 重写hashCode和equals的方法

package cn.xy.test;

public class Point2
{
 private int x;
 private int y;

 public Point2(int x, int y)
 {
  super();
  this.x = x;
  this.y = y;
 }

 @Override
 public int hashCode()
 {
  final int prime = 31;
  int result = 1;
  result = prime * result + x;
  result = prime * result + y;
  return result;
 }

 @Override
 public boolean equals(Object obj)
 {
  if (this == obj) return true;
  if (obj == null) return false;
  if (getClass() != obj.getClass()) return false;
  Point2 other = (Point2) obj;
  if (x != other.x) return false;
  if (y != other.y) return false;
  return true;
 }

 public int getX()
 {
  return x;
 }

 public void setX(int x)
 {
  this.x = x;
 }

 public int getY()
 {
  return y;
 }

 public void setY(int y)
 {
  this.y = y;
 }

}

public class HashSetAndHashCode
{
 public static void main(String[] args)
 {
  HashSet<Point2> hs2 = new HashSet<Point2>();
  Point2 p21 = new Point2(3, 3);
  Point2 p22 = new Point2(3, 3);
  Point2 p23 = new Point2(3, 5);
  hs2.add(p21);
  hs2.add(p22);
  hs2.add(p23);
  System.out.println(hs2.size());
 }
}

答案是2。p21和p22被认为是同一个对象。

 


3 没有重写hashCode的方法,但重写equals的方法

package cn.xy.test;

public class Point3
{
 private int x;
 private int y;

 public Point3(int x, int y)
 {
  super();
  this.x = x;
  this.y = y;
 }

 @Override
 public boolean equals(Object obj)
 {
  if (this == obj) return true;
  if (obj == null) return false;
  if (getClass() != obj.getClass()) return false;
  Point3 other = (Point3) obj;
  if (x != other.x) return false;
  if (y != other.y) return false;
  return true;
 }

 public int getX()
 {
  return x;
 }

 public void setX(int x)
 {
  this.x = x;
 }

 public int getY()
 {
  return y;
 }

 public void setY(int y)
 {
  this.y = y;
 }

}

public class HashSetAndHashCode
{
 public static void main(String[] args)
 {
  HashSet<Point3> hs3 = new HashSet<Point3>();
  Point3 p31 = new Point3(3, 3);
  Point3 p32 = new Point3(3, 3);
  Point3 p33 = new Point3(3, 5);
  hs3.add(p31);
  hs3.add(p32);
  hs3.add(p33);
  System.out.println(hs3.size());
 }
}

可能是2,可能是3。因为根据内存地址算出的hashcode不知道是否在一个区域。

 

 

转载于:https://www.cnblogs.com/xmgh/p/3772996.html

http://www.lbrq.cn/news/1057321.html

相关文章:

  • 中国建设银行辽宁分行网站/首页排名优化公司
  • 哪个网站可以做英文兼职/网络营销到底是干嘛的
  • 河北省住房与建设厅网站/新站整站优化
  • 莱西做网站公司/搜索引擎营销的英文缩写是
  • 网站的建设要多少钱/网页做推广
  • wordpress have posts/佛山做网络优化的公司
  • wordpress hotnews/武汉本地seo
  • 沈阳企业定制网站建设/最新引流推广方法
  • 做网站是什么软件/淘宝关键词排名优化技巧
  • 泰州网站制作推广/企业网
  • 我自己做网站/焊工培训班
  • wordpress qq在线聊天/网站设计优化
  • 用tomcat做网站/plc培训机构哪家最好
  • 专做校园购物网站/农产品网络营销
  • 网上做网站怎么赚钱/广州百度竞价托管
  • 合肥装饰公司做的好的网站/利于seo的建站系统有哪些
  • 工商管理局注册查询/谷歌seo详细教学
  • 网站设计团队/今天实时热搜榜排名
  • 微信链接网页网站制作/seo薪酬水平
  • 商城网站建设方案书/南宁seo手段
  • 网站定位与功能分析/武汉seo认可搜点网络
  • 新疆网站开发哪家好/抖音seo点击软件排名
  • 张掖网站建设培训/seo的名词解释
  • 35互联做的网站后台怎样登录/网络推广专员是做什么的
  • wordpress 换数据库/杭州最好的seo公司
  • 网站权重多少4/谷歌浏览器中文手机版
  • 网站建设的整个流程图/dz论坛如何seo
  • 建设银行短信带网站/冯耀宗seo
  • 邯郸网站建设维护/武威网站seo
  • 个人网站搭建平台/重庆网站网络推广
  • 攻防世界WEB(新手模式)20-unseping
  • Dubbo-Go调Bug记录-泛化调用调不通
  • ulimit参数使用详细总结
  • MC0364魔法链路
  • C++ 指针常量 常量指针
  • 函数指针——回调函数