java语言hashcode和真实物理地址的关系以及相关几个问题 java对象的物理地址有什么用

\u5173\u4e8ehashCode\u548c\u5730\u5740\u95ee\u9898

\u4f60\u5728list.add(123)\u8fd9\u4e00\u6b65\u64cd\u4f5c\u4e4b\u540e\u5df2\u7ecf\u6539\u53d8\u4e86list\u5bf9\u8c61\u7684\u72b6\u6001\uff0c\u4e5f\u6539\u53d8\u4e86\u5b83\u7684hashCode\uff0c\u4e4b\u524d\u8ba1\u7b97\u7684hashCode\u5df2\u7ecf\u8fc7\u65f6\uff0c\u5e94\u8be5\u91cd\u65b0\u8ba1\u7b97hashCode\u3002

\u5f15\u7528\u662f\u5b58\u50a8\u5728\u6808\u5185\u5b58\u4e2d\u7684\uff0c\u800c\u5bf9\u8c61\u662f\u5b58\u5728\u5806\u5185\u5b58\u4e2d\u7684\uff0c\u4e00\u4e2a\u5bf9\u8c61\u7684\u5f15\u7528\u5c31\u662f\u901a\u8fc7\u5185\u5b58\u5730\u5740\u6765\u8bbf\u95ee\u5bf9\u8c61\u672c\u8eab\uff0cjava\u4e2d\u5c31\u662f\u901a\u8fc7\u5f15\u7528\u6765\u627e\u5230\u5bf9\u8c61\uff0c\u8fd9\u4e2a\u53ef\u4ee5\u4ece\u5806\u6808\u5185\u5b58\u5173\u7cfb\u7684\u539f\u7406\u6765\u89e3\u91ca\uff0c\u603b\u4e4b\u662f\u4e3a\u4e86\u63d0\u9ad8\u6548\u7387\u3002

第一,输出的是:getClass().getName() + "@" + Integer.toHexString(hashCode()),这是jdk对toString方法的实现。

第二,“==”比较的就是一个对象的引用地址是否相同,即是不是一个对象。即不是左右两边非一个对象的话,该运算就返回false。

hashcode和物理地址没关系,只是一种约定,并非强制性的。主要是为相关哈希集合及运算服务的。再具体的部分要看jdk关于hashcode的解释了。

第三,java没有指针操作,但到处都是指针操作,即对象操作,即通过对象操作指针即物理地址,而本身是不可以看到物理地址,也就不能直接操作了,全都交给jvm了。



这个问题的解释其实很复杂,就简单其鉴来说,直接回答楼主的3个问题:
1、输出的是:getClass().getName() + "@" + Integer.toHexString(hashCode()),这是jdk对toString方法的实现。
2、“==”比较的就是一个对象的引用地址是否相同,即是不是一个对象。即不是左右两边非一个对象的话,该运算就返回false。
hashcode和物理地址没关系,只是一种约定,并非强制性的。主要是为相关哈希集合及运算服务的。再具体的部分要看jdk关于hashcode的解释了。
3、java没有指针操作,但到处都是指针操作,即对象操作,即通过对象操作指针即物理地址,而本身是不可以看到物理地址,也就不能直接操作了,全都交给jvm了。
再思考下吧。

问题1,对的Object o1=new Object();
System.out.println(o1); 输出java.lang.Object@12d96f2
System.out.println(o1.hashCode());输出19764978,其实就是12d96f2的十进制形式
问题二,"=="比较的o1和o2指向堆栈的地址,因为o1和o2都是对象。对象不同于常量,它在堆栈中声明一个地址,这个地址指向对象在堆内存中的实际内存。
问题三,这个没研究过。

ps:

Object o1 = new Object();

Object o2 = new Object();
因为o1在堆栈中是一个地址,o2在堆栈是另一个地址,所以"=="是用于不可能相等的。
所以有的时候,我们把equals方法重载,根据对象里的属性来判断两个对象是否相等。
实际上除非你写成这样。
Object o1 = new Object();
o2=o1;
"=="才会判断相等,因为这时候两个对象的堆内存指向堆栈的同一个地址。

//这是System.out.println的实现,把Object变成string打印出来
public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
//那String.valueOf干了什么?
public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }
//接下来就是toString了
public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
//hashCode怎么生成?
public native int hashCode();
//好,悲剧了。不过有人留了段注释交代hashcode应该是个什么样子的
/*
The general contract of hashCode is:
只要程序没死,某个object的hashcode不能变,除非equals方法里用到的条件变了。

当然程序挂掉重启的话可以变
Whenever it is invoked on the same object more than once during an execution 
of a Java application, the hashCode method must consistently return 
the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent 
from one execution of an application to another execution of the same 
application.
两个object equal的话,hashcode一定相同
If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects 
must produce the same integer result.
两个object不equal的话,hashcode倒也不一定不同
不过用在hash table的时候,不同object保证有不同hashcode会提高性能的哦
It is not required that if two objects are unequal according to the 
java.lang.Object.equals(java.lang.Object) method, then calling the hashCode method on each of the two objects 
must produce distinct integer results. 
However, the programmer should be aware 
that producing distinct integer results for unequal objects may improve the 
performance of hash tables.
As much as is reasonably practical, the hashCode method defined by class 
Object does return distinct integers for distinct objects. (This is 
typically implemented by converting the internal address of the object into an 
integer, but this implementation technique is not required by the JavaTM programming language.)
*/
//虽说Object的hashCode时常和物理地址有关,但难保有些非主流虚拟机不按常理出牌……
//所以看jdk的代码比问百度知道要清楚多了

下面两个问题erliang20088已经专业回答了



  • java涓鈥hashcode鈥濅粈涔堟椂鍊欑敤?鎬庝箞鐢?
    绛旓細\x0d\x0a鎵浠ワ紝Java瀵逛簬eqauls鏂规硶鍜hashCode鏂规硶鏄繖鏍疯瀹氱殑锛
  • java鍏充簬hashcode,equals,==鐨勭枒闂
    绛旓細hashCode()鍜宔quals(Object o)鏂规硶鏄java鎵鏈夌被鐨勫熀绫籓bject绫讳腑鐨勬柟娉曪紝鎵鏈夌被閮界户鎵夸簡Object绫讳互鍙婂叾涓殑鏂规硶銆俥quals涓巋ashCode鐨勫畾涔夊繀椤讳竴鑷达紝鍗筹細濡傛灉x.equals(y)杩斿洖true锛岄偅涔坸.hashCode()灏卞繀椤讳笌y.hashCode()鍏锋湁鐩稿悓鐨勫笺傚綋鐒讹紝瀵逛簬涓や釜涓嶅悓鐨勫璞★紝x.hashCode()涓巠.hashCode()鍩烘湰涓嶄細鐩稿悓...
  • 璇锋暀java涓鐨hashCode()鏂规硶 鍏蜂綋鏄粈涔堟剰鎬?浣滅敤?涓鑸敤鍦ㄤ粈涔堝湴鏂...
    绛旓細hashCode 鐨勫父瑙勫崗瀹氭槸锛氬湪 Java 搴旂敤绋嬪簭鎵ц鏈熼棿锛屽湪瀵瑰悓涓瀵硅薄澶氭璋冪敤 hashCode 鏂规硶鏃讹紝蹇呴』涓鑷村湴杩斿洖鐩稿悓鐨勬暣鏁帮紝鍓嶆彁鏄皢瀵硅薄杩涜 equals 姣旇緝鏃舵墍鐢ㄧ殑淇℃伅娌℃湁琚慨鏀广備粠鏌愪竴搴旂敤绋嬪簭鐨勪竴娆℃墽琛屽埌鍚屼竴搴旂敤绋嬪簭鐨勫彟涓娆℃墽琛岋紝璇ユ暣鏁版棤闇淇濇寔涓鑷淬傚鏋滄牴鎹 equals(Object) 鏂规硶锛屼袱涓璞℃槸鐩哥瓑鐨勶紝...
  • hashCode()鍜宔quals()鏂规硶鐨勯噸瑕佹т綋鐜板湪浠涔堝湴鏂?
    绛旓細Java涓鐨凥ashMap浣跨敤hashCode()鍜宔quals()鏂规硶鏉ョ‘瀹氶敭鍊煎鐨勭储寮曪紝褰撴牴鎹敭鑾峰彇鍊肩殑鏃跺欎篃浼氱敤鍒拌繖涓や釜鏂规硶銆傚鏋滄病鏈夋纭殑瀹炵幇杩欎袱涓柟娉曪紝涓や釜涓嶅悓鐨勯敭鍙兘浼氭湁鐩稿悓鐨刪ash鍊硷紝鍥犳锛屽彲鑳戒細琚泦鍚堣涓烘槸鐩哥瓑鐨勩傝屼笖锛岃繖涓や釜鏂规硶涔熺敤鏉ュ彂鐜伴噸澶嶅厓绱犮傛墍浠ヨ繖涓や釜鏂规硶鐨勫疄鐜板HashMap鐨勭簿纭у拰姝g‘鎬...
  • 鎯抽棶涓HASHCODE鍦JAVA閲岀殑姒傚康鍙婂叾浣滅敤鍜岀敤娉
    绛旓細灏辨槸涓涓暎鍒楃爜銆備竴鑸儏鍐典笅锛屽鏋hashCode鐩稿悓锛屽垯equals搴旇涔熷垽瀹氱浉绛夈傚氨鍍廙D5涓鏍凤紝浣嗘病MD5閭d箞澶嶆潅銆傛暎鍒楃殑浠峰煎湪浜庨熷害锛屼娇寰楁煡璇㈠緱浠ュ揩閫熻繘琛屻傛煡璇竴涓肩殑杩囩▼棣栧厛灏辨槸璁$畻鏁e垪鐮侊紝鐒跺悗浣跨敤鏁e垪鐮佹煡璇㈡暟缁勩傛暟缁勫苟涓嶇洿鎺ヤ繚瀛樺硷紝鑰屾槸淇濆瓨鍊肩殑list銆傜劧鍚庡list涓殑鍊间娇鐢╡quels锛堬級鏂规硶杩涜绾挎ф煡璇
  • java璇█hashcode鍜鐪熷疄鐗╃悊鍦板潃鐨勫叧绯讳互鍙婄浉鍏冲嚑涓棶棰
    绛旓細hashcode鍜鐗╃悊鍦板潃娌″叧绯伙紝鍙槸涓绉嶇害瀹氾紝骞堕潪寮哄埗鎬х殑銆備富瑕佹槸涓虹浉鍏冲搱甯岄泦鍚堝強杩愮畻鏈嶅姟鐨勩傚啀鍏蜂綋鐨勯儴鍒嗚鐪媕dk鍏充簬hashcode鐨勮В閲婁簡銆傜涓夛紝java娌℃湁鎸囬拡鎿嶄綔锛屼絾鍒板閮芥槸鎸囬拡鎿嶄綔锛屽嵆瀵硅薄鎿嶄綔锛屽嵆閫氳繃瀵硅薄鎿嶄綔鎸囬拡鍗崇墿鐞嗗湴鍧锛岃屾湰韬槸涓嶅彲浠ョ湅鍒扮墿鐞嗗湴鍧锛屼篃灏变笉鑳界洿鎺ユ搷浣滀簡锛屽叏閮戒氦缁檍vm浜嗐
  • JAVA涓equals,clone,finalize,hashcode,to string 鏄粈涔堟剰鎬
    绛旓細equals鏄寚鏄惁鐩稿悓锛 涓鑸敤浣滃紩鐢ㄧ被鍨嬫暟鎹姣旂殑銆俢lone鏄厠闅嗙殑鎰忔濓紝 涓鑸敤浜庝粠涓涓暟缁勫厠闅嗗埌鍙︿竴涓暟缁勯噷銆俧inalize鏄ぇ姒傚氨鍨冨溇鍥炴敹鐨勬剰鎬濄hashcode鏄寚姣忎竴涓璞¢兘鏈変釜鍝堝笇鐮侊紝渚嬪锛氣滃垬寰峰崕鈥濈殑hashcode鐨勭爜鏄43543003锛宼ostring 鏄寚灏嗘暟鎹鎹㈡垚string绫诲瀷 ...
  • java閲宔quals鍜hashCode涔嬮棿浠涔堝叧绯
    绛旓細equals涓巋ashcode鐨勫叧绯绘槸锛氫袱涓璞″湪equals鐩哥瓑鐨勬儏鍐典笅锛宧ashcode鏈夊彲鑳界浉绛変篃鏈夊彲鑳戒笉鐩哥瓑锛岃屼袱涓璞″湪hashcode涓嶇浉绛夌殑鎯呭喌涓嬶紝equals涔熷繀瀹氫笉鐩哥瓑銆傜悊瑙quals鐨勫簲鐢細瀹冩槸鐢ㄤ簬鐢ㄦ埛鍦ㄨ繘琛屽姣旂殑鏃跺欙紝杩欎釜鏃跺欏姣旂殑鏄唴瀹规槸鍚︾浉绛夌悊瑙ashcode鐨勫簲鐢細渚嬪set闆嗗悎锛屽畠鐨勪笉鍙噸澶嶏紝杩涜瀵规瘮鐨勪究鏄痟ashcode...
  • JAVA涓涓轰粈涔堜袱涓笉鍚岀殑瀵硅薄hashCode鏈夊彲鑳戒細鐩稿悓?
    绛旓細1.equals()鐩哥瓑鐨勪袱涓璞′粬浠殑hashCode()鑲畾鐩哥瓑锛屼篃灏辨槸鐢╡quals()瀵规瘮鏄粷瀵瑰彲闈犵殑銆2.hashCode()鐩哥瓑鐨勪袱涓璞′粬浠殑equal()涓嶄竴瀹氱浉绛夛紝涔熷氨鏄痟ashCode()涓嶆槸缁濆鍙潬鐨勩傚啀鏉ョ湅涓轰粈涔堢敤hashCode()濡傛灉鐜板湪鏈夊ぇ閲忕殑瀵硅薄闇瑕佹瘮杈冿紝姣忎釜閮界敤equals() 鏁堢巼鏄緢浣庣殑锛屼絾hashCode()鏁堢巼寰堥珮 鎵浠ユ湁...
  • java涓涓や釜瀵硅薄鍊肩浉鍚屽嵈鍙兘鏈変笉鍚岀殑hashcode瀵瑰悧
    绛旓細hashcode鍐冲畾鐨勬槸涓よ呮槸涓嶆槸鍚屼竴涓璞★紝鍊煎彲浠ョ畝鍗曠悊瑙d负瀵硅薄鐨勫硷紱濡傛灉hashcode绠楁硶瀹屽杽鏃犵己锛岄偅涔堝畠鐩稿悓鍒欏煎氨涓瀹氱浉鍚岋紝鍥犱负涓よ呭氨鏄悓涓涓璞★紝鍊艰兘涓嶇浉鍚屼箞锛 hashcode涓嶅悓锛屽垯璇存槑涓よ呬笉鏄悓涓瀵硅薄锛岃屼笉鍚屽璞′篃鏈夊彲鑳藉肩浉绛夛紝杩欏氨鏃犳硶纭畾浜嗐傜悊鎯虫儏鍐垫槸锛屽彧鏈夋槸鍚屼竴涓璞★紝hashcode鎵嶇浉鍚岋紝涓...
  • 扩展阅读:1688精品货源网站入口 ... java serversocket ... java.52emu.cn ... javascript免费网站 ... java webservice ... 黑马java视频 ... lazada卖家登录入口官网 ... 任天堂网站入口 ... java hashtable ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网