zoukankan      html  css  js  c++  java
  • Java Integer和String内存存储

     

    标签: java内存string
     分类:

    先看代码:

    void foo()
    {
        Integer i1 = 2;
        Integer i2 = 2;
        Integer i3 = new Integer(2);
        System.out.println("i1 = i2? " + (i1 == i2));  //true
        System.out.println("i1 = i3? " + (i1 == i3));  //false
    
        Integer i4 = 1000;
        Integer i5 = 1000;
        System.out.println("i4 = i5? " + (i4 == i5)); //false
    
        String s1 = "cat";
        String s2 = "cat";
        String s3 = new String("cat");
        System.out.println("s1 = s2? " + (s1 == s2));  //true
        System.out.println("s1 = s3? " + (s1 == s3));  //false
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    测试的结果:

    i1 = i2? true 
    i1 = i3? false 
    i4 = i5? false 
    s1 = s2? true 
    s1 = s3? false

    Java中,对于对象==是比较两个对象的地址。 

    Integer的存储

    • Integer是int的封装类,一般来说基础变量(int)赋值给Integer对象将自动装箱(Auto Boxing)并为Integer对象分配堆空间。因此即使基础变量值一样,封装类对象指向不同地址。所以System.out.println("i4 = i5? " + (i4 == i5)); //false
    • 对JVM为了节省空间, 当Integer的值落在-128~127之间时,如Integer i1 = 2; Integer i2 = 2;此时JVM首先检查是否已存在值为2的Integer对象。如果是,则i2直接是引用已存在对象,即i2 = i1。所以System.out.println("i1 = i2? " + (i1 == i2)); //true 
      事实上, Integer已经默认创建了数值[-128~127]的Integer缓存数据。所以使用Integer i1=2时,JVM会直接在该在对象池找到该值的引用。
    • 对于显式的new Integer(2),JVM将直接分配新空间。所以System.out.println("i1 = i3? " + (i1 == i3)); //false


    String的存储

    • 对于使用字面量赋值方式。JVM为了节省空间,s2会首先查找JVM中是否有"cat"的字符串常量。如果已经存在,则直接返回该引用,而无需重新创建对象。
    • 对象new创建方式,JVM将分配新空间。


    一个例子,来自:http://blog.csdn.net/hejingyuan6/article/details/50489171

       String s1 = "china";
      String s2 = "china";
      String ss1= new String("china");
      String ss2 = new String("china");
       int i =1;
       int j =1;
       public static final int  i1 = 1;
       public static final int  j1 = 1;
       Integer it1= 127;
       Integer it2= 127;
       Integer it11= 128;
       Integer it12= 128;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12


    参考: 
    Java常量池详解之一道比较蛋疼的面试题 
    Weird Integer boxing in Java 
    java 内存数据存储

  • 相关阅读:
    [BZOJ4869][洛谷P3747][六省联考2017]相逢是问候(线段树)
    [WC2014][BZOJ3435][洛谷P3920]紫荆花之恋(动态点分治+treap)
    JavaScript对象JQuery In Action
    每日一条SQL LEFT JOIN
    Div border 显示不出来的原因
    HTML列表标记:dl、dt、dd
    The Effective Executive 笔记 一
    c# 解析JSON的几种办法
    使用if else 容易犯的错
    每日一句SQL:内联视图
  • 原文地址:https://www.cnblogs.com/yangchunchun/p/7405477.html
Copyright © 2011-2022 走看看