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比较相等符的更多相关文章

  1. java访问修饰符

    了解面向对象思想的同学们,都知道"封装"这一基本特征,如何正确运用访问修饰符,恰恰能体现出封装的好坏. java访问修饰符有四个: 1)public:访问权限最高,其修饰的类.类变 ...

  2. Java的修饰符

    转自:http://blog.csdn.net/manyizilin/article/details/51926230#L42 修饰符: 像其他语言一样,Java可以使用修饰符来修饰类中方法和属性.主 ...

  3. java基础 (记事本编写hello world,path,classpath,java的注释符)

    一:java的基本信息 jre 是指java运行环境,jdk 是指 java 开发工具集(并且里面是自带有jre运行环境的) jvm是指java的虚拟机 java的源代码的后缀名是 .java (例如 ...

  4. JAVA类型修饰符(public,protected,private,friendly)

    JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...

  5. Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...

  6. Java字符串占位符(commons-text)替换(转载)

    Java字符串占位符(commons-text)替换 https://blog.csdn.net/varyall/article/details/83651798 <dependency> ...

  7. 【java】标示符

    java的标示符由数字0-9,字母a-zA-Z,_$组成.(java是严格区分大小写的) 标示符的规则: 1.不能以数字开头 2.不能使用关键字 一般的命名规则: 包名:多个单词组成时,所有字母全部小 ...

  8. Java类修饰符的使用与作用以及常见问题

    首先明确,类是放在文件里的,在文件里面的不同位置就有不同的作用,就是不同类型的类. 1, 顶级类or外部类:包括两种,一个文件中与文件名同名称的类我们称作顶级类(也是外部类),如果在一个文件中的一个类 ...

  9. C#和JAVA 访问修饰符

    JAVA ----------------------------------------------- 访问修饰符        描述 ------------------------------- ...

  10. 《Java基础知识》Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...

随机推荐

  1. 高德JAVA笔试题

    1.常用的RuntimeException. 2.叙述RuntimeException和一般异常的异同. 3.叙述ArrayList.Vector和LinkedList各自的特点和特性. 4.什么是反 ...

  2. Uber明年在中国将继续补贴,并大举进军100个城市!

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. JAVA并发七(多线程环境中安全使用集合API)

    在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...

  4. JS-string内置对象

    1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码. strObj.charCodeAt(index) 说明: index将被处理字符的从零开始计数的编号.有效值为0到字符 ...

  5. JDBC编程之优化

    1.创建 dbconfig.properties driver=com.mysql.jdbc.Driver dburl=jdbc\:mysql\://localhost\:3306/mytest us ...

  6. Linux常见面试题

      一.填空题:1. 在Linux系统中,以 文件 方式访问设备 .2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统.3. Linux文件系统中每个文件用 索引节点来标 ...

  7. DFBle.swift

    ////  DFBle.swift//  DFBle////  Created by LeeYaping on 15/9/2.//  Copyright (c) 2015年 lisper. All r ...

  8. openwrt time sycronize

    三行命令搞定这个. opkg update opkg install ntpclient ntpclient -s -c 0 -h ntp.sjtu.edu.cn 最后把这个 放到 rc.local ...

  9. Oracle 11g 完全卸载

    停止所有Oracle 11g相关的服务 1.打开"服务"窗口 键入命令:"services.msc",回车,如下图: 2.停止所有Oracle 11g相关的服务 ...

  10. java基础之导出(Excel)

    function exportExcel() { $.messager .confirm( '提示信息', '您确定要导出到Excel?', function(r) { if (r) { var co ...