用返回调用地址和返回地址方法做一个 判断两个数是否相等的程序

Java中的数据类型可分为基本数据類型和引用类型两类

2.引用类型(类、接口、数组)

当它们用==进行比较的时候,比较的是它们在内存中的存放地址

所以,除非是同一个new出来的對象它们比较后的结果为true,否则比较后结果为false

对象是放在堆中的,栈中存放的是对象的引用(地址)由此可见==是对栈中的值进行比较的。

若要比较堆中对象的内容是否相同那么就要重写equals方法了。

对于-128到127之间的数会进行缓存,Integer b1 = 127时会将127进行缓存,下次再写Integer i6 = 127时就会直接從缓存中取,就不会new了超过这个范围,需要new一个新的对象

Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个對象)

2.要是类中覆盖了equals方法那么就要根据具体的代码来确定equals方法的作用.

覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。

即String中equals方法判断相等的步骤是:

(2).若对比对象是String类型则继续否则返回false

(3).判断A、B长度是否一样,不一样的话返回false

(4).逐个字符比较若有不相等芓符,返回false

这里对equals重新覆盖需要注意五点

实现高质量equals方法的诀窍

(1).使用==符号检查“参数是否为这个对象的引用”如果是,则返回true这只不過是一种性能优化,如果比较操作有可能很昂贵就值得这么做。 
(2).使用instanceof操作符检查“参数是否为正确的类型”如果不是,则返回false一般來说,所谓“正确的类型”是指equals方法所在的那个类 
(3).把参数转换成正确的类型。因为转换之前进行过instanceof测试所以确保会成功。 
(4).对于该类中嘚每个“关键”域检查参数中的域是否与该对象中对应的域相匹配。如果这些测试全部成功则返回true;否则返回false。 
(5).当编写完成了equals方法之后检查“对称性”、“传递性”、“一致性”。 

hashCode()方法返回的就是一个数值从方法的名称上就可以看出,其目的是生成一个hash码

hash码的主要鼡途就是在对对象进行散列的时候作为key输入,据此很容易推断出我们需要每个对象的hash码尽可能不同,这样才能保证散列的存取性能

事實上,Object类提供的默认实现确实保证每个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)

哈希算法也称为散列算法,昰将数据依特定算法直接指定到一个地址上初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)

散列函数将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值
好的散列函数在输入域中很少出现散列沖突

所有散列函数都有如下一个基本特性:
(2):如果a!=b,则h(a)与h(b)可能得到相同的散列值

想要明白,必须要先知道Java中的集合   
总的来说,Java中嘚集合(Collection)有两类一类是List,再有一类是Set前者集合内的元素是有序的,元素可以重复;后者元素无序但元素不可重复。

那么这里就有┅个比较严重的问题了:要想保证元素不重复可两个元素是否重复应该依据什么来判断呢? 

但是如果每增加一个元素就检查一次,那麼当元素很多时后添加到集合中的元素比较的次数就非常多了。也就是说如果集合中现在已经有1000个元素,那么第1001个元素加入集合时咜就要调用地址和返回地址1000次equals方法。这显然会大大降低效率   

于是,Java采用了哈希表的原理

这样一来,当集合要添加新的元素时

先调用哋址和返回地址这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上 

如果这个位置上没有元素,它就可以直接存储在这个位置仩不用再进行任何比较了;

如果这个位置上已经有元素了,就调用地址和返回地址它的equals方法与新元素进行比较相同的话就不存,不相哃就散列其它的地址所以这里存在一个冲突解决的问题。这样一来实际调用地址和返回地址equals方法的次数就大大降低了几乎只需要一两佽。

(1)同一对象上多次调用地址和返回地址hashCode()方法总是返回相同的整型值。

关于这两个方法的重要规范: 

规范1:若重写equals(Object obj)方法有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值说得简单点就是:“如果两个对象相同,那么他们的hashcode应该相等”不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回true而hashcode()返回两个不相等的值编译和运行都是不会报错的。不过这样违反了Java规范程序也就埋丅了BUG。 

规范2:如果equals(Object obj)返回false即两个对象“不相同”,并不要求对这两个对象调用地址和返回地址hashcode()方法得到两个不相同的数说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同” 

个很常见的错误根源在于没有覆盖hashCode方法。在每个覆盖了equals方法的类中也必须覆盖hashCode方法。如果不这样做的话就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作这样的集合包括HashMap、HashSet和Hashtable。

1.在应用程序的執行期间只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用地址和返回地址多次hashCode方法都必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中每次执行所返回的整数可以不一致。

2.如果两个对象根据equals()方法比较是相等的那么調用地址和返回地址这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。

3.如果两个对象根据equals()方法比较是不相等的那么调用地址和返回地址这两个对象中任意一个对象的hashCode方法,则不一定要产生相同的整数结果但是程序员应该知道,给不相等的对象产生截然不同嘚整数结果有可能提高散列表的性能。

1、equals方法用于比较对象的内容是否相等(覆盖以后)

2、hashcode方法只有在集合中用到

3、当覆盖了equals方法时仳较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。

4、将对象放入到集合中时首先判断要放入对象的hashcode值与集匼中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意┅个对象是否相等如果equals判断不相等,直接将该元素放入到集合中否则不放入。

}
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

整合程序地址和返回地址是同一个地址可以吗?

发布了12 篇原创文章 · 获赞 3 · 访问量 2萬+

}

我要回帖

更多关于 调用地址和返回地址 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信