JDK7 中将StringPool从永久代移动到了老生代,并且可以通过-XX:StringTableSize=99991来改变常量池的大小。

public void equalTest(){

String s = new String("1").intern();

String s2 = "1";

System.out.println(s2 == s);

}

output: true

public void equalTest(){

String s = new String("1");

s.intern();

String s2 = "1";

System.out.println(s2 == s);

}

output: false

jdk7下面第一段代码打印的是true,第二段打印的是false.

这是因为将常量池从永久的移动到老生代之后,intern()的意思是将该变量放到常量池中,因为new String("1")已经是在堆中了,所以会直接将其引用放入常量池中,这样当s2="1"语句直接去常量池中查找对象时得到的其实就是s所指向的对象。

第二段代码中,new String("1); 会生成两个对象一个是s指向的Object String,一个是常量池中的对象; 然后执行s.intern()的时候发现常量池中已经有该对象了,所以什么也不做。s2则指向常量池中的对象。因此s != s2

我们再来看下面这段代码:

public static void main(String[] args){

int length = 100000000;

String[] s = new String[length];

int i = 0;

while(i < length){

s[i++] = new String("hellosdfasfsdddddddddddddd").intern();

}

}

new String("hellosdfasfsdddddddddddddd").intern() 这句话的意思是在常量池中new一个对象,所以当我们第一次执行常量池中有了这个对象之后,后面就不会再new新对象了,大大节约了内存空间。

下面是有intern和没有intern的堆内存使用情况,大家感受一下

s[i++] = new String("hellosdfasfsdddddddddddddd").intern();

PS Old Generation

capacity = 1431830528 (1365.5MB)

used = 400008208 (381.47755432128906MB)

free = 1031822320 (984.0224456787109MB)

27.936840301815383% used

s[i++] = new String("hellosdfasfsdddddddddddddd");

PS Old Generation

capacity = 1431830528 (1365.5MB)

used = 1431412656 (1365.1014862060547MB)

free = 417872 (0.3985137939453125MB)

99.97081554053861% used

java intern 与本身_java intern相关推荐

  1. 理解Java字符串常量池与intern()方法

    理解Java字符串常量池与intern()方法 阅读目录 Java内存区域 两种创建方式在内存中的区别 解释开头的例子 intern()方法 参考资料 String s1 = "Hello& ...

  2. Java运行作业控制语言_Java安全——语言本身的设计

    Java安全--语言本身的设计 Java 安全 内在安全机制 Java语言本身的安全机制是要保护内存资源--保证内存完整性,核心的安全特性要确保程序不能非法解析或修改驻留在内存中的机密信息.从语言本身 ...

  3. java字符串拼接例子_Java详解【String】+【StringBuilder vs StringBuffer】+【字符串拼接】...

    String详解 注意区分对象和对象的引用 首先来看一下我在jdk中找到的String源代码,这里只截取开头的小小一部分 public final class String implements ja ...

  4. java string对象创建对象_Java String 创建了几个对象

    我们首先来看一段代码: Java代码 String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢 ...

  5. java定义字符串常量_Java中的字符串常量池

    ava中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...

  6. java 堆转储快照_Java堆转储:您可以完成任务吗?

    java 堆转储快照 如果您像我一样对Java性能充满热情,那么堆转储分析对您来说应该不是一个谜. 如果是这样,那么好消息是您将有机会增加您的Java故障排除技能和JVM知识. JVM现在已经发展到这 ...

  7. java游戏运行环境_Java运行环境

    一.计算机存储单元 位(bit): 一个数字0或者一个数字1,代表一位 字节(Byte): 每逢8位是一个字节,计算机中数据存储的最小的单位 1 Byte= 8bit 通常的换算单位: 1KB=102 ...

  8. java语言就业方向_java就业有哪些方向

    展开全部 近几年来Java"被死亡"和"被复活"了那么多次,依然坚强的活着636f707932313133353236313431303231363533313 ...

  9. java 6 新特性_Java SE 6 新特性: HTTP 增强(转)

    Java 语言从诞生的那天起,就非常注重网络编程方面的应用.随着互联网应用的飞速发展,Java 的基础类库也不断地对网络相关的 API 进行加强和扩展.在 Java SE 6 当中,围绕着 HTTP ...

  10. 关于Java中String类的intern()方法

    首先intern()方法的定义:当调用这个方法的时候,如果字符串常量池中有这个对象,就把常量池中的这个对象返回,没有就把当前对象加入到常量池并且返回当前对象的引用: jdk1.6之前:将对象存入常量池 ...

最新文章

  1. java static 作用详解
  2. 程序员的写作课:三、 海量信息输入指南
  3. 类对接口的实现不叫继承_Java多态的实现机制是什么,看完你就知道(值得收藏)...
  4. 微型计算机折旧率是如何计算,国家三包法简要
  5. leetcode - 494. 目标和
  6. 8.5. JdbcTemplate
  7. 添加Copy To和Move To 到系统右键菜单中(Vista 也适用)
  8. Java面试题!5年经验Java程序员面试27天,看看这篇文章吧!
  9. Car Net全文翻译
  10. 大数据产品推荐:金蜂巢大数据集成与脱敏系统
  11. win7如何计算机共享的打印机驱动程序,细说win7如何添加打印机
  12. Wp和Win8平台在实际开发中的对比
  13. 技术团队管理经验总结(持续更新)
  14. 解决winnt.h(389): error C2059: 语法错误:“;”
  15. \u202a 神奇的控制字符
  16. 影视剪辑,如何一个人自学短视频7天vlog教程
  17. Mobvista发行价为4港元 拟12月12日港交所上市
  18. java时间规范化_Java日期时间使用总结
  19. 【NOIP2017】Day1
  20. Android开发RecyclerView刷新后item里面控件动画

热门文章

  1. 计算机表格加减乘除符号,excel加减乘除-Excel表格最常用的37种符号,帮你整理齐了!...
  2. 计算机键盘上的2个定位键,电脑键盘上Tab 键的神奇之处!(用途详解)
  3. JavaScript打开窗口
  4. linux下go语言代理
  5. Apache Tomcat AJP 文件包含漏洞复现(CVE-2020-10487)
  6. rat linux安装u盘,美加狮RAT2鼠标驱动
  7. windos系统如何获得超级管理员权限
  8. 使用Reverse SSH Tunnel实现内网穿透的可行性方案
  9. android播放幻灯片控件,android幻灯片控件PPT
  10. stc和sac_SAC与短期边际成本SMC.PPT