在上面的两个篇博客中,我们看到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 }

正如:上面代码的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. MySQL 加快导入数据

    1.临时关闭binlog,避免写入日志 set sql_log_bin = off: mysql> show VARIABLES like '%log_bin%'; +------------- ...

  2. C语言经典面试题 与 C语言面试宝典

    1 预处理 问题1:什么是预编译?何时需要预编译? 答: 预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作.主要处理#开头的指令.如拷贝#include包含的文件代码.替换# ...

  3. FastJSON使用笔记

    虽然使用FastJSON来生成JSON数据非常简单 最常用的的方法就是JSON.toJSONString()静态方法,这个方法参数可以给一个String,也可以是一个int,也可以给一个Object类 ...

  4. Android——日期格式化转换符

    常见日期格式化转换符 转换符 说 明 示 例 %te  一个月中的某一天(1-31)  2 %tb  指定语言环境的月份简称  Feb(英文).二月(中文) %tB  指定语言环境的月份全称  Feb ...

  5. 第七章 API网关服务:Spring Cloud Zuul

    API网关是一个更为智能的应用服务器, 它的定义类似于面向对象设计模式中的Facade模式, 它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤.它除了要实现 ...

  6. 第六章 声明式服务调用: Spring Cloud Feign

    我们在使用 Spring Cloud Ribbon 时, 通常都会利用它对 RestTemplate 的请求拦截来实现对依赖服务的接口调用, 而 RestTemplate 已经实现了对 HTTP 请求 ...

  7. GeoServer之图层的新建与发布

    GeoServer之图层的新建与发布 GeoServer的图层发布并不复杂,在经过: 1.创建工作区 2.添加新的数据存储 3.编写styles 后:我们就可以很简单的创建图层了. 1.在新建图层中选 ...

  8. TBluetoothLEDevice.UpdateOnReconnect

    System.Bluetooth.TBluetoothLEDevice.UpdateOnReconnect Description Indicates whether the manager auto ...

  9. Dreamweaver 中文乱码

     定义当前页面的编码属性      Ctrl+j 标题/编码 将编码改成UTF8即可     PhpStorm    FILE->Setting->File Encoding->将U ...

  10. c++builder 解压缩

    c++builder  解压缩  TZCompressionStream  TZDecompressionStream #include <System.ZLib.hpp> void __ ...