Java中用于测试对象的等价性有三个操作符:== , != 和 Equals()

对于基本类型即int,boolean, byte 等等来说,==和 != 比较的是 基本类型的内容,这和c、c++是一样的;

public class Ex5 {
public static void main(String[] args) {
int i = 34;
int ii = 34;
System.out.println(i==ii);
}
} //output: true

对于其他类型来说, == 和 != 比较的是对象的引用,显然是不等的,如果要比较对象之间的内容,对象所属的类型必须实现Equals()方法(大多数Java类库中都实现了Equals方法),如果没有实现Equals方法,会自动调用object中的Equals方法,而该方法是用来比较“地址”的,因此结果会是false。

public class Ex5 {
public static void main(String[] args) { Integer i1 = new Integer(34);
Integer i2 = new Integer(34);
System.out.println(i1==i2); System.out.println(i1.equals(i2));
}
}
//output:
//false
//true 

后来发现一个奇怪的问题,比如如下这段代码,输出的却是true。

public class Ex5 {
public static void main(String[] args) {
Integer i1 = 34;
Integer i2 = 34;
System.out.println(i1==i2);
}
}
//output:
//true

Integer i = 34这种赋值方式会调用Integer的ValueOf()缓存(如果不在-128~127之间则不会缓存)为基本类型(jvm会为Integer预先分配一部分内存,在以后有请求Integer对象时,若值位于-128~127时,系统都会让它指向这个预分配好的Integer对象)

public class Ex5 {
public static void main(String[] args) {
Integer i1 = 34;
Integer i2 = 34;
Integer i3 = Integer.ValueOf(34);
System.out.println(i1==i2);
System.out.println(i1==i3);
}
}
//output:
//true
//true

Integer与int比较相等时,会将Integer转换为进行转换为int再比较,所以最终比较的是内容。  

Java中测试对象的等价性的更多相关文章

  1. JAVA中JavaBean对象之间属性拷贝的方法

    JAVA中JavaBean对象之间的拷贝通常是用get/set方法,但如果你有两个属性相同的JavaBean或有大部分属性相同的JavaBean,对于这种情况,可以采用以下几个简便方法处理. 下面对这 ...

  2. java中直接打印对象

    java中直接打印对象,会调用对象.toString()方法.如果没有重写toString()方法会输出"类名+@+hasCode"值,hasCode是一个十六进制数 //没有重写 ...

  3. Java中的对象池技术

    java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...

  4. Java中计算对象的大小

    一.计算对象大小的方法 Java中如何计算对象的大小呢,找到了4种方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法: 2.BTrac ...

  5. 如何在Java中测试类是否是线程安全的

    通过优锐课的java核心笔记中,我们可以看到关于如何在java中测试类是否线程安全的一些知识点汇总,分享给大家学习参考. 线程安全性测试与典型的单线程测试不同.为了测试一个方法是否是线程安全的,我们需 ...

  6. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  7. 【译】Java中的对象序列化

    前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...

  8. 如何使用java中的对象

    使用java中的对象,分2步: 1.创建一个对象: 2.使用对象的属性和方法. 见下面的示例代码: package com.imooc; //1.定义一个类 public class Telphone ...

  9. Java中String对象的不可变性

    首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=n ...

随机推荐

  1. STL 常见操作

    stl的操作不是很熟练, 记录一下 1.vector: 排序: sort(vc.begin(),vc.end()); 去重: sort(vc.begin(),vc.end()); num.erase( ...

  2. 简单修改hosts文件加快打开网页速度

    这个电脑小技巧的帖子菲菲博客分享如何通过简单一招利用修改系统的hosts文件来实现有效加快浏览器打开网页的速度.尤其是网络繁忙时DNS服务器负担加重的时候效果特别明显,有兴趣就和菲菲一起来学习一下吧, ...

  3. js拆分数组

    <script language="javascript"> str="2,2,3,5,6,6"; //这是一字符串 var strs= new A ...

  4. [转]notepad++各种插件

    http://www.crifan.com/files/doc/docbook/rec_soft_npp/release/htmls/npp_common_plugins.html

  5. C#图片处理示例(裁剪,缩放,清晰度,水印)

    C#图片处理示例(裁剪,缩放,清晰度,水印) 吴剑 2011-02-20 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的一些应用,比 ...

  6. c# 模拟 网页实现12306登陆、自动刷票、自动抢票完全篇

    这一篇文章,我将从头到尾教大家使用c#模拟网页面登陆12306网站,自动刷票,选择订票人,到最后一步提交订单.研究过HTTP协议的童鞋们都知道,我们在访问网站时,是有两种方式的,POST和GET方式, ...

  7. netstat -an 提示:不是内部或外部命令

      输入cmd,点击确定按钮:   进入dos操作界面效果:   然后输入netstat -an 然后回车,查看端口: 5 如果输入:netstat -an,提示:不是内部或外部命令,也不是可运行的程 ...

  8. java中的String设计原理

    首先,必须强调一点:String Pool不是在堆区,也不是在栈区,而是存在于方法区(Method Area) 解析: String Pool是常量池(Constant  Pool)中的一块. 我们知 ...

  9. POJ2817 WordStack(状压DP)

    题目给几个字符串,可以给它们添加前导空格,然后排列,计算每一个字符串和前一个字符串相同非空格字符相等的个数,求可能的最大个数. 状态DP: d[S][i][j]表示已经用的字符串集合S且排列的最后一个 ...

  10. 什么是 IntentService

    service 默认也运行在 UI 线程,所以里面不能直接做耗时操作,要做耗时操作还得开启子线程来做. IntentService 就是一个 Service, 只不过里面给你默认开启了一个子线程来处理 ...