`

java.lang.String的intern()方法

阅读更多

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";
----------------------
附加一个小实例:
public class Mud {

	public static String hello(String[] strs, String s2) {
		strs[0] = "<" + strs[0] + ">";
		s2.toUpperCase();
		return s2;
	}

	/**
	 * @param args
	 */
	public static void main(String... args) {
		String a = new String("t");
		String[] b = new String[] { "t" };
		String c = a.intern();

		if (a.equals(b[0])) {
			System.out.print("1");
		}

		if (b[0] == c) {
			System.out.print("2");
		}

		if (a == c) {
			System.out.print("3");
		}

		a = hello(b, c);
		System.out.print(a);
		System.out.print(b[0]);
		System.out.print(c);
	}
}
 
结果为:12t<t>t
分享到:
评论

相关推荐

    Java类库复习——java.lang.String

    在Java编程语言中,`java.lang.String`是最重要的类之一,它是所有字符串操作的基础。这个类位于核心类库中,因此无需显式导入即可使用。本文将深入探讨`String`类的一些关键知识点,包括它的特性、构造方法、常用...

    Java源码解析——看优秀源码最能使人进步

    Java.lang.String类是Java语言中的一种基本数据类型,该类的定义、字段属性、构造方法、equals方法、hashCode方法、charAt方法、compareTo方法、concat方法、indexOf方法、replace方法、split方法、substring方法、...

    java源码之jdk源码

    - `java.lang.String`类是不可变的,了解它的内部实现,如字符数组、intern()方法和字符串池,有助于优化字符串操作。 9. **多线程(Multithreading)**: - `java.lang.Thread`类和`java.lang.Runnable`接口定义...

    JAVA API文档

    文档会详细解释它的构造函数(如`String()`,`String(char[] value)`),方法(如`length()`,`substring()`),以及相关属性(如`length`,`intern`)。 3. **方法和构造函数**:每个方法或构造函数都有一个签名,...

    java String类的实现

    Java中的`String`类是编程中最常用的类之一,它在Java的`java.lang`包中,无需显式导入即可使用。`String`类代表不可变的字符序列,这意味着一旦创建了`String`对象,它的值就不能改变。这个特性使得`String`在处理...

    设计模式_java语言中的应用

    Java的字符串池就是一个享元模式的实例,通过`String.intern()`方法可以实现。 11. 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。在Java的`java.io.InputStream...

    正确使用String类的几点注意

    在Java编程中,`java.lang.String`类是极为常见的基础数据类型之一,其重要性和应用范围不言而喻。为了更好地理解和使用String类,本文将从几个关键方面入手,探讨如何更加高效、合理地使用String对象。 #### 一、...

    【Java编程教程】详解Java String字符串.pdf

    首先,Java中的字符串实际上是一个表示`char`值序列的对象,它是由`java.lang.String`类定义的。字符串在内存中的处理非常特别,它们存储在称为“字符串常量池”的区域,这是一个优化内存使用的策略。当使用字符串...

    字符串string.zip

    它们由`java.lang.String`类表示,提供了丰富的操作方法,如`length()`用于获取字符串长度,`charAt(int index)`用于访问特定位置的字符,以及`substring(int beginIndex, int endIndex)`用于截取子字符串。...

    Java练习题02.pdf

    - String类的intern()方法的作用,以及对子字符串的提取、连接等操作。 14. Java的类加载机制: - 使用java.lang.Class的forName方法加载类。 15. Java的基本概念: - char类型的Unicode编码。 - Java语言规范...

    java String详解

    `String`类位于`java.lang`包中,是所有Java程序的默认组成部分,无需显式导入。 ### 1. `String`类的构造方法 `String`类提供了多种构造方法,允许我们创建字符串对象。例如: - `String()`:创建一个空字符串。 -...

    jdk-1.8_191(64-bit).zip

    - **String的`intern()`方法**:现在使用字符串池来提高性能,减少内存消耗。 安装JDK1.8_191后,开发人员可以利用其提供的工具和库进行Java应用程序的开发,同时享受该版本带来的性能优化和新特性的便利。无论是...

    JavaAPI 1 6

    - `String`类还引入了`intern()`方法,用于缓存字符串实例,减少内存消耗,特别是在大量重复字符串出现时。 2. **设计模式**: - 设计模式是软件工程中的重要概念,Java API 1.6的实现中融入了许多设计模式,如...

    java C++ 书籍收藏

    - String的intern方法:返回字符串常量池中所持的该字符串对象的引用,如果常量池中没有对应的字符串,则将此字符串添加到常量池。 2. 单例模式 - 单例模式确保一个类只有一个实例,并提供一个全局访问点。 - ...

    StringManipulation-9.9.0

    在Java中,字符串被封装在`java.lang.String`类中,具有不可变性,这意味着一旦创建,就不能更改字符串的内容。字符串操作主要包括创建、比较、连接、查找、替换、分割、格式化等多个方面。 1. **创建字符串**:...

    ch4.zip_java ch4

    `String`类位于`java.lang`包中,是所有Java程序的基础。 2. **字符串创建**:Java提供了多种创建字符串的方法,如使用`new`关键字初始化,或者使用字符串字面量。例如: ```java String str1 = "Hello"; String...

    OpenJDK中rt.jar源码文件

    例如,了解`String`类的不可变性,以及它的`intern()`方法的作用,可以帮助优化字符串处理。 7. **调试与问题解决**: 当遇到Java程序的运行时错误,能够查看rt.jar的源码可以帮助定位问题。例如,如果一个异常抛...

    rt.jar源码

    例如,`String`类的`intern()`方法是如何实现字符串池的,`ClassLoader`又是如何动态加载类的。 `javax`包: 该包主要包含Java的扩展功能,如 Swing 组件(在`javax.swing`子包中)和XML处理(在`javax.xml`子包中...

    java中==与equal()区别

    java.lang 包中的 Object 类有 public boolean equals(Object obj) 方法,它比较两个对象是否相等。 其它对象的 equals 方法仅当被比较的两个引用指向的对象内容相同时,对象的 equals() 方法返回 true。“==”和...

    Java练习字符串课题的源码

    在Java中,字符串被表示为`String`类的对象,该类位于`java.lang`包中,这意味着它在每个Java程序中都是默认可用的。字符串对象是不可变的,意味着一旦创建,其内容就不能更改。下面我们将深入探讨一些关于Java字符...

Global site tag (gtag.js) - Google Analytics