`
翅膀
  • 浏览: 23540 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Re: java编程时要遵循的一些原则

阅读更多
2.在改写equals的时候总是要改写hashCode (不知道有多少人知道hashCode的作用) 在每个改写了equals方法的类中,必须也要改写hashCode方法。如果不这样的话,就会违反Object.hashCode的通用约定, 这个类就会在所有基于散列值的集合类中无法正常工作,包括HashMap,HashSet和Hashtable 举个例子。 public class MyClass { private int x; private int y; public MyClass() { } public MyClass(int x,int y) { this.x=x; this.y=y; } public boolean equals(Object x) { if (x==null) { return false; } if (!(x instanceof MyClass)) { return false; } MyClass m = (MyClass)x; return m.x==this.x && m.y==this.y; } } Map p = new HashMap(); p.put(new MyClass(33,44),"Test"); 在这个p中,你想通过p.get(new MyClass(33,44))去得到"Test",但实际上返回的是null,因为这个类没有重载hashCode方法,虽然他们使用equals方法会得到true,但这两个实现是放在不同的散列桶里的。 如果给这个类重载hashCode方法,则会得到我们想要的结果,代码如下: public int hashCode() { return 1; } 上面的hashCode方法是合法的,但在实际中,是永远也不会使用的,因为这个方法使所有的对象都得到相同的散列值,每个对象 都会被映射到同一个散列桶中,这个散列表就退化为了链表。那如何能够做一个比较好的散列值呢。按以下的方法做,一般都可 以生成比较好的散列值 1.把某个非零常数值,比如17,保存在一个变量里,比如:int temp=17; 2.对于对象中的每个关键值,完成以下步骤 a.计算每个值的散列码c 1)如果该值是boolean类型,则计算(f?0:1) 2)如果是byte,char,short或者int,则计算(int)f; 3)如果是long,则计算(int)(f^(f>>>32)) 4)如果是float,则计算Float.floatToIntBits(f); 5)如果是一个对象引用,则同样递归调用对象的hashCode. 6)如果是一个数组,则处理每个元素。 b.按照下面公式,把步骤a中计算到的散列码c组合到结果中 temp = 37*temp+c; 所以上面的类实现hashCode方法如下 public int hashCode() { int temp=17; temp = 37*temp+x; temp = 37*temp+y; return temp; } 但在实际中,一些对象的关键值非常多,如果每次调用hashCode()都要经过计算,肯定会费很多资源,如果这样,则可以定义 一个属性值,把计算结果放到这个属性值就可以了。代码如下: private int hashCode = 0; public int hashCode() { if (hashCode==0) { int temp=17; temp = 37*temp+x; temp = 37*temp+y; hashCode = temp; } return hashCode; }
分享到:
评论

相关推荐

    CoreJava_Re

    ### CoreJava复习要点 #### SCJP与SCJD认证考试概览 ...以上内容概述了Core Java的一些关键知识点,涵盖了从基础语法到高级特性的广泛范围,旨在帮助读者全面理解并掌握Java语言的核心概念和技术。

    RE.txt

    ### Java Standard Edition (Java SE) Runtime Environment (RE) #### 概述 Java Standard Edition...通过遵循上述指导原则,开发者可以更有效地部署基于Java的应用程序,并确保它们能够在广泛的系统环境中稳定运行。

    编写java程序常见的几个问题

    在编写Java程序时,我们经常会遇到各种挑战,导致代码质量不高。为了写出更好的代码,我们需要遵循一些编程原则和最佳实践。以下是一些关键点,可以帮助我们改进代码的鲁棒性、简洁性、高效性、简短性、可共享性、可...

    2017.08 page877 Cloud Native Java_ Designing Re - Josh Long.pdf )

    在设计云原生Java应用时,遵循一些基本原则是非常重要的。例如,设计时需要考虑服务的自治性,即每个服务都应该是自我管理的,包括自我修复、自我扩展和自我优化。此外,服务的无状态性也是设计时的一个关键要素,...

    brickbreaker:Java Brick Breaker Re-make

    本项目“Java Brick Breaker Re-make”就是一个用Java语言实现的打砖块游戏,它提供了丰富的学习素材,让我们一起深入探讨这个项目中的Java编程知识点。 1. **Java基础** - **类与对象**:游戏中的各种元素,如球...

    关于java100问(基础问题)

    Java是世界上最流行的编程...这些基本问题解答可以帮助初学者更好地理解和解决Java编程过程中遇到的常见问题。随着对Java的深入学习,你将逐渐掌握更多高级概念和技巧,如面向对象编程、异常处理、多线程、网络编程等。

    java python exam demo111

    总的来说,这个考试涵盖了Python GUI编程、数据库操作、数据验证以及可能的Java编程基础,要求考生不仅掌握编程技术,还要注重代码的规范性和可维护性。在准备这样的考试时,确保熟悉Python和Java的基础知识,特别是...

    java资料面试题

    ### Java编程基础 #### 2.1 Java 中的标识符如何命名?可以用中文吗? Java 中的标识符应遵循以下规则: - 由字母、数字、下划线 (_) 或美元符号 ($) 组成。 - 必须以字母、下划线或美元符号开头。 - 不建议使用 ...

    jdbc java file config

    还假设您已经安装了Progress JDBC驱动程序、Java 2平台标准版软件开发工具包(J2SE SDK)、Java 2运行环境(J2RE)和Java虚拟机(JVM)。这篇白皮书的目的是通过解释如何配置使用驱动程序的环境以及提供示例来帮助您...

    计算机软件及应用JAVA课程ppt课件.ppt

    Java编程语言是由Sun Microsystems的Green小组于1991年创立的,最初命名为Oak。这个小组由James Gosling领导,他们的目标是开发一种适合小型设备和网络环境的语言。经过一系列的发展,Oak在1995年更名为Java,并随着...

    3个简单java课程设计

    在IT领域,尤其是在Java编程的学习过程中,课程设计是提升技能和理解能力的重要环节。本话题聚焦于三个简单的Java课程设计项目,旨在帮助初学者更好地掌握Java语言的核心概念和实际应用。"晕有个带密码两个好使的"这...

    java正则表达式基础

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配,能够高效地进行文本查找、替换和提取。在这个Java正则表达式基础的教程中,我们将深入探讨这一主题,帮助你理解其核心概念并掌握实际应用...

    re-for-beginners 逆向工程入门指南

    7. **编程语言与框架**:了解常见的编程语言(如C/C++、Java、Python)和它们的运行时环境,因为这些知识有助于理解逆向的对象和上下文。 8. **法律与伦理**:逆向工程可能涉及到版权法、数字千年版权法(DMCA)...

    关于java英语

    在Java编程中,“Syntax”指的是程序代码必须遵循的语法规则。当代码违反了这些规则时,编译器会抛出“Syntax Error”,表明存在语法错误。这可能包括括号不匹配、缺少分号、变量未声明就使用等常见问题。了解并熟练...

    openlink-java:Openlink Java库

    OpenlinkJava库本身由一些JAR文件组成: openlink-java.jar, xmpp-core.jar, xmpp-core-client.jar, xmpp-extensions.jar and xmpp-extensions-client.jar 。 它扩展了库,以针对Openlink(XMPP)服务器提供完整的...

    java连接SQL数据库.pdf

    在Java编程中,与SQL数据库建立连接是常见的任务,尤其在开发企业级应用时。本文将详细介绍两种常用的方法来连接Java与SQL Server 2000数据库,这两...在编写代码时,确保遵循Java编程规范,注意代码的健壮性和安全性。

    re-sign.jar 和 zipalign.exe工具下载

    这是一个Java应用程序,它的主要功能是对APK包进行重新签名。在Android开发过程中,当你需要调试或测试一个由他人签名的应用,或者将多个应用合并为一个时,就需要使用到这个工具。re-sign.jar允许你在不改变原始...

    re-struktura:gyakorlás

    在进行重构时,遵循的原则包括: - **保持代码可测试**:重构前确保有良好的单元测试覆盖,以防止破坏现有功能。 - **小步前进**:每次只重构一小部分,方便回滚和确保改动可控。 - **理解代码**:在动手之前,深入...

Global site tag (gtag.js) - Google Analytics