String类intern方法的一个困惑的问题

问题描述

String str1 = new StringBuilder("ja").append("va").toString();System.out.println(str1 == str1.intern());String str2 = new StringBuilder("计算机").append("aa技术").toString();System.out.println(str2 == str2.intern());结果为:false,trueString str1 = new StringBuilder("ja").append("av").toString();System.out.println(str1 == str1.intern());String str2 = new StringBuilder("计算机").append("aa技术").toString();System.out.println(str2 == str2.intern());结果为:true,true求指点。

解决方案

你的测试不对String x = "java";System.out.println(x == x.intern());这样才是true,因为x,x.intern()都是指向pool的内存String str1 = new StringBuilder("ja").append("va").toString(); System.out.println(str1 == str1.intern()); 这才是false,因为str1指向堆内存(new的原因),str1.intern()指向的是pool的内存
解决方案二:
楼主的测试结果是没问题的。在JDK7下面就是这个结果。intern()方法在JDK7里面有了一些改变,如果在JDK6测试,肯定都是false.由于new StringBuilder("计算机").append("aa技术").toString();创建的字符串会存在于常量池中。而intern()方法就直接返回了该字符串的引用。而由于"java"是关键字,已经在常量池中存在了,所以intern()返回的值是JRE放入的"java"常量的引用,之后StringBuilder创建出来的在堆上,因此用==比较返回的是false.(见周志明《深入理解Java虚拟机》第二版P57)但是,我不理解的是:String str1 = new StringBuilder("1234").toString(); System.out.println(str1 == str1.intern()); // falseString str2 = new String("5678"); System.out.println(str2 == str2.intern()); // false难道只有调了StringBuilder的append方法才会把值写入常量池?
解决方案三:
intern() 是将现在的字符串放入到字符串常量池中。而“==”比较的是对象的引用地址,s1指向的是堆内存中的地址,而另外一个是常量池中的对象,所以返回的应该都是false。
解决方案四:
一般第一次调用intern()时会把该String放入缓存池中进行缓存,因为"java"是关键字,之前很可能缓存池中已经存在了,所以用==判断肯定为false,其他的如果是第一次调用,intern()方法返回的即为该String本身,所以为true。(另外吐槽一下iteye,我新手怎么了,每次都需要回答你那破测试,把我辛苦打的回复都搞没了,怪不得论坛都没人,快倒闭了,我FK!)
解决方案五:
你的测试是错误的,intern是将String置入pool,第一次的时候,肯定pool是没有的,所有应该都是false
解决方案六:
我运行所有都是false啊

时间: 2024-09-18 21:16:42

String类intern方法的一个困惑的问题的相关文章

java String的intern方法_java

首先我们应该清楚的是JDK1.6和JDK1.7中String类的intern方法还是有差别的:   JDK1.6中的intern:    调用intern方法的时候首先会去常量池中查看是否存在与当前String值相同的值,如果存在的话,则直接返回常量池中这个String值的引用:如果不存在的话,则会将原先堆中的该字符串拷贝一份到常量池中.   JDK1.7中的intern:    调用intern方法的时候首先会去常量池中查看是否存在与当前String值相同的值,如果存在的话,则直接返回常量池中

php文件调用一个类或方法,生成一个log文件,log文件上输出调用的时间和内容,该怎么写

问题描述 php文件调用一个类或方法,生成一个log文件,log文件上输出调用的时间和内容,该怎么写 php文件调用一个类或方法,生成一个log文件,log文件上输出调用的时间和内容,该怎么写 解决方案 /** 自定义日志 @param string $type @param string $content @return bool */ function mylog($type="",$content=""){ if(!$content || !$type){ r

如何用创建类的方法建立一个用户登陆界面

问题描述 如何用创建类的方法建立一个用户登陆界面 初学vb,建立一个简单的登陆Form,使用创建类的方法,事先设立一个密码和用户名,在登陆时,提醒密码和登陆名错误,若成功时跳到下一个Form,不会编写代码以及方法的调用 解决方案 可以写成一个自定义控件,继承Form.这样使用的使用可以使用New 解决方案二: 参考:http://blog.csdn.net/wuyazhe/article/details/5642431 解决方案三: 又不是.net,直接用 form1.show 1 不就可以了?

Java基础之010-深入理解Java的String类

Java基础之010-深入理解Java的String类                                        老帅        1. 首先String不属于8种基本数据类型,String是一个类.  因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性.  2. new String()和new String("")都是申明一个新的空字符串,是空串不是null:  3. String对象实例化   

java中 String类常量池

java中 String类常量池 String常量池详解: 1.String使用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不能再修改此对象中存储的字符串内容,就是因为如此,才说String类型是不可变的(immutable).String类有一个特殊的创建方法,就是使用""双引号来创建.例如new String("i am")实际创建了2个 String对象,一个是"i am"通过

Java编程那些事儿75——String类使用

9.5.3 String和StringBuffer String和StringBuffer类都是代表字符串,也就是任意多个字符组成的序列.程序需要存储的大量文字一般都使用字符串进行代表.在这两个类中,包含了大部分关于字符串操作的方法,在实际操作字符串时,可以首先查阅这两个类中的方法. String和StringBuffer虽然都代表字符串,但是由于两个类内部实现的区别,所以一般把String看成不可变字符串,而把StringBuffer看成可变字符串,对于String的每次改变(例如字符串连接等

[Android]Gradle 插件 DiscardFilePlugin(class注入&清空类和方法)

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6732128.html Android Gradle 插件 DiscardFilePlugin(清空类和方法) An android gradle plugin for discard class or method in compile time. 用于在编译构建时期忽略清空类和方法的一个Android Gradle插件. Github: https://gi

编程-String类下的split方法,我截取完字符串后把结果复制给一个数组这个数组长度会加1?

问题描述 String类下的split方法,我截取完字符串后把结果复制给一个数组这个数组长度会加1? 如题,这是代码: String s = ""A1B2C3D4E5F6G7H8""; String[] b = new String[8]; System.out.println(""b:"" + b.length); b = s.split(""[A-Z]""); System.out.

String类的intern()

http://blog.csdn.net/hfmbook/article/details/7605527   JAVA中String类的intern()方法的作用 标签: stringjavaexceptionequalsobjectc 2012-05-26 22:23 15754人阅读 评论(1) 收藏 举报  分类: JAVA(107)  版权声明:本文为博主原创文章,未经博主允许不得转载. 一般我们变成很少使用到 intern这个方法,今天我就来解释一下这个方法是干什么的,做什么用的 首先