对象比较

问题描述

可以解释下为什么吗?

解决方案

解决方案二:
楼主看一下Integer的valueOf的实现publicstaticIntegervalueOf(inti){assertIntegerCache.high>=127;if(i>=IntegerCache.low&&i<=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}

Integer会将127以内的数字缓存在缓存池中,而大于等于128的数字,则需要new出来Integer.valueOf(127)==Integer.valueOf(127);//trueInteger.valueOf(128)==Integer.valueOf(128);//falseIntegernum1=150;Integernum2=150;System.out.println(num1==num2);这里面涉及拆箱装箱的操作,JVM先将num1,num2做个IntegerValueOf()操作,然后再做==比较
解决方案三:
答案解析:1.==比较的是对象的引用当且仅当比较的两个引用指向同一对象才返回true。2.Integeri=XXX看看Integer的源代码就知道了,其实就是Integer把-127-128之间的每个值都建立了一个对应的Integer对象,类似一个缓存。由于Integer是不可变类,因此这些缓存的Integer对象可以安全的重复使用。Integeri=XXX,就是Integeri=Interger.valueOf(XXX),首先判断XXX是否在-127-127之间,如果是直接return已经存在的对象,否则就只能new一个了。
解决方案四:
在Java语言里:1)对于对象来讲(String,Integer等大写字母开头的类型所定义的对象),除了去判断是否为空(null)可以使用==以及!=以外,尽可能的使用equals来判断值是否相等2)基本数据类型(char,int等小写字母开头的类型)可以使用==和!=进行安全的判断示例:packagetopics_390899847;publicclassExample{publicstaticvoidmain(String[]args){//错误、危险的书写方法Integera100=100;Integerb100=100;System.out.println("a100==b100:"+(a100==b100));Integera155=155;Integerb155=155;System.out.println("a155==b155:"+(a155==b155));System.out.println("newInteger(0)==newInteger(0):"+(newInteger(0)==newInteger(0)));Integeri=newInteger(0);Integerj=newInteger(0);if(i<=j&&j<=i&&i!=j){System.out.println("不可思议的走到了这里");}else{System.out.println("不可思议的居然没走到这里");}//正确、安全的书写方法System.out.println("a100.equals(b100):"+(a100.equals(b100)));System.out.println("a155.equals(b155):"+(a155.equals(b155)));System.out.println("newInteger(0).equals(newInteger(0)):"+(newInteger(0).equals(newInteger(0))));}}

输出:a100==b100:truea155==b155:falsenewInteger(0)==newInteger(0):false不可思议的走到了这里a100.equals(b100):truea155.equals(b155):truenewInteger(0).equals(newInteger(0)):true

其中【不可思议的走到了这里】和【什么东西又黑又白又红】一样,颠覆了大多数程序员的常识……而【newInteger(0)==newInteger(0):false】又打破了【-127-128之间的每个值都建立了一个对应的Integer对象】的神话……建议:1)推荐阅读《Java解惑》【JavaPuzzles是EffectiveJava作者写的一本关于Java语言中的一些“陷阱”相关的书】这次的疑问可以参考【Puzzle32:CurseofLooper】2)最好用论坛的【代码->Java】来发表问题,这样回复的人很快就能通过复制、粘贴获得代码,不用重新敲一遍了
解决方案五:
Java解惑:陷阱、缺陷、犄角旮旯案例【旮旯:9个太阳才能照到的地方】JavaPuzzlers:Traps,Pitfalls,andCornerCases豆瓣书评【http://book.douban.com/subject/5362860/】C陷阱与缺陷CTrapsandPitfalls豆瓣书评【http://book.douban.com/subject/2778632/】这样的书是告诫程序员【不该做什么的书】,在看完告诉程序员【应该做什么】的《Java核心技术》或者《Java编程思想》之后,正式书写代码之前,值得认真阅读没读这本书之前____,读了这本书之后____。我最喜欢这样的书评了……我自己的真实感觉:没读这本书之前,觉得自己Java没啥不会的了,读了这本书之后,觉得后背都是冷汗……
解决方案六:
Integeri=XXX中,XXX会放入常量池中,只不过值要在-127-128之间。
解决方案七:
引用1楼magi1201的回复:

楼主看一下Integer的valueOf的实现publicstaticIntegervalueOf(inti){assertIntegerCache.high>=127;if(i>=IntegerCache.low&&i<=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}

Integer会将127以内的数字缓存在缓存池中,而大于等于128的数字,则需要new出来Integer.valueOf(127)==Integer.valueOf(127);//trueInteger.valueOf(128)==Integer.valueOf(128);//falseIntegernum1=150;Integernum2=150;System.out.println(num1==num2);这里面涉及拆箱装箱的操作,JVM先将num1,num2做个IntegerValueOf()操作,然后再做==比较

跪了,以前只知道引用和拆箱装箱的问题,没想到居然还有这一手

时间: 2024-07-31 19:03:42

对象比较的相关文章

VB.NET中有用的通用对象列表

要使用List(of T),我们需要了解如何部署.NET框架所提供的多种方法.这也将是本文要介绍的内容.我已经编写好了三个示例--使用ForEach, FindAll,和Sort--来阐述同样列表类的工作原理. 第一步是要创建一个同用列表.你可以从多种途径获取数据,但是最简单的方法是添加.文本中,我们会编写代码以便为举例中的集来分类.因此,下面我们就来讲讲创建集的代码. 首先,我需要一个能代表集中的Bottle的对象.为此而编写的代码是完全符合标准的,而且事实上,VB.NET 2008 Expr

[Java] 方法锁、对象锁和类锁的意义和区别

版权声明:请尊重个人劳动成果,转载注明出处,谢谢! 目录(?)[+] 首先的明白Java中锁的机制 synchronized  在修饰代码块的时候需要一个reference对象作为锁的对象.  在修饰方法的时候默认是当前对象作为锁的对象.  在修饰类时候默认是当前类的Class对象作为锁的对象.   线程同步的方法:sychronized.lock.reentrantLock分析 方法锁(synchronized修饰方法时) 通过在方法声明中加入 synchronized关键字来声明 synch

C#对象序列化和反序列化

C#对象序列化和反序列化,如下代码示例: using System;  using System.Text;  using System.Collections.Generic;  using System.IO;  using System.Runtime.Serialization.Formatters.Binary;    class SerializableOperate  {      private static void ObjectSerializable(object obj,

PHP 5 数据对象 (PDO) 抽象层与 Oracle

oracle|对象|数据 一名新 PHP 数据对象 (PDO) 数据抽象层的原始开发人员为您简要介绍该抽象层,重点讲述与 Oracle 一起运行的情况. 需要 PHP:5.0 需要其他:Oracle 8 或更高版本客户端库 下载用于 Oracle 的 PDO (Windows):php_pdo.dll, php_pdo_oci.dll 下载用于 Oracle 的 PDO (Unix):pdo, pdo_oci PDO 简介 PHP 主要是由志愿者完成的项目:尽管有少数一些固定的"核心"

jsp标签-如何通过jsp页面生成List对象

问题描述 如何通过jsp页面生成List对象 如何把通过iterator遍历的List对象,设置成可编辑的状态,然后提交的时候,又能自动封装成一个List对象? 跪求~!在线等... 解决方案 可以将这个iterator中的单个元素的id设置成相同,后台中的将这个id名与一个list对应这样当你提交的时候就会获取一个修改后list

空间|时间|对象 圈人 + 目标人群透视 - 暨PostgreSQL 10与Greenplum的对比和选择

标签 PostgreSQL , PostGIS , geohash , brin , gist索引 , Greenplum , HybridDB for PostgreSQL 背景 通常一个人的常驻地可能会包括:家.儿女家.双方父母家.情人.异性伴侣家.公司.商圈若干等. 通过对这些数据的运营,可以实现很多业务需求.例如: 1.寻人 <海量用户实时定位和圈人 - 团圆社会公益系统(位置寻人\圈人)> 2.线下广告投放人群圈选,选址,商圈人群画像. <数据寻龙点穴(空间聚集分析) - 阿里

innerhtml-无法设置属性“innerHTML”的值: 对象为 null 或未定义

问题描述 无法设置属性"innerHTML"的值: 对象为 null 或未定义 function getdbxx(posturl, paramstr, spanid, inputid) { $.ajax({ type : "post", url : posturl, dataType : 'json', data : 'portletConfigJson=${portletConfigJson}&'+paramstr, success : function(

对象-文件无法写入!还有NullPointerException的问题

问题描述 文件无法写入!还有NullPointerException的问题 (1) 设计一个复数运算接口OperatorListener,定义抽象方法Complex add(Complex z) (2) 设计一个复数类Complex,此复数类实现OperatorListener接口,该类定义 私有属性:实部,虚部 方法:返回此复数的详细信息String toString(),输出格式例如3+4i 实现接口里的Complex add(Complex stu)抽象方法,实现复数的相加 构造方法:有参

保存对象的不同状态值

保存对象的不同状态值   效果   说明 1. 存储不同的状态,对于一个对象而言还是很有必要的,尤其是需要频繁切换状态的时候. 2. block是对象,是可以存储在集合中的.   源码 https://github.com/YouXianMing/ViewState // // NSObject+StatePattern.h // ViewState // // Created by YouXianMing on 15/6/30. // Copyright (c) 2015年 YouXianMi

求大神解答一下-java中对象流objectstream问题

问题描述 java中对象流objectstream问题 输出的为什么不是cyh男20 ym女20求大神解答!!!!!!!!!! 解决方案 你的代码和我这个一样吗?麻烦把你的代码粘全了,我看看 解决方案二: 这个是照片......... 解决方案三: 我和你写的差不多,不知道你为啥会这样,我给你粘出我的代码package lianxi; import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOE