关于string类实例生成方法的讨论已经做了很多了,无非就是生成几个对象,堆里的对象,string pool里的对象这些~blablabla~~~
我想说的是intern方法到底有什么意义
我们知道,当一个string类型的变量以这个形式赋值时,
String str = "aaa";
它会先在string pool中查看有没有一个“aaa”的string对象存在,如果有,返回该对象在string pool中的地址,若没有,则生成一个对象扔到string pool中,再返回该地址。
那么intern方法呢,比如
"aaa".intern();
他也是先在string pool中查看有没有一个“aaa”的string对象存在,如果有,返回该对象在string pool中的地址,若没有,则生成一个对象扔到string pool中,再返回该地址。
那它的存在有个毛线意思啊??带着这个疑问,我去查文档,搜网页,最后得到一个答案是string对象在比较时“==”要比equals方法快很多~~
喔~~~原来如此。于是乎,我带着激动的心情写了两个测试类,来验证这一观点
public class EqualTest
{
public static void main(String[] args)
{
String str1 = new String("aaa");
String str2 = new String("aaa");
Boolean result;
long time1 = System.currentTimeMillis();
long time2;
for(long i = 0; i < 1000000; i++)
{
result = str1.equals(str2);
}
time2 = System.currentTimeMillis();
System.out.println(time2 - time1);
}
}
public class InternTest
{
public static void main(String[] args)
{
String str1 = new String("aaa");
String str2 = new String("aaa");
Boolean result;
long time1 = System.currentTimeMillis();
long time2;
for(long i = 0; i < 1000000; i++)
{
result = (str2.intern() == str1.intern());
}
time2 = System.currentTimeMillis();
System.out.println(time2 - time1);
}
}
然后满心欢喜的期待着出现满意的结果。。。
然后结果是这样的
EqualTest
12
InternTest
186
摔!!!你妹啊。。。。这能叫快???
彻底崩溃了。。。于是乎写了这么一篇东西来发泄下。。。
哪位大哥大姐好心来帮下撒~~intern到底有毛用啊????
分享到:
相关推荐
C#中的String.Intern方法是用于将字符串添加到字符串池中的方法。字符串池是一种机制,用于存储字符串的实例,以便重复使用同一个字符串,减少内存占用。在C#中,每个字符串实例都有一个唯一的地址,通过String....
关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样...
之前我们提到了,String.intern方法会返回字符串常量池中的字符串对象的引用。 而G1垃圾回收器的字符串去重的功能其实和String.intern有点不一样,G1是让两个字符串的底层指向同一个byte[]数组。 有图为证: 上图中...
String类的intern、split方法 String 类的 intern 方法是一个本地方法,定义如下:public native String intern();该方法返回一个字符串对象的内部化引用,由 String 类维护一个初始为空的字符串的对象池,当 ...
这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。 Java 6 中的 String.intern() 在 Java 6 中,String.intern() 方法将所有共享的 String 对象...
【String.intern()方法】 String类的intern()方法在Java中扮演着重要的角色,它涉及到字符串对象的内存管理和性能优化。这个方法的主要功能是检查当前字符串对象的值是否已经在Java虚拟机(JVM)的字符串常量池中...
它们由`java.lang.String`类表示,提供了丰富的操作方法,如`length()`用于获取字符串长度,`charAt(int index)`用于访问特定位置的字符,以及`substring(int beginIndex, int endIndex)`用于截取子字符串。...
intern 方法会检查字符串常量池中是否已经存在一个与当前字符串对象相同的字符串,如果已经存在则返回该字符串,否则将当前字符串对象添加到常量池中,并返回该字符串对象的引用。 intern 方法的实现 intern 方法...
`intern()`方法是一个非常特殊的函数,它将字符串常量池(String Constant Pool)的概念引入到我们的讨论中。 字符串常量池是Java虚拟机(JVM)内存模型的一部分,位于堆内存的常量池区域。在Java 6及之前,这个池...
如果在常量池中已经存在相同的Unicode字符串常量,那么String.intern()方法将返回该常量池中的字符串常量的引用,否则,它将在常量池中增加一个新的字符串常量。 例如,String s0="kvill";,String s1=new String(...
Java String#intern() 内存模型是 Java 语言中一个重要的概念,.string#intern() 方法是 Java 字符串常量池中一个重要的组件。字符串常量池是一个固定大小的 HashMap,桶的数量默认是 1009,从 Java7u40 开始,该...
如果字符串对象已经存在于常量池中,那么 intern() 方法将返回该对象的引用。 例如: ```java String s1 = new String("Hello"); String s2 = new String("Hello"); s1 = s1.intern(); s2 = s2.intern(); System....
5. **String.intern()方法**:这个方法用于将字符串对象放入常量池,如果常量池中已经有了相同的Unicode字符串,就返回常量池中的引用。如果常量池中没有,则会添加这个字符串并返回引用。例如,`String s1 = new ...
如果字符串常量池中已经存在该字符串对象,则intern方法将返回该对象的引用;否则,intern方法将创建一个新的字符串对象,并将其添加到字符串常量池中。 Java 6和Java 7中的intern方法 在Java 6中,intern方法返回...
pos文件是ProcessOn的源文件,可以导入后直接打开编辑。 内容是:不同jdk版本下对String的intern()的分析
方法二:使用 String.intern() 方法 使用 String.intern() 方法可以实现对同一用户的加锁,锁粒度较小,能够更好地提高并发性能。 ```java public synchronized void write(Uers u){ synchronized(u.getUserId()....