Java 8种基本类型包装类和String的常量池

Byte,Short,Integer,Long

通过如下代码输出可以看出常量池数值范围为-128~127。

Integer i1 = -129;
Integer i2 = -129;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = -128;
i2 = -128;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = 127;
i2 = 127;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = 128;
i2 = 128;
System.out.println("i1=i2\t" + (i1 == i2));

输出结果:
i1=i2 false
i1=i2 true
i1=i2 true
i1=i2 false

Character

通过如下代码输出可以看出常量池数值范围为0~127。

Character i1 = (char)-1;
Character i2 = (char)-1;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = (char)0;
i2 = (char)0;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = (char)127;
i2 = (char)127;
System.out.println("i1=i2\t" + (i1 == i2));

i1 = (char)128;
i2 = (char)128;
System.out.println("i1=i2\t" + (i1 == i2));

输出结果:
i1=i2 false
i1=i2 true
i1=i2 true
i1=i2 false

Boolean

通过如下代码输出可以看出它也具有常量池。

Boolean i1 = true;
Boolean i2 = true;
System.out.println("i1=i2\t" + (i1 == i2));

输出结果:
i1=i2 true

Float,Double

Float和Double无常量池。

Float i1 = 127F;
Float i2 = 127F;
System.out.println("i1=i2\t" + (i1 == i2));

Double i3 = 127D;
Double i4 = 127D;
System.out.println("i3=i4\t" + (i3 == i4));

输出结果:
i1=i2 false
i3=i4 false

String

引用文章:
https://tech.meituan.com/in_depth_understanding_string_intern.html
简单总结:可以通过使用双引号声明出来的String对象的方式和String.intern的方式在字符串常量池中生成对象。若字符串常量池中对象已存在,则无需重复生成对象。同时注意1.6和1.7的重要区别。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 相关概念 常量池的定义常量池(constant pool):指的是在编译期被确定,并被保存在已编译的.class文...
    snoweek阅读 820评论 0 4
  •   需要说明的一点是,这篇文章是以《深入理解Java虚拟机》第二版这本书为基础的,这里假设大家已经了解了JVM的运...
    Geeks_Liu阅读 14,113评论 5 44
  • 学习和使用java已经有4年多了,反省一下,太多关注了实际的应用层面,对某些基础的东西没有特别理解透彻。好记性不如...
    锦书诗词阅读 1,691评论 4 26
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,532评论 0 3
  • 一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态...
    梦工厂阅读 58,332评论 38 277