欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java面试必知:Java中 String和Integer内存存储问题

程序员文章站 2022-06-04 23:16:07
...

String和Integer的内存存储

String的内存存储

  • String a=“a” 可能创建一个对象或者不创建对象, 如果"a"这个字符串在java String池里不存在,会在java String池创建这个一个String对象(“a”).如果已经存在,a直接reference to 这个String池里的对象。
  • String str1 = new String(“ABC”) 至少创建一个对象,也可能两个。因为用到new 关键字,会在heap创建一个 str1 的String 对象,它的value 是 “ABC”.同时,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象(“ABC”).
  • String 有一个intern() 方法,native,用来检测在String pool是否已经有这个String存在。
  • 对于new jvm会直接分配新的空间
  String a=new String("女");
        String a1="女";
        String a2="女";
        System.out.println(a==a1);
        System.out.println(a1==a2);
        /**
         * false
         * true  因为 a1 和 a2 都是指向String池中的 一块内存
        */

Integer的内存存储

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