java 自动装箱 拆箱 常量池

2018-04-22  本文已影响55人  tracy_668

java的自动装箱拆箱是jdk1.5后引入的内容,装拆过程由编译器自动完成。其中,java对Integer的自动装箱与拆箱会用到享元模式, 为了加大对简单数字的重利用,java对从-128到127的值进行缓存,实际上是调用了Integer.valueof方法,在Integer的静态内部类IntegerCache中对-128到127的数字进行了缓存,当然,如果用new去创建对象就会生成新对象。浮点数并没有使用缓存。

常量池:

class文件中的常量池,该常量池主要存放两大类常量,字面量(literal)和符号引用量(symbolic references),字面量相当于java语言层面常量的概念,符号引用包括:类和接口的全限定名, 字段名称和描述符, 方法名称和描述符。

方法区中的运行时常量,运行时常量池是方法区的一部分, class文件中除了有版本、方法、接口等描述信息外, 还有一项是常量池, 用于存放编译器生成的各种字面量和符号引用,这部分内容在类加载后进入方法区的运行时常量池存放。 运行时常量池具备动态性, java语言并不要求常量一定只有编译器才能产生,运行期间也可以将新的常量放入池中, 比如string类的intern()方法。

常量池是为了避免频繁的创建和销毁对象而影响系统性能,实现对对象的共享。

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

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

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

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

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

我的理解:  一个jvm只有一个字符串常量池!!!

上一篇下一篇

猜你喜欢

热点阅读