`
hqbuaa1013
  • 浏览: 18350 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

为什么返回的是null?

阅读更多
//大家看看,这个程序为什么打印的是null,而不是Jenny?
import java.util.HashMap;
import java.util.Map;

public final class PhoneNumber {
	private final short area;
	private final short extension;
	PhoneNumber(int area,int extension){
		this.area=(short)area;
		this.extension=(short)extension;
	}
	public boolean equals(Object o){
		if(o==this)
			return true;
		if(!(o instanceof PhoneNumber))
			return false;
		PhoneNumber pn=(PhoneNumber)o;
		return pn.area==this.area && pn.extension==this.extension;
	}
	
	public static void main(String[] args){
		Map<PhoneNumber, String> m=new HashMap<PhoneNumber, String>();
		m.put(new PhoneNumber(010,7541), "Jenny");
		System.out.println(m.get(new PhoneNumber(010,7541)));
	}
}
分享到:
评论
12 楼 Emiya_wang 2009-09-11  
学习了
一直以来就对Object的equals和hashcode这两个方法比较模糊
看来还真得研究研究啊  要不出了错都不知怎么回事
11 楼 Irving_wei 2009-09-11  
hqbuaa1013 写道
问题应该出在这一句:
m.put(new PhoneNumber(010,7541), "Jenny"); 

因为这里又new了一个新的对象。如果换成下面的代码:
PhoneNumber pn0=new PhoneNumber(010,7541);
m.put(pn0,"Jenny");

那么m.get(pn0)是能够返回Jenny的



同意,呵呵
本人还有个疑问,LZ重写equals()在这段代码里不知道有什么意义?
10 楼 wangbing9577 2009-04-23  
在hashCode()方法中直接返回一个常数不是一个好办法。
本例中只是为了说明HashMap中的处理流程才加入的。
更好的方法请见<<effective java>>一书。
9 楼 wangbing9577 2009-04-23  
补充两句:
HashMap首先调用hashcode()方法然后调用equals()方法来判断两个对象是否相等。
调用hashcode()方法的结果如果相等,则进一步调用equals()判断,如果equals()的结果也为相等,则两个对象相等;
调用hashcode()方法的结果如果不等,则直接判定两个对象不等。

在本例中,由于没有重写hashcode()方法,所以HashMap使用的是Object中定义的hashcode()方法。而这个方法的定义,是一个对象只与其自身相等。所以在这样的判断机制下,用一个new出来的对象作为key去查询,肯定找不到与之相等的对象,返回的结果肯定是null。
8 楼 wangbing9577 2009-04-23  
重写了equals()方法的同时,也要重写public int hashCode()方法。否则基于hashcode的hashTable,hashMap,hashSet将无法正法工作。

对于本例来说,加入以下代码即可:
public int hashCode(){
return 0;
}
7 楼 mymGrubby 2008-11-05  
java 规范要求 equals 相同的两个 object 要有相同的 hashCode
6 楼 superloafer 2008-11-04  
看HashMap里get方法源代码之后就很清晰了:
        int hash = hash(key.hashCode());
        for (Entry e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }

当你想重写equals方法的时候其是想根据特定的逻辑来判断两个实例是否相等(比如你的PhoneNumber类),这时要注意最好重写hashCode方法。这点在《Effective Java》第九章的题目提到:Always override hashCode when you override equals,可以拿来看看。重写hashCode方法也是很有讲究的!
5 楼 ddandyy 2008-11-03  
hashcode
4 楼 hqbuaa1013 2008-11-03  
问题应该出在这一句:
m.put(new PhoneNumber(010,7541), "Jenny"); 

因为这里又new了一个新的对象。如果换成下面的代码:
PhoneNumber pn0=new PhoneNumber(010,7541);
m.put(pn0,"Jenny");

那么m.get(pn0)是能够返回Jenny的
3 楼 hqbuaa1013 2008-11-03  
dao2006 写道

你把两个全局变量声明了两个空的常量,构造方法不能对它赋值。 好奇,这个source怎么编译过去的~~~

构造方法是能够对成员area和extension赋值的,这是blank final变量。
2 楼 sunrie 2008-11-03  
怎么只覆盖了equals方法而没覆盖hashCode方法呢?
1 楼 dao2006 2008-11-02  
你把两个全局变量声明了两个空的常量,构造方法不能对它赋值。 好奇,这个source怎么编译过去的~~~

相关推荐

    java处理返回对象中字段为null的情况

    java处理返回对象中字段为null的情况,返回为字符串

    C语言中的"NULL"到底是什么?有什么用?

    1. **定义**:“NULL”在C语言中通常定义为 `(void *)0` 或者 `0`。在《标准C库》中,`&lt;stdlib.h&gt;` 头文件定义了 “NULL”,这使得“NULL”可以在不同的平台上保持一致性。 2. **作用**: - **标识空指针**:当一...

    springboot 处理返回结果中字段为空或为null,不展示字段的问题(字段展示不全)

    springboot 处理返回结果中字段为空或为null,不展示字段的问题(字段展示不全),给为空字段初始化值,如:字符串null转换为"

    解决了IoTDB第一值为null取最近一个有值的记录值返回的bug

    本次更新针对IoTDB的一个关键问题进行了修复,即当查询的第一个值为null时,系统无法正确返回最近一个非null的记录值。这个问题可能对数据分析和应用产生严重影响,因为无法获取到有效的历史数据。 IoTDB的核心功能...

    Oracle null的使用

    NULL 参与四则运算时返回为空对空值做加、减、乘、除等运算操作,结果仍为空。因此有时需 nvl 函数处理 NULL 的处理使用 NVL 函数。 组函数忽略空值。在实际应用中,根据需要可利用 nvl 函数用零代替空值。 空值...

    C# null 合并运算符??(双问号)使用示例

    这个运算符在处理可空类型(nullable types)和可能返回null的对象引用时特别有用,能够帮助避免因null引用异常而引发的错误。 当`??`运算符的左操作数(即在其左侧的表达式)非null时,整个表达式的值就是左操作数...

    解决服务器返回null的问题.zip

    在IT行业中,服务器返回null是一个常见的问题,尤其是在处理JSON数据或者API交互时。"解决服务器返回null的问题.zip"这个压缩包文件提供了解决这一问题的方案,特别关注于文本和富文本中的null值处理。下面将详细...

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    "解决mybatis使用char类型字段查询oracle数据库时结果返回null问题" 在使用mybatis框架对Oracle数据库进行查询操作时,如果使用char类型字段作为查询条件,可能会出现结果返回null的问题。这种情况下,需要对char...

    oraclesql判断值为空-Oracle-sqlserver的空值(null)判断.pdf

    为什么不能使用 = 和 != 来判断 Null 在 SQL 语句中,我们不能使用 `=` 和 `!=` 来判断 Null,这是因为 Null 是一种特殊的值,不是 0,也不是空字符串,而是表示不存在的意思。 因此,我们不能像字符串和数字那样...

    深入Java关键字null

    如果没有预先设置为`null`,则后续对该变量的使用可能会导致错误。例如: ```java Connection conn = null; try { conn = DriverManager.getConnection("url", "user", "password"); } catch (SQLException e) { ...

    null移动端崩溃问题

    首先,我们需要理解为什么null值会导致移动应用崩溃。在大多数编程语言中,尝试访问null对象的方法或属性会抛出异常,这在Java、Swift、Kotlin等移动开发常用的语言中尤为常见。例如,在Java中,如果你试图调用一个...

    git报错需要的null.sys

    首先,我们需要理解为什么Git会尝试操作`/dev/null`。在Git中,`/dev/null`常用于清理或重置标准输出和标准错误,特别是在一些命令执行后,可能需要清空输出以避免干扰后续的处理。例如,在某些脚本或者自动化任务中...

    PHP 获取JSON json_decode返回NULL解决办法

    PHP 获取JSON json_decode返回NULL解决办法,不小心在返回的json字符串中返回了BOM头的不可见字符,某些编辑器默认会加上BOM头,这样处理才能正确解析json数据

    数据库为空时,文本框不显示null

    当字段值不为null时,直接返回该值;反之,返回空字符串。 ### 四、总结 综上所述,“数据库为空时,文本框不显示null”这一需求可以通过多种方式实现。从数据库设计到应用逻辑处理,再到具体实现代码,都需要综合...

    HttpClient 卡死 response 为 null - 帐前卒 - CSDN1

    在使用Apache HttpClient库进行HTTP请求时,可能会遇到`HttpClient`返回`response`为`null`的问题,这通常意味着请求没有成功地完成或者某些资源没有被正确处理。在本篇文章中,我们将深入探讨这个问题的原因和解决...

    js判断undefined类型,undefined,null,NaN的区别

    例如,变量 a 被赋值为 null 时,typeof a 将返回 "object"。null 和 undefined 的区别在于,null 是一个有意识的赋值,而 undefined 是一个变量未被赋值或未被声明。 在比较运算中,null 和 undefined 被认为是...

    PHP 判断数组是否为NULL的5大方法

    你可以直接用`==`运算符比较数组与NULL,但请注意,这种方式可能产生一些预期之外的结果,因为它还会在非NULL值且值为FALSE时返回TRUE。然而,对于NULL,它是有效的: ```php $array = NULL; if ($array == NULL) {...

    IP NULLO 的作用

    IP NULL路由,也被称为黑洞路由,其主要作用是无痕地丢弃特定的数据包,不进行任何转发,也不触发任何返回信息。这种路由策略通常用于防止恶意流量、无效的或不需要的网络通信,例如DDoS攻击、非法端口扫描或者错误...

    Mysql实现null值排在最前/最后的方法示例

    IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。 &lt;=&gt;: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。 关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中...

Global site tag (gtag.js) - Google Analytics