原创 

java String常量池之java String::intern()介绍及在各个版本jvm内存位置变化

分类:java    258人阅读    IT小君  2023-04-26 13:35

介绍及使用

`String::intern()` 是 Java 中的一个方法,它是一个本地方法,可以用来查询 String 对象池中是否存在与指定字符串内容相同的字符串。如果存在,则返回池中的字符串对象;否则,将该字符串对象添加到池中,并返回该字符串对象的引用。

 

该方法的作用是将字符串对象放入到字符串常量池中,如果常量池中已经存在该字符串,则返回常量池中的字符串对象。

以下是一个示例:

 

```

String str1 = "Hello";  // 常量池中已经存在 "Hello",str1 指向常量池中的对象

String str2 = new String("Hello"); // 创建了一个新的 String 对象,不在常量池中

String str3 = str2.intern(); // 返回常量池中 "Hello" 的引用,赋值给 str3

System.out.println(str1 == str2); // false

System.out.println(str1 == str3); // true

```

 

在实际开发中,可以使用 `String::intern()` 方法来优化内存使用,避免因为创建大量重复的字符串对象而导致内存溢出的问题。但是,必须谨慎使用该方法,因为过多的使用会导致常量池中的字符串对象过多,从而导致常量池溢出的问题。

 

在各个版本JVM内存位置变化

在不同版本的JVM中,String::intern()方法的实现方式略有不同,这也导致了在内存中的位置变化。

在JDK 1.6以前的版本中,intern()方法会将字符串对象添加到永久代中的字符串池中,因此会导致永久代的空间不足,最终导致OutOfMemoryError异常。

在JDK 1.7和1.8中,由于永久代被移除并替换为元空间(MetaSpace),因此字符串池现在位于堆中。这样,当调用intern()方法时,字符串对象就会被添加到堆中的字符串池中,而不是永久代中的字符串池。

在JDK 1.9中,元空间继续存在,但是它被移到了本地内存(Native Memory)中。这个版本中,字符串池仍然位于堆中。因此,当调用intern()方法时,字符串对象也会被添加到堆中的字符串池中。

 

总结一下,在JDK 1.6以前的版本中,intern()方法会将字符串对象添加到永久代中的字符串池中;在JDK 1.7和1.8中,字符串池移动到了堆中;在JDK 1.9中,字符串池仍然位于堆中,但元空间被移到了本地内存中。

 

点击广告,支持我们为你提供更好的服务

js+css3抽奖转盘旋转点餐代码

HTML5数字产品服务公司网站模板

现代时尚家具公司网站模板

HTML5现代家居装潢公司网站模板

有机水果蔬菜HTML5网站模板

小众时尚单品在线电子商务网站模板

canvas炫酷鼠标移动文字粒子特效

html5 canvas进度条圆环图表统计动画特效

网页设计开发公司网站模板

HTML5 Canvas竖直流动线条背景动画特效

css+js实现的颜色渐变数字时钟动画特效

响应式时尚单品在线商城网站模板

html5 canvas彩色碎片组合球形旋转动画特效

jQuery右端悬浮带返回顶部特效

html5 svg夜空中星星流星动画场景特效

响应式太阳能能源公司网站模板

响应式咖啡饮品宣传网站模板

中小型创意设计服务公司网站模板

html5图标下拉搜索框自动匹配代码

css鼠标跟随文字模糊特效

点击广告,支持我们为你提供更好的服务
 工具推荐 更多»
点击广告,支持我们为你提供更好的服务