• Integer和String "+""=="方法的不同


    在上面的两个篇博客中,我们看到String和Integer不同的常量池的变现形式

    我们再看一个例子:

    public static void main(String[] args) {
    // TODO Auto-generated method stub
           String i1 = "hello";
            String i2="world";   
            String i5=new String("helloworld");
            System.out.println(i5==(i1+i2));
            
            Integer m1=40 ;
            Integer m2=0;
            Integer m3=40;
            System.out.println(m1==(m2+m3));
    
    	}

     结果:false  true

    一个是对String的操作,一个是对Integer的操作。我们仍 然用反编译的方法:javap -c test

     1 public class com.study.main.javaPTest extends java.lang.Object{
     2 public com.study.main.javaPTest();
     3   Code:
     4    0:   aload_0
     5    1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
     6    4:   return
     7 
     8 public static void main(java.lang.String[]);
     9   Code:
    10    0:   ldc     #2; //String hello
    11    2:   astore_1
    12    3:   ldc     #3; //String world
    13    5:   astore_2
    14    6:   new     #4; //class java/lang/String
    15    9:   dup
    16    10:  ldc     #5; //String helloworld
    17    12:  invokespecial   #6; //Method java/lang/String."<init>":(Ljava/lang/Str
    18 g;)V
    19    15:  astore_3
    20    16:  getstatic       #7; //Field java/lang/System.out:Ljava/io/PrintStream;
    21    19:  aload_3
    22    20:  new     #8; //class java/lang/StringBuilder
    23    23:  dup
    24    24:  invokespecial   #9; //Method java/lang/StringBuilder."<init>":()V
    25    27:  aload_1
    26    28:  invokevirtual   #10; //Method java/lang/StringBuilder.append:(Ljava/la
    27 /String;)Ljava/lang/StringBuilder;
    28    31:  aload_2
    29    32:  invokevirtual   #10; //Method java/lang/StringBuilder.append:(Ljava/la
    30 /String;)Ljava/lang/StringBuilder;
    31    35:  invokevirtual   #11; //Method java/lang/StringBuilder.toString:()Ljava
    32 ang/String;
    33    38:  if_acmpne       45 //比较两个string类型的变量的引用
    34 41: iconst_1 35 42: goto 46 36 45: iconst_0 37 46: invokevirtual #12; //Method java/io/PrintStream.println:(Z)V 38 49: bipush 40 39 51: invokestatic #13; //Method java/lang/Integer.valueOf:(I)Ljava/lang/ 40 teger; 41 54: astore 4 42 56: iconst_0 43 57: invokestatic #13; //Method java/lang/Integer.valueOf:(I)Ljava/lang/ 44 teger; 45 60: astore 5 46 62: bipush 40 47 64: invokestatic #13; //Method java/lang/Integer.valueOf:(I)Ljava/lang/ 48 teger; 49 67: astore 6 50 69: getstatic #7; //Field java/lang/System.out:Ljava/io/PrintStream; 51 72: aload 4 52 74: invokevirtual #14; //Method java/lang/Integer.intValue:()I 53 77: aload 5 54 79: invokevirtual #14; //Method java/lang/Integer.intValue:()I 55 82: aload 6 56 84: invokevirtual #14; //Method java/lang/Integer.intValue:()I 57 87: iadd //上面是获取对应变量的value,相当于在基本变量的基础上进行加操作和比较大小操作
    58 88: if_icmpne 95 59 91: iconst_1 60 92: goto 96 61 95: iconst_0 62 96: invokevirtual #12; //Method java/io/PrintStream.println:(Z)V 63 99: return 64 65 } View Code

     正如:上面代码的33和57行所示的那样:

    对于String类型的变量,他们是通过常量池的方式,记录每个独有的变量,但是在String中”+“操作只会生成另一个String类型的对象。“==”操作对于引用类型的变量是比较两者的对象是否相等

    对于Integer类型而言,他们也有常量池,但是他们的常量池是在程序中用数组的方式实现的(参考上一篇),而在进行”+“操作时,通过Integer.intValue()方法,取出每对象的value,再通过==来比较值是否相等,实际上在这个时候:Integer的”+“和”== “操作是基于基本数据类型进行的

  • 相关阅读:
    for循环,pydev提示未使用的变量,解决办法
    sc 与net命令的区别
    Selenium测试Ajax程序(转)
    Python yield 使用浅析(转)
    python操作Excel读写--使用xlrd
    Python操作Mysql实例代码教程在线版(查询手册)
    MySQL之alter语句用法总结
    使用WebDriver遇到的那些坑(转)
    python 列表转为字典的两个小方法
    python
  • 原文地址:https://www.cnblogs.com/fjsnail/p/3473813.html
Copyright © 2020-2023  润新知