
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
7.5 字符串常量池

Java中使用“"”就可以进行字符串实例化对象定义,如果处理不当就有可能为多个内容相同的实例化对象重复开辟堆内存空间,这样必然造成内存的大量浪费。为了解决这个问题,在JVM中提供了一个字符串常量池(或者称为“字符串对象池”,其本质属于一个动态对象数组),所有通过直接赋值实例化的String类对象都可以自动保存在此常量池中,以供下次重复使用。在Java中字符串常量池一共分为两种。
静态常量池:是指程序(*.class)在加载的时候会自动将此程序中保存的字符串、普通的常量、类和方法等信息,全部进行分配。
运行时常量池:当一个程序(*.class)加载之后,有一些字符串内容是通过String对象的形式保存后再实现字符串连接处理,由于String对象的内容可以改变,所以此时称为运行时常量池。
范例:静态常量池

本程序使用了两种方式定义了String类对象,由于在实例化strB对象时,所有参与连接的字符串都是常量,所以在程序编译时会将这些常量组合在一起进行定义,这样就与strA对象的内容相同,最终的结果就是继续使用字符串常量池中提供的内容为strB实例化,不会再开辟新的堆内存空间。
范例:运行时常量池

本程序最大的特点在于利用了一个logo的对象定义了要连接的字符串的内容,由于logo属于程序运行时才可以确定的内容,这样就使得程序编译时无法知道logo的具体内容,所以strB对象将无法从字符串常量池中获取字符串引用。