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后,在方法区中为它们开辟了空间才更像一个“池”。