java比较相等符
public class Test1 {
/**
* @param args
*/
public static void main(String[] args){
int a = 1000, b = 1000;
System.out.println(a == b);
Integer c = 1000, d = 1000;
System.out.println(c==d);
Integer e = 100, f = 100;
System.out.println(e == f);
}
}
运行结果:
true
false
true
结果分析:
查看Test1.class文件如下:
public class Test1 extends java.lang.Object{
public Test1();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: sipush 1000
3: istore_1
4: sipush 1000
7: istore_2
8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
11: iload_1
12: iload_2
13: if_icmpne 20
16: iconst_1
17: goto 21
20: iconst_0
21: invokevirtual #3; //Method java/io/PrintStream.println:(Z)V
24: sipush 1000
27: invokestatic #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
30: astore_3
31: sipush 1000
34: invokestatic #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
37: astore 4
39: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
42: aload_3
43: aload 4
45: if_acmpne 52
48: iconst_1
49: goto 53
52: iconst_0
53: invokevirtual #3; //Method java/io/PrintStream.println:(Z)V
56: bipush 100
58: invokestatic #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
61: astore 5
63: bipush 100
65: invokestatic #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
68: astore 6
70: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
73: aload 5
75: aload 6
77: if_acmpne 84
80: iconst_1
81: goto 85
84: iconst_0
85: invokevirtual #3; //Method java/io/PrintStream.println:(Z)V
88: return
}
由上述字节码我们可以看出 int a = 1000, b = 1000;System.out.println(a == b);执行的是if_icmpne命令,比较的是2个int值是否相等。在此返回为true。
而 Integer c = 1000, d = 1000;System.out.println(c==d);执行的是if_acmpne命令,比较的是对象引用地址。查看jdk源码
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
此时的值为1000,不在-128~127范围内。所以变量c和d是2个不同的对象。因此System.out.println(c==d);返回结果为false。
而 Integer e = 100, f = 100;System.out.println(e == f); 用的是Integer缓存中的同一对象,因此返回结果为true。
今天又是学习了。。。以前没有注意这个问题
转载与:http://blog.csdn.net/jeamking/article/details/6883623
java比较相等符的更多相关文章
- java访问修饰符
了解面向对象思想的同学们,都知道"封装"这一基本特征,如何正确运用访问修饰符,恰恰能体现出封装的好坏. java访问修饰符有四个: 1)public:访问权限最高,其修饰的类.类变 ...
- Java的修饰符
转自:http://blog.csdn.net/manyizilin/article/details/51926230#L42 修饰符: 像其他语言一样,Java可以使用修饰符来修饰类中方法和属性.主 ...
- java基础 (记事本编写hello world,path,classpath,java的注释符)
一:java的基本信息 jre 是指java运行环境,jdk 是指 java 开发工具集(并且里面是自带有jre运行环境的) jvm是指java的虚拟机 java的源代码的后缀名是 .java (例如 ...
- JAVA类型修饰符(public,protected,private,friendly)
JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...
- Java访问修饰符(访问控制符)
Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...
- Java字符串占位符(commons-text)替换(转载)
Java字符串占位符(commons-text)替换 https://blog.csdn.net/varyall/article/details/83651798 <dependency> ...
- 【java】标示符
java的标示符由数字0-9,字母a-zA-Z,_$组成.(java是严格区分大小写的) 标示符的规则: 1.不能以数字开头 2.不能使用关键字 一般的命名规则: 包名:多个单词组成时,所有字母全部小 ...
- Java类修饰符的使用与作用以及常见问题
首先明确,类是放在文件里的,在文件里面的不同位置就有不同的作用,就是不同类型的类. 1, 顶级类or外部类:包括两种,一个文件中与文件名同名称的类我们称作顶级类(也是外部类),如果在一个文件中的一个类 ...
- C#和JAVA 访问修饰符
JAVA ----------------------------------------------- 访问修饰符 描述 ------------------------------- ...
- 《Java基础知识》Java访问修饰符(访问控制符)
Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...
随机推荐
- SRM 586 DIV1
A 考虑都是格点 , 枚举所有y+-0.5就行了. trick是避免正好在y上的点重复统计. class PiecewiseLinearFunction { public: int maximumSo ...
- SUBTOTAL 函数与所在行
SUBTOTAL 函数与所在行 设计要点:数据汇总.隐藏.筛选 阿金:给你推荐一个函数SUBTOTAL. 秀秀:又是函数!俺不喜欢. 阿金:虽然你不喜欢函数,但是你也离不了啊,比如汇总. 秀秀:那倒是 ...
- 黑马程序员_<<泛型>>
--------------------ASP.Net+Android+IOS开发..Net培训.期待与您交流! -------------------- 1. 泛型 1.概述 泛型是为了解决 ...
- Ajax原生XHR对象
前端学了有一段时间了,在项目中我通常使用的都是jQuery封装好的Ajax函数($.ajax.$.get.$.post),使用非常的简单方便,但为了更清楚的了解Ajax,需要学习原生xhr对象. ...
- 挂载(mount)深入理解
首先引用一句 wiki 上的定义来开篇: Mounting takes place before a computer can use any kind of storage device (such ...
- redisi配置安装
一.单机配置 http://www.codeceo.com/article/centos-redis-setup.html 二.测试安装情况 http://blog.sina.com.cn/s/blo ...
- firefox 不能显示 glyphicons 字体
折腾了很久才发现是firefox 不能跨域下载相应的字体文件,将bootstrap相应的css文件和字体文件copy到调用的项目里,问题才得以解决.
- 使用jQuery操作元素的属性与样式
本文学习如何使用jQuery获取和操作元素的属性和CSS样式. 元素属性和Dom属性 对于下面这样一个标签元素: <img id='img' src="1.jpg" alt= ...
- [C#] 常用函数
查找字符串: string test="a,b,c,de"; 方法1:Contains test.Contains("b") //返回值 true 方法2:E ...
- NonUniqueObjectException 问题
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was alread ...