[JAVA]: String的方法intern()小解析
2009-06-10 16:13:43 分类:纯JAVA | 其他 | 评论(0) | 浏览(573)
每当吃苹果或者喝鲜牛奶的时候,内心就会不由自主翻涌起一种莫名的幸福感。。。感叹于人生真美好。。。。我看我是疯了,这种小事情就满足了。。
今天忽然发现intern()方法,但是不是很了解它的作用,看JDK的DOC,它也没讲明白。。于是上网搜了篇文章出来看。觉得写得挺好的就翻译了下。。sigh。。。。我翻译的好烂。。。。。
======================================================================================================
String是所有现代的编程语言中很基础且必不可少的一部分,它的重要程度可以跟numbers媲美。所以你可能认为JAVA的程序员们会很深入的了解它们--但是情况往往不是这样的。
当我查看Xerces(一种用JAVA实现的xml解析工具)的代码时,我发现了一些令我吃惊的东东:
com.sun.org.apache.xerces.internal.impl.XMLScanner:395
protected final static String fVersionSymbol = "version".intern();
在Xerces的代码中,很多String是这样被定义的。那么到底intern()是什么呢?我们都知道在JAVA中比较对象有两种方式:==操作符和equals()方法。==比较两个引用是不是指向同一个对象,而equals()比较两个对象是不是包含相同的数据内容。
我们都知道,在Java中比较两个String通常用equals()而不是==。比如:new String("Hello") == new String("Hello")的结果是false因为它们是两个不同的String实例(两边指向的不是同一个地址)。但如果使用equals()来比较的话,结果则是我们所预想的true。但是不幸的是,equals()方法的实现方式是对String里的字符一个一个的比较,所以性能很差,速度非常的慢。
==是恒等比较,它所做的仅仅是比较两边的引用是不是指向同一个对象。所以速度会比equals()快很多。当对同样的String进行多次比较时,尽可能使用恒等比较来代替内容的相等比较会使性能得到很大的提升。它的基本原则是:
1)建立一个String的hashset
2)判断需要处理的String是否在set内
3)如果在,返回它。
4)如果不在,把这个String加入到这个set中,并返回它。
如果遵守以上几点,那么可以肯定的是如果两个String包含相同的字符,那么它们必定是同一个实例!这样的话我们就可以安全的使用==而不是equals()比较String,同时性能会随着比较次数的增加而获得有效的提升。
幸运的是,JAVA已经帮我们实现了上面的几点原则,它就是java.lang.String类里的intern()方法。new String("Hello").intern() == new String("Hello").intern() 会返回true,而把 intern()去掉后,会返回false。
知道为什么我看到Xerces的代码片段protected final static String fVersionSymbol = "version".intern();为什么会吃惊吗?显然这个string会被比较多次,intern()有意义吗?
显然的!事实上JAVA已经这么做了。所有在类中出现的常量都会被自动的intern。这些常量包括上面提到的"version"之类的自定义常量,和类名,方法签名等类文件格式的一部分。甚至常量表达式也适用:"Hel" + "lo" == "Hello" 会返回true。
使用intern()在内存使用方面也有优势---对于某个String来说,无论涉及多少次,内存里只会保存一份内容!这就是类中常量使用intern的主要原因。可以设想一下有多少类涉及到java.lang.Object。这些类中都会出现java.lang.Object的类名。多亏有了intern(),使得内存中只会保存一份类名。
总而言之。intern()是个很有用的方法,但是请负责的使用它。
原文:http://weblogs.java.net/blog/enicholas/archive/2006/06/all_about_inter.html
分享到:
相关推荐
标题中的"aaaaaaaaa.zip_Embest_S3CEV40_beta_教学系统"暗示了这是一个压缩包文件,包含了Embest公司为S3CEV40处理器设计的教学系统资源,特别强调了“beta”版本,意味着这可能是该系统的一个试验性或预发布版本,...
【标题】"aaaaaaaaa.zip" 是一个压缩文件,通常用于存储和传输多个文件或文件夹。在IT领域,这样的文件格式被广泛使用,因为它可以有效减小文件大小,便于网络传输和存储。"zip"是一种常见的压缩算法,由Phil Katz在...
Aaaaaaaaa!aaaaaaaaaaa
Simulation schematic, STATCOM simulation model includes grid section, STATCOM main circuit section and a control section. In the simulation model to simulate the use of three-phase power grid section ...
成人影像学aaaaaa.ppt
313233212223111231aaaaaaaaa = 13R111213212223313233aaaaaaaaa 然后,我们可以计算每个小行列式的值: 13R111213212223313233aaaaaaaaa = a 第二个行列式也可以使用类似的方法计算。 2. 习题 1.3:利用行列式...
无论是对定量模型还是心智模式建模,作为学习过程的一部分,是反复地、不断地形成假设、测试和修订的过程,建模的目标是解决一个问题。在虚拟世界进行的实验,可以指导在现实世界实践的设计和执行;...
基于 System.Web.Mail 与 System.Net.Mai 实现的EmailClient,展示了两种不同命名空间下的mail... Password = "AAAAAAAAA", MailFrom = "xxx@qq.com", MailTo = "xxx@qq.com", Subject = "sub", Body = "body" });
而三阶行列式则包含三个数,如`333231232221131211aaaaaaaaa`,其计算涉及更复杂的加减运算。 二阶行列式计算的关键在于主对角线元素相乘然后相减,即`2211aa`和`2112aa`。对于二元线性方程组,如果系数行列式`...
7、求 a+aa+aaa+.......+aaaaaaaaa=? 其中a为1至9之中的一个数,项数也要可以指定。 8、求 2/1+3/2+5/3+8/5+13/8.....前20项之和? 11、计算圆周率 PI=4-4/3+4/5-4/7....... 打印出第一个大于 3.1415小于 3.1416的...
<a href="">aaaaaaaaa</a>javascript <p><img src="">alert('a')<img src="abc.jpg"><img> <p>Test 嗯,非常安全。然后,又有一个疑问了,是应该将用户的输入过滤之后写入数据库呢?还是在输出界面显示的...
DLT645-2007国网多功能电能表通信协议测试软件,填写地址(电表上面有,不足的用0补足),或者地址填写AAAAAAAAAAAA,可以直接显示读数。
现象:无法卸载office2003,提示找不到Pro11.msi文件 解决方法: 1、从本站下载msicuu2.exe,如无法下载,人多请多试几次,可以下载的! 2、按提示安装。 3、安装完成后,从“开始”菜单选择“所有程序”,然后单击...
例如,333231232221131211aaaaaaaaa的展开就是将每行的第一个元素与对应列的代数余子式相乘并求和。代数余子式是划去指定行和列后剩下的行列式的值,并带有符号(-1)^(i+j),其中i和j是被划去的元素的行和列索引。 n...
g2d.drawString("aaaaaaaaa",10,20); g2d.drawString("bbbbbbbbb",10,30); <br> ByteArrayOutputStream boutstream = new ByteArrayOutputStream(); JPEGImageEncoder enc = JPEGCodec....
例如,二阶行列式由两个对角线元素相减得到,即`2112221122211211aaaaaaaa`,而三阶行列式则涉及更多的交叉项相加和相减,如`333231232221131211aaaaaaaaa312213332112322311322113312312332211...
【描述】"4.0考试笔试题集答案AAAAAAAAA"的描述虽然简略,但可以推测"A"可能是占位符或者代表了题目的具体内容。这个题集可能包含了多方面的知识考察,如基础理论、实践应用、新技术趋势等,考生可以通过解答这些...