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

我们再看一个例子:

  1. public static void main(String[] args) {
  2. // TODO Auto-generated method stub
  3. String i1 = "hello";
  4. String i2="world";
  5. String i5=new String("helloworld");
  6. System.out.println(i5==(i1+i2));
  7.  
  8. Integer m1=40 ;
  9. Integer m2=0;
  10. Integer m3=40;
  11. System.out.println(m1==(m2+m3));
  12.  
  13. }

结果:false  true

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

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

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

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

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

Integer和String "+""=="方法的不同的更多相关文章

  1. Integer.valueOf(String) 方法之惑

    本文由 ImportNew - 靳禹 翻译自 stackoverflow.欢迎加入翻译小组.转载请见文末要求. 有个仁兄在 StackOverflow 上发起了一个问题,是这么问的: “ 我被下面的代 ...

  2. [转]Integer.valueOf(String) 方法之惑

    具体问题以前偶然遇到过,好象是一个java答题得分的论坛,当时做错还研究了下怎么回事,但是前两天遇到类似问题却没想起来.巩固下基础,转了下面文章. 以下内容转自:http://www.importne ...

  3. Integer.parseInt(String s, int radix)方法介绍(修正版)

    先来说明一下Integer.parseInt(String s, int radix)的功能. Integer.parseInt(String s, int radix)就是将整数字符串s(radix ...

  4. Integer.valueof(String s)和Integer.parseInt(String s)的具体区别是什么?

    Integer.valueof(String s)和Integer.parseInt(String s)的具体区别是什么? Integer.valueof(String s)是将一个包装类是将一个实际 ...

  5. Integer.parseInt(String s) 和 Integer.valueOf(String s) 的区别

    通过查看java.lang.Integer的源码可以发现, 它们最终调用的都是 /** * Parses the string argument as a signed integer in the ...

  6. Java中Integer类的方法

    java.lang 类 Integer java.lang.Object java.lang.Number java.lang.Integer 全部已实现的接口: Serializable, Comp ...

  7. Object转Integer,String

    object先转为字符串,然后通过int 的封装类(Integer)的pasreInt()方法转为int 例如: Object  ob = 123; Integer.parseInt(String.v ...

  8. Ruby字符串(2):String方法详细整理

    String方法整理 官方手册 类方法 new new(str="") → new_str new(str="", encoding: enc) → new_s ...

  9. 实例测试java的Integer转String的效率问题1.8

    原文链接:https://blog.csdn.net/chicaohun7473/article/details/100851373 查看String源码时,读到源码的toString方法时,打算探究 ...

随机推荐

  1. 016:Explain

    一. Explain EXPLAIN 官方文档 1.explain说明 explain是解释SQL语句的执行计划,即显示该SQL语句怎么执行的 使用explain的时候,也可以使用desc 5.6 版 ...

  2. MySQL 存储引擎、锁、调优、失误与事务回滚、与python交互、orm

    1.存储引擎(处理表的处理器) 1.基本操作 1.查看所有存储引擎 mysql> show engines; 2.查看已有表的存储引擎 mysql> show create table 表 ...

  3. [Python] Regular Expressions

    1. regular expression Regular expression is a special sequence of characters that helps you match or ...

  4. Flask之模板之控制语句

    3.4 控制语句 常用的几种控制语句: 模板中的if控制语句 @app.route('/user') def user(): user = 'dongGe' return render_templat ...

  5. 多线程环境下的UI异步操作

    转自原文 多线程环境下的UI异步操作 解决VS中,线程间不可互操作的问题,一揽子解决方案: 一.首先,定义一个类:SetControlProperty using System.Reflection; ...

  6. DataSnap 连接池 DSServer1Disconnect

    DataSnap Server DSServer1Disconnect 这个函数什么时候执行? void __fastcall TServerContainer1::DSServer1Disconne ...

  7. Spring oxm入门实例

    O/XMapper是什么? Spring3.0的一个新特性是O/XMapper.O/X映射器这个概念并不新鲜,O代表Object,X代表XML.它的目的是在Java对象(几乎总是一个plainoldJ ...

  8. python时间戳、日期、时间转换

    1.str转时间戳 # 字符类型的时间 tss1 = '2013-10-10 23:40:00' # 转为时间数组 timeArray = time.strptime(tss1, "%Y-% ...

  9. 关于启动MongDB的mongod.exe文件闪退的问题

    昨天学mongdb的时候,遇到了mongod.exe闪退的问题,解决办法很简单: 你可以不执行mongod.exe,直接用命令行操作 在你安装mongdb的盘的根目录下创建一个data文件夹,一定要在 ...

  10. 前端开发之HTML篇二

    主要内容: 一.表格标签 -- table 二.表单标签 -- form 三.常用标签属性和分类 四.标签嵌套规则 1️⃣  表格标签 -- table 表格由<table> 标签来定义. ...