博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常量池
阅读量:6480 次
发布时间:2019-06-23

本文共 1818 字,大约阅读时间需要 6 分钟。

hot3.png

String 中一个方法:intern  

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

关于String是不可变的

     这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,比如说:          String  tr=”kv”+”ill”+” “+”ans”; 

就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill “存在内存中,最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原 因了,因为StringBuffer是可改变的.

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

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及数组)的常量值外,还包含一些以文本形式出现的符号引用,比如:

    类和接口的全限定名;

    字段的名称和描述符;

    方法和名称和描述符。

        在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文件后,会用一部分字节分类这些粗体代码。而这些字节我们就称为常量池。事实上,只有JVMclass后,在方法区中为它们开辟了空间才更像一个“池”。

转载于:https://my.oschina.net/u/563488/blog/682359

你可能感兴趣的文章
Calendar详解
查看>>
杀人游戏 捉鬼游戏 发牌器(Android安卓手机,苹果手机,智能手机通用)
查看>>
Yii2的深入学习--行为Behavior
查看>>
SQL Server 之 事务与隔离级别实例讲解
查看>>
JavaScript之共享onload
查看>>
js获取url传递参数
查看>>
python ide
查看>>
Oracle Internals 相关站点
查看>>
工厂模式三部曲之抽象工厂模式
查看>>
SharpGL学习笔记(四) 正射投影
查看>>
spring源码:学习线索
查看>>
npm中本地安装命令行类型的模块是不注册Path的
查看>>
QSignalMapper类处理多信号关联同一个槽的方法(1)
查看>>
JAVA多线程和并发基础面试问答(转载)
查看>>
每周一书-《程序开发心理学(银年纪念版)》获奖公布
查看>>
atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性
查看>>
jquery之onchange事件2
查看>>
Vsftpd服务的搭建
查看>>
javascript 使用btoa和atob来进行Base64转码和解码
查看>>
线程中的同步辅助类CountDownLatch
查看>>