黔东南企业网站建设,学做甜点的网站,长春建站方法,网站用户建设的设计与实现#x1f387;个人主页#xff1a;Ice_Sugar_7 #x1f387;所属专栏#xff1a;快来卷Java啦 #x1f387;欢迎点赞收藏加关注哦#xff01; 字符串常量池 #x1f349;常量池#x1f349;字符串常量池#x1f349;intern 方法 #x1f349;常量池
在Java程序中个人主页Ice_Sugar_7 所属专栏快来卷Java啦 欢迎点赞收藏加关注哦 字符串常量池 常量池字符串常量池intern 方法 常量池
在Java程序中类似于1233.14“hello”等字面类型的常量经常频繁使用为了使程序的运行速度更快、更节省内存Java为8种基本数据类型和String类都提供了常量池
字符串常量池
字符串常量池在JVM中是StringTable类实际是一个固定大小的HashTable它是哈希表的一种实现但由于其同步性能较差所以在新的代码中通常用ConcurrentHashMap来代替它
字符串常量池用于存储字符串常量。当创建字符串常量时如果常量池中已经存在该字符串则新的常量将指向已存在的字符串不会重新创建一个新的字符串对象这样可以节省内存空间并提高效率
注意只要是双引号引起来的都会被存放到常量池中而如果通过 new 来创建一个 String 对象则不会将该对象的引用存入常量池
我们可以使用双引号来创建字符串常量举个例子
比较下面四个字符串的地址 public static void main(String[] args) {String s1 hello;String s2 hello;String s3 new String(world);String s4 new String(world);System.out.println(s1 s2);System.out.println(s1 s3);System.out.println(s3 s4);}得到如下结果
创建 s1 时将它所指的字符串常量存进常量池。当创建 s2 时在常量池中找到了 hello 所以直接让 s2 指向它即 s1 和 s2 的地址是一样的创建 s3 时会在堆区 new 一个 String 对象其 value 指向字符数组存放 world 同时将 world 存进常量池在哈希表中新建一个节点节点包含一个 String 对象的引用该引用所指对象的 value 指向上述字符数组创建 s4 时也会 new 一个对象因为常量池中已经有 world 了所以该对象的 value 直接指向存放 world 的数组 intern 方法
intern 的作用是手动将创建的String对象添加到常量池中举个例子 public static void main(String[] args) {char[] ch new char[]{a, b, c};String s1 new String(ch); // s1对象并不在常量池中//s1.intern(); // s1.intern()调用之后会将s1对象的引用放入到常量池中String s2 abc; //常量池中已经有abc了创建s2时直接用常量池中abc的引用System.out.println(s1 s2);}//如果s1没有调用intern那么就会输出false//若有调用则输出true