Java Integer和String内存存储

1人阅读 评论(0) 收藏 举报
分类:

先看代码:

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

测试的结果:

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


查看评论

int和Integer有什么区别?分别存储在哪里?---未完待续

一: int是基本数据类型,Integer是其包装类 二: 1.基本数据类型存放位置:     栈内存 2.Integer存放位置:     常量池、堆内存...
  • bluetjs
  • bluetjs
  • 2016-10-20 17:19:00
  • 2908

java String 在内存中如何存储的?

java String 在内存中的存储状态
  • okyoung188
  • okyoung188
  • 2017-02-17 13:13:25
  • 4421

重走一次java-堆栈之int,Integer,String定义变量

写下来是证实自己理解的最直接证明:private void t1(){ Integer n1 = 10; Integer n2 = new Integer(10); ...
  • u011053107
  • u011053107
  • 2015-11-12 17:27:29
  • 1314

Java千百问_06数据结构(022)_String在内存中如何存放

点击进入_更多_Java千百问1、String在内存中如何存放了解String是什么看这里:String是什么 String是一个特殊的包装类数据。 可以用两种的形式来创建:String str ...
  • ooppookid
  • ooppookid
  • 2016-05-24 09:56:00
  • 2308

java中String和new String还有对象中的String字符串在内存中的存储

参考自:http://blog.csdn.net/zhangjg_blog/article/details/18319521 的博客,很多知识和代码都来源此,感兴趣的同学可以去看看     一直...
  • penyoudi1
  • penyoudi1
  • 2018-01-25 18:04:51
  • 159

Integer和String底层原理

Integer i=new Integer(5); Integer j=new Integer(5); System.out.println(i==j);//fasle比较地址 System...
  • pdh822407904
  • pdh822407904
  • 2015-11-09 16:14:39
  • 1248

面试也常遇到的关于Integer大小比较的问题

public static void main(String[] args) { // TODO Auto-generated method stub Integer a = new In...
  • QQ635785620
  • QQ635785620
  • 2012-07-18 10:03:07
  • 8553

Java字符串在内存中的存储位置

在JDK6的时候在Java虚拟机(这里指的是HotSpot)中内存区域分为本地方法栈、虚拟机栈、堆、程序计数器、方法区等,方法区又被称作永久代。 这里只说一下字符串的存储位置,在Java虚拟机内存中...
  • dingpiao190
  • dingpiao190
  • 2017-06-01 14:43:58
  • 1885

String类在内存中实现原理详解

(1) ==  比较引用类型比较的是地址值是否相同 equals:比较引用类型默认也是比较地址值是否相同,而String类重写了equals()方法,比较的是内容是否相同。 (2) 区分下面两种语句...
  • qq1169091731
  • qq1169091731
  • 2016-09-20 00:12:16
  • 858

Java Integer和String的比较操作

// [-128,127] 自动装箱(box),同值是同一个对象 Integer a = 1; Integer b = 1; System.out.println("i1:" + (a == b));...
  • huabinzheng
  • huabinzheng
  • 2016-08-12 11:54:16
  • 189
    个人资料
    等级:
    访问量: 0
    积分: 34
    排名: 0
    文章分类
    文章存档