复习整理篇-常量池

了解

  常量池可以理解为Class文件之中的资源仓库,它是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是在Class文件中第一个出现的表类型数据项目。
  由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值,这个容量计数是从1而不是从0开始的。


正文开始————常量池

常量池分为:静态常量池、运行时常量池
  静态常量池存在于Class文件中,比如经常用的javap-verbose中;
  运行时常量池就是在Class文件被加载进了内存之后,常量池保存在了方法区中,通常说的常量池值就是运行时常量池。

字面量:字面量就是比如说a=1;这个1就是字面量;又比如String a=“abc”,这个abc就是字面量。

  静态常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用Class文件绝大部分空间。这种常量池主要用于存放两大类常量:字面量和符号引用量。
  符号引用则属于编译原理方面的概念,包含三类:
    ①类和接口的全限定名
    ②字段名称和描述符
    ③方法名称和描述符

Java描述符(修饰符)的类型:public、protected、private、abstract、static、final
 native:使用对象:成员
     介绍:与操作平台相关,定义时并不定义其方法,方法的实现被一个外部的库实现;
 strictfp:使用:对象:类、方法
     介绍:strictfp修饰的类中所有方法都隐藏了strictfp修饰词,所有取值包括中间的结果都必须表示为float或double类型。


1.运行时常量池:方法区的一部分,存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池。一般来说,除了保存Class文件中描述的符号引用外,还会把翻译出来的直接引用也存储到运行时常量池中。运行时常量池具备动态性,也就是并非预置入Class文件的内容才能进入方法区的运行时常量池,运行期间也可能将新的常量放入池中。

2.字符串常量池:本质是一个HashSet<String>,这是一个纯运行时的结构,而且是惰性维护的。注意:它只存储String对象的引用,而不存储String对象的内容,根据这个引用可以得到具体的String对象。

3.Class常量池:主要存放两大类常量:字面量和符号引用。加载Class文件时,Class文件中String对象会进入字符串常量池(这里的进入是指放入字符串的引用,字符串本身还是在堆中),别的大都会进入运行时常量池。

4.String的intern方法:如果字符串常量池中已经有了这个字符串,那么直接返回常量池中的它的引用;如果没有,那就将它的引用保存一份到字符串常量池,然后直接返回这个引用。

//方法区
String s1="Hello";
String s2="Hello"
String s3="Hel"+"lo";
//堆
String s4="Hel"+new String("lo");

String s5=new String("Hello");
String s6=s5.intern();
String s7="H";
String s8="ello";
String s9=s7+s8;

①s1==s2:s1和s2都指向了方法区常量池中的Hello

②s1==s3:做+号的时候,会进行优化,自动生成Hello赋给s3,所以为true

③s1==s4:s4分别用了常量池中的字符串和存放对象的堆中的字符串,做+号的时候会进行动态调用,最后生成的仍然是一个String对象存放在堆中。

常量池就简单地了解这么多,有错误的地方请指正!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值