jvm常量池

转载 2016年08月28日 15:06:13

为了对常量池有更具体的认识,下面引用几个例子:

1,常量池中对象和堆中的对象

public class Test{

Integer i1=new Integer(1);
   Integer i2=new Integer(1);
//i1,i2分别位于堆中不同的内存空间

   System.out.println(i1==i2);//输出false


   Integer i3=1;
   Integer i4=1;
//i3,i4指向常量池中同一个内存空间

   System.out.println(i3==i4);//输出true

//很显然,i1,i3位于不同的内存空间

System.out.println(i1==i3);//输出false

}

2,8种基本类型的包装类和对象池

java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,也即对象不负责创建和管理大于127的这些类的对象。以下是一些对应的测试代码:

public class Test{

public static void main(String[] args){

   //5种整形的包装类Byte,Short,Integer,Long,Character的对象,

   //在值小于127时可以使用常量池

   Integer i1=127;

   Integer i2=127;

   System.out.println(i1==i2)//输出true

   //值大于127时,不会从常量池中取对象

   Integer i3=128;

   Integer i4=128;

   System.out.println(i3==i4)//输出false

   //Boolean类也实现了常量池技术

   Boolean bool1=true;

   Boolean bool2=true;

   System.out.println(bool1==bool2);//输出true

   //浮点类型的包装类没有实现常量池技术

   Double d1=1.0;

   Double d2=1.0;

   System.out.println(d1==d2)//输出false

  

}

}

3,String也实现了常量池技术

String类也是java中用得多的类,同样为了创建String对象的方便,也实现了常量池的技术,测试代码如下:

public class Test{

public static void main(String[] args){

//s1,s2分别位于堆中不同空间

String s1=new String("hello");

String s2=new String("hello");

System.out.println(s1==s2)//输出false

//s3,s4位于池中同一空间

String s3="hello";

String s4="hello";

System.out.println(s3==s4);//输出true

}

}

4.字符串比较更丰富的一个例子

package testPackage;

class Test {

 public static void main(String[] args) {

  String hello = "Hello", lo = "lo";

  System.out.print((hello == "Hello") + " ");

  System.out.print((Other.hello == hello) + " ");

  System.out.print((other.Other.hello == hello) + " ");

  System.out.print((hello == ("Hel"+"lo")) + " ");

  System.out.print((hello == ("Hel"+lo)) + " ");

  System.out.println(hello == ("Hel"+lo).intern());

 }

}

class Other { static String hello = "Hello"; }

and the compilation unit:

package other;

public class Other { static String hello = "Hello"; }

produces the output:

true true true true false true

输出结果的分别解释如下:

在同包同类下,引用自同一String对象.

在同包不同类下,引用自同一String对象.

在不同包不同类下,依然引用自同一String对象

在编译成.class时能够识别为同一字符串的,自动优化成常量,所以也引用自同一String对象

在运行时创建的字符串具有独立的内存地址,所以不引用自同一String对象

String的intern()方法会查找在常量池中是否存在一份equal相等的字符串,如果有则返回一个引用,没有则添加自己的字符串进进入常量池,

注意,只是字符串部分,

所以这时会存在2份拷贝,常量池的部分被String类私有持有并管理,自己的那份按对象生命周期继续使用.



例子:

String str = new String(“abc”),“abc”在内存中是怎么分配的?

正确答案: A C   你的答案: C (错误)

字符串常量区
寄存器

关于本题目中,"abc"为字面量对象,其存储在堆内存中。而字符串常量池则存储的是字符串对象的一个引用。

Java虚拟机-----方法区和运行时常量池

方法区: 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据(是唯一的数据)。当java虚拟机通...
  • sunshine__me
  • sunshine__me
  • 2015年11月23日 11:37
  • 5438

Java中的栈,堆,方法区和常量池

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对...
  • fuckluy
  • fuckluy
  • 2016年01月31日 16:32
  • 7346

Java中堆栈常量池等内存分配原理详解

转载请注明出处:http://blog.csdn.net/Alex_SHT_JAVA/article/details/43966207存储的方式: 寄存器 栈(stack) 堆(heap) 静态域 常...
  • Alex_SHT_JAVA
  • Alex_SHT_JAVA
  • 2015年02月27日 13:03
  • 1528

jvm虚拟机运行时内存分析,堆,栈,方法区,程序计数器,本地栈,常量池

**JVM自动内存管理机制** java内存区域与内存溢出异常 概述 : 对于从事C/C++程序开发的开发人员来说,在内存管理领域他们是拥有最高权力的皇帝又是从事最基础工作的劳动人民,即拥有每一...
  • m0_37034294
  • m0_37034294
  • 2017年12月19日 17:18
  • 135

Java基础之jdk1.8 JVM内存模型简述,含String常量池简单分析

最近有个机会整理JAVA基础相关知识,整理到JVM内存模型这部分的时候,画了两张图,记载在此,供感兴趣的新手参考。...
  • tophawk
  • tophawk
  • 2017年12月03日 21:18
  • 150

Java学习之类加载全过程_JVM内存分析_反射机制核心原理_常量池理解

一、类加载机制 JVM把class文件加载到内存,并对数据进行校验,解析和初始化,最形成JVM可以直接使用的JAVA类型的过程。加载-->链接(-->验证-->准备-->解析)-->初始化-->使用...
  • haitaofeiyang
  • haitaofeiyang
  • 2015年03月14日 23:14
  • 2210

JVM常量池及字符串“==”比较分析

Java常量池技术 java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创 建相等变量时节省了很多时间。...
  • yanjie415876780
  • yanjie415876780
  • 2016年03月27日 20:21
  • 737

JVM 常量池理解

在本文描述它们的区别之前,先来了解一下JVM运行时数据区的内存模型。 《深入JAVA虚拟机》书中是这样描述的:JVM运行时数据区的内存模型由五部分组成: 【1】方法区 【2】堆 【3】JAVA...
  • lulongzhou_llz
  • lulongzhou_llz
  • 2012年04月17日 23:48
  • 956

JVM 常量池

在class文件中的魔数、副版本号、主版本之后,紧接着就是常量池的数据区域了。 常量池的组织很简单,前端的两个字节占有的位置叫做常量池计数器(constant_pool_count),它记录...
  • ae5555
  • ae5555
  • 2014年12月19日 00:23
  • 223

JavaSE程序分析004 JVM常量池的小事情

public class TestConstantPool { /** * 本段程序在jdk1.7和jdk1.6上运行结果是不一样的 * jdk1.7运行结果如下: ...
  • ChiXueZhiHun
  • ChiXueZhiHun
  • 2017年03月16日 11:13
  • 219
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jvm常量池
举报原因:
原因补充:

(最多只允许输入30个字)