黑马程序员技术交流社区

标题: 【问题已解决】关于String中intern()方法的一些疑问 [打印本页]

作者: 刘悦    时间: 2012-8-8 16:36
标题: 【问题已解决】关于String中intern()方法的一些疑问
本帖最后由 刘悦 于 2012-8-8 17:32 编辑

         谢谢下面两个同学的解答,问题已解决
今天偶然看了一篇关于String使用intern()方法的文章。
文章中举了这样的例子
  1. String s1="abc";
  2.   String s2="abc";
  3.   String s3="abcabc";
  4.   String s4=s1+s2;

  5.   System.out.println(s3==s4);
  6.   System.out.println(s3.equals(s4));
  7.   s4=(s1+s2).intern();
  8.   System.out.println(s3==s4);
复制代码
结果是
false
true
true
文章中说,使用intern()方法可以有效加快JVM进行比较的速度,也就是说==的速度要快于equals方法的速度。
我不是太懂的就是最后,为什么?
还有就是什么时候要用intern()方法,关于使用我有点迷茫。
请各位大哥大姐解答,小弟不胜感激


谢谢下面两个同学的解答,问题已解决

作者: 焦晨光    时间: 2012-8-8 17:11
文章中说,使用intern()方法可以有效加快JVM进行比较的速度,
也就是说==的速度要快于equals方法的速度。
我不是太懂的就是最后,为什么?

因为,在字符串比较来说==比较的是两个引用变量的地址
而equals方法(在String类中被复写)比较的是两个变量的实际值
==直接比较两个引用变量的值就可以了
而equals方法需要根据两个引用变量的地址去堆内存中判断两个引用变量的值是否相等
所以==的速度比equals 方法的速度快很多


然而 intern()方法的出现 使这种现象更加明显
intern()方法在被调用的时候 会在常量池里判断引用变量指向的内容在常量池中是否存在
如果存在就让引用变量直接指向常量池中的内容而不会再在堆内存中开盘空间存储该引用
变量指向的内容
s4=(s1+s2).intern();//(s1+s2)的实际值为"abcabc"调用intern()方法 该方法在常量池中
寻找是否已有"abcabc"存在,因为前面 String s3="abcabc";常量池中已经存在该内容
所以就将s4直接指向该内容 故s3==s4为true


也就是说 intern()方法使得字符串引用变量的指向更加明确 用常量池来管理这些内容
这样就大大提高了==比较的速度。
所以在大批的字符串变量比较中 要用到intern()方法 它可以更高效快捷的进行字符串变量比较


作者: 王晓龙    时间: 2012-8-8 17:15
s4=(s1+s2).intern(); intern()查看池中 于无和s4相同的 如果有返回池中的地址 如果没有 创建个s4
  池中有s3且数值和s4相同 所以s4返回的就是s3的地址 所以 s3==s4 显示true ;
关于什么时候用 我也不太清楚 我是没用过 就是知道有这么个方法
作者: 刘悦    时间: 2012-8-8 17:28
焦晨光 发表于 2012-8-8 17:11
文章中说,使用intern()方法可以有效加快JVM进行比较的速度,
也就是说==的速度要快于equals方法的速度。
...

精彩!懂了!谢谢!仔细一想的确是这么回事,思路清晰了,谢谢!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2