热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javaHashcode实际应用场景

Hashcode实际应用场景HashcodepublicinthashCode()以前一直觉得几乎不太可能会用到hashcode,所以一直写bean没有覆盖hashcode()方法返回该对象的哈希
Hashcode实际应用场景

Hashcode

public int hashCode()
以前一直觉得几乎不太可能会用到hashcode,所以一直写bean没有覆盖hashcode()方法

返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

hashCode 的常规协定是:

  • 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
  • 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用hashCode 方法都必须生成相同的整数结果。
  • 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode 方法 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

返回:
此对象的一个哈希码值。


应用场景

1、涉及到重写equals()方法时,需要考虑到覆盖hashcode()方法 2、如果用对象作为map的键时,需要考虑到覆盖hashcode,以便提高或者达到自己的目的

举例:


假如要处理上述一个文件,是HDFS文件系统中的一个文件,数据量很大,是保存的每个顾客每天的消费记录,第一列是顾客编号,第二列是产品编号(前三位是产品种类),最后一列是购买日期,现在要将每个顾客每天购买的消费记录统计出来,如[0983485,105,406,108,109....],就是每个顾客每天所购买的产品种类。
为了处理这个问题,首先需要对每一行字符串进行切分,得到如【0983485,701,2015-06-19】 所以咱们定义一个HashMap> Flag是一个实体类,属性有username,time 主要是为了作为Map的一个主键,如果已经有这个键K,,那么Value则add(no)。这个时候需要考虑键的hashcode还有equals方法的覆盖》

详见代码:
public class Flag {

private String no;
private String time;
public Flag(String no,String time){
this.no = no;
this.time = time;
}

public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
@Override
public boolean equals(Object o) {
if(o==null) return false;
if(!(o instanceof Flag)) return false;
if(this==o) return true;
Flag o2=(Flag)o;
if(no.equalsIgnoreCase(o2.no)
&& time.equalsIgnoreCase(o2.time)
)
return true;
return false;
}
@Override
public int hashCode(){
int result=17;
result=31*result+no!=null?no.hashCode():0;
result=31*result+time!=null?time.hashCode():0;
//result=31*result+position!=null?position.hashCode():0;
return result;
}
}

import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import com.market.help.Flag;
import com.market.help.SqlOperation;

public class MapRS {

public static void readFromHdfs() throws FileNotFoundException,IOException {
String dst = "hdfs://master:9000/user/hive/warehouse/monthbuy_log/000000_0";
Configuration cOnf= new Configuration();
FileSystem fs = FileSystem.get(URI.create(dst), conf);
InputStream in=null;
BufferedReader buff=null;

in = fs.open(new Path(dst));


buff=new BufferedReader(new InputStreamReader(in));
Flag user = new Flag();
String str;
Map> map =new HashMap>();

String st[];

String no;
String sql = "";

while((str=buff.readLine())!=null){
//
System.out.println(str);
st = str.split("\u0001");
user.setNo(st[0]);
no = st[1].substring(0, 3);
user.setTime(st[5]);
if(map.containsKey(user)){
LinkedList list = map.get(user);
list.add(no);
map.put(user, list);
}
else{
LinkedList list = new ArrayList();
list.add(no);
map.put(user, list);
}
}
for (Iterator i = map.keySet().iterator(); i.hasNext();) {
Object obj = i.next();
System.out.println(obj);// 循环输出key
System.out.println("key=" + obj + " value=" + map.get(obj));
}
buff.close();
//hdfsInStream.close();
in.close();
fs.close();
}

}
}



推荐阅读
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
mobiledu2502871951
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有