常量池

String 中一个方法:intern  java

      String的intern()方法就是扩充常量池的一个 方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,若是有,则返回其的引用, 若是没有,则在常量池中增长一个Unicode等于str的字符串并返回它的引用;数组

关于String是不可变的code

     这一说又要说不少,你们只要知道String的实例一旦生成就不会再改变了,好比说:          String  tr=”kv”+”ill”+” “+”ans”; 
就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,而后”kvill”又和” “ 生成 ”kvill “存在内存中,最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是由于String的“不可变”产生了不少临时变量,这也就是为何建议用StringBuffer的原 因了,由于StringBuffer是可改变的.htm

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

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
}

Java是一种动态连接的语言,常量池的做用很是重要,常量池中除了包含代码中所定义的各类基本类型(如int、long等等)和对象型(如String及数组)的常量值外,还包含一些以文本形式出现的符号引用,好比:接口

    类和接口的全限定名;内存

    字段的名称和描述符;字符串

    方法和名称和描述符。get

        在Java语言中,一切都是动态的。编译时,若是发现对其它类方法的调用或者对其它类字段的引用的语句,记录进class文件中的只能是一个文本形式的符号引用,在链接过程当中,虚拟机根据这个文本信息去查找对应的方法或字段。编译器

        因此,与Java语言中的所谓“常量”不一样,class文件中的“常量”内容很非富,这些常量集中在class中的一个区域存放,一个紧接着一个,这里就称为“常量池”。

           在Java程序中,有不少的东西是永恒的,不会在运行过程当中变化。好比一个类的名字,一个类字段的名字/所属类型,一个类方法的名字/返回类型/参数名与所属类型,一个常量,还有在程序中出现的大量的字面值。

好比下面小段源码中粗体代码显示的部分:

        public class ClassTest {

        private String itemS ="咱们 ";

        private final int itemI =100 ;

        public void setItemS (String para ){...}

}

而这些在JVM解释执行程序的时候是很是重要的。那么编译器将源程序编译成class文件后,会用一部分字节分类存储这些粗体代码。而这些字节咱们就称为常量池。事实上,只有JVM加载class后,在方法区中为它们开辟了空间才更像一个“池”。

具体结构  在Java程序中,有不少的东西是永恒的,不会在运行过程当中变化。好比一个类的名字,一个类字段的名字/所属类型,一个类方法的名字/返回类型/参数名与所属类型,一个常量,还有在程序中出现的大量的字面值。

好比下面小段源码中粗体代码显示的部分:

public class ClassTest {

private String itemS ="咱们 ";

private final int itemI =100 ;

public void setItemS (String para ){...}

}

而这些在JVM解释执行程序的时候是很是重要的。那么编译器将源程序编译成class文件后,会用一部分字节分类存储这些粗体代码。而这些字节咱们就称为常量池。事实上,只有JVM加载class后,在方法区中为它们开辟了空间才更像一个“池”。

相关文章
相关标签/搜索