看《深入理解java虚拟机》的样张的时候,发现了一个有趣的知识点。
算是局部优化吧,关于String.intern()方法,具体参见转载的文章
=========================================
zz from :
http://apps.hi.baidu.com/share/detail/19219324
java.lang.String的intern()方法
"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:
检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。
我们做个测试:
String str1 = "a";
String str2 = "bc";
String str3 = "a"+"bc";
String str4 = str1+str2;
System.out.println(str3==str4);
str4 = (str1+str2).intern();
System.out.println(str3==str4);
输出的结果将会是:
false
true
JDK的api文档是这么解释的:
=======================================================================
返回字符串对象的规范化表示形式。
一个初始时为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
所有字面值字符串和字符串赋值常量表达式都是内部的。字符串字面值在《Java Language Specification》的 §3.10.5 中已定义。
返回:
一个字符串,内容与此字符串相同,但它保证来自字符串池中。
=======================================================================
字符串字面池指的是常量池.
字符串对象的创建方式有两种
如下:
String s1 = new String(""); //第一种
String s2 = ""; //第二种
第一种始终不会入池的.
第二种要看情况而定(等号右边如果是常量则入池,非常量则不入池)
例:
String s3 = "a" + "b"; //"a"是常量,"b"是常量,常量+常量=常量,所以会入池.
String s4 = s1 + "b"; //s1是变量,"b"是常量,变量+常量!=常量,所以不会入池.
一旦入池的话,就会先查找池中有无此对象.如果有此对象,则让对象引用指向此对象;如果无此对象,则先创建此对象,再让对象引用指向此对象.
例:
String s5 = "abc"; //先在池中查找有无"abc"对象,如果有,则让s5指向此对象;如果池中无"abc"对象,则在池中创建一个"abc"对象,然后让s5指向该对象.
补充一下:
看了字节码后,发现
String str ="a"+"b";
完全等同于
String str="ab";
分享到:
相关推荐
C#中的String.Intern方法是用于将字符串添加到字符串池中的方法。字符串池是一种机制,用于存储字符串的实例,以便重复使用同一个字符串,减少内存占用。在C#中,每个字符串实例都有一个唯一的地址,通过String....
关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样...
之前我们提到了,String.intern方法会返回字符串常量池中的字符串对象的引用。 而G1垃圾回收器的字符串去重的功能其实和String.intern有点不一样,G1是让两个字符串的底层指向同一个byte[]数组。 有图为证: 上图中...
Java 中 String.equals 和 == 的比较 Java 中 String.equals...需要注意的是,在 Java 中,String 是一个特殊的类,它可以使用字面量来创建字符串对象,并且可以使用 intern() 方法将字符串对象添加到字符串常量池中。
这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。 Java 6 中的 String.intern() 在 Java 6 中,String.intern() 方法将所有共享的 String 对象...
总之,理解Java中的String类,特别是它的创建方式、常量池以及`intern()`方法的工作原理,对于编写高效、内存友好的代码至关重要。在实际编程中,根据需求合理选择创建和操作字符串的方法,可以避免不必要的内存开销...
Java String 中的 intern 方法是一个非常重要的概念,它可以将字符串对象存储在字符串常量池中,以便重复使用相同的字符串对象,减少内存的占用。下面我们将深入讲解 Java String 中 intern 的相关知识点。 什么是 ...
该方法返回一个字符串对象的内部化引用,由 String 类维护一个初始为空的字符串的对象池,当 intern 方法被调用时,如果对象池中已经包含这一个相等的字符串对象则返回对象池中的实例,否则添加字符串到对象池并返回...
String.intern()方法是Java中的一个方法,它可以将一个String对象添加到常量池中。如果在常量池中已经存在相同的Unicode字符串常量,那么String.intern()方法将返回该常量池中的字符串常量的引用,否则,它将在常量...
Java String#intern() 内存模型是 Java 语言中一个重要的概念,.string#intern() 方法是 Java 字符串常量池中一个重要的组件。字符串常量池是一个固定大小的 HashMap,桶的数量默认是 1009,从 Java7u40 开始,该...
总的来说,`String`类是Java开发中不可或缺的一部分,理解和掌握其特性和方法对于编写高质量的代码至关重要。通过深入研究源码,我们能更深入地理解Java内存管理以及如何优化字符串操作。在日常开发中,应充分利用`...
String类的intern()方法在Java中扮演着重要的角色,它涉及到字符串对象的内存管理和性能优化。这个方法的主要功能是检查当前字符串对象的值是否已经在Java虚拟机(JVM)的字符串常量池中存在。如果存在,它会返回...
在本压缩包“字符串string.zip”中,主要包含的是与Java编程语言中字符串相关的教学资料,特别是针对S1课程的学员。这个课程旨在帮助学生深入理解程序逻辑,并且重点聚焦在Java中的字符串处理。文件“Chapter15”...
在Java编程语言中,`String`类是极其重要的,它提供了许多用于操作字符串的方法,其中之一便是`intern()`。深入理解`String#intern()`方法对于优化内存使用和理解Java的内存模型至关重要。`intern()`方法是一个非常...
Java String的intern方法是Java中一个非常重要的方法,它可以将字符串常量池中的字符串对象返回给我们。今天,我们将深入探究Java String的intern用法解析,了解它的工作原理和应用场景。 Java String的intern方法 ...
Java字符池,也被称为常量池,是Java内存管理中一个关键的概念,主要用来存储编译期就已经确定的各种常量,包括字符串常量、类、方法、接口等信息。理解字符池对于优化Java程序性能至关重要。 1. **String对象与...
方法二:使用 String.intern() 方法 使用 String.intern() 方法可以实现对同一用户的加锁,锁粒度较小,能够更好地提高并发性能。 ```java public synchronized void write(Uers u){ synchronized(u.getUserId()....