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`是最重要的类之一,它是所有字符串操作的基础。这个类位于核心类库中,因此无需显式导入即可使用。本文将深入探讨`String`类的一些关键知识点,包括它的特性、构造方法、常用...
Java.lang.String类是Java语言中的一种基本数据类型,该类的定义、字段属性、构造方法、equals方法、hashCode方法、charAt方法、compareTo方法、concat方法、indexOf方法、replace方法、split方法、substring方法、...
- `java.lang.String`类是不可变的,了解它的内部实现,如字符数组、intern()方法和字符串池,有助于优化字符串操作。 9. **多线程(Multithreading)**: - `java.lang.Thread`类和`java.lang.Runnable`接口定义...
文档会详细解释它的构造函数(如`String()`,`String(char[] value)`),方法(如`length()`,`substring()`),以及相关属性(如`length`,`intern`)。 3. **方法和构造函数**:每个方法或构造函数都有一个签名,...
Java中的`String`类是编程中最常用的类之一,它在Java的`java.lang`包中,无需显式导入即可使用。`String`类代表不可变的字符序列,这意味着一旦创建了`String`对象,它的值就不能改变。这个特性使得`String`在处理...
Java的字符串池就是一个享元模式的实例,通过`String.intern()`方法可以实现。 11. 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。在Java的`java.io.InputStream...
在Java编程中,`java.lang.String`类是极为常见的基础数据类型之一,其重要性和应用范围不言而喻。为了更好地理解和使用String类,本文将从几个关键方面入手,探讨如何更加高效、合理地使用String对象。 #### 一、...
首先,Java中的字符串实际上是一个表示`char`值序列的对象,它是由`java.lang.String`类定义的。字符串在内存中的处理非常特别,它们存储在称为“字符串常量池”的区域,这是一个优化内存使用的策略。当使用字符串...
它们由`java.lang.String`类表示,提供了丰富的操作方法,如`length()`用于获取字符串长度,`charAt(int index)`用于访问特定位置的字符,以及`substring(int beginIndex, int endIndex)`用于截取子字符串。...
- String类的intern()方法的作用,以及对子字符串的提取、连接等操作。 14. Java的类加载机制: - 使用java.lang.Class的forName方法加载类。 15. Java的基本概念: - char类型的Unicode编码。 - Java语言规范...
`String`类位于`java.lang`包中,是所有Java程序的默认组成部分,无需显式导入。 ### 1. `String`类的构造方法 `String`类提供了多种构造方法,允许我们创建字符串对象。例如: - `String()`:创建一个空字符串。 -...
- **String的`intern()`方法**:现在使用字符串池来提高性能,减少内存消耗。 安装JDK1.8_191后,开发人员可以利用其提供的工具和库进行Java应用程序的开发,同时享受该版本带来的性能优化和新特性的便利。无论是...
- `String`类还引入了`intern()`方法,用于缓存字符串实例,减少内存消耗,特别是在大量重复字符串出现时。 2. **设计模式**: - 设计模式是软件工程中的重要概念,Java API 1.6的实现中融入了许多设计模式,如...
- String的intern方法:返回字符串常量池中所持的该字符串对象的引用,如果常量池中没有对应的字符串,则将此字符串添加到常量池。 2. 单例模式 - 单例模式确保一个类只有一个实例,并提供一个全局访问点。 - ...
在Java中,字符串被封装在`java.lang.String`类中,具有不可变性,这意味着一旦创建,就不能更改字符串的内容。字符串操作主要包括创建、比较、连接、查找、替换、分割、格式化等多个方面。 1. **创建字符串**:...
`String`类位于`java.lang`包中,是所有Java程序的基础。 2. **字符串创建**:Java提供了多种创建字符串的方法,如使用`new`关键字初始化,或者使用字符串字面量。例如: ```java String str1 = "Hello"; String...
例如,了解`String`类的不可变性,以及它的`intern()`方法的作用,可以帮助优化字符串处理。 7. **调试与问题解决**: 当遇到Java程序的运行时错误,能够查看rt.jar的源码可以帮助定位问题。例如,如果一个异常抛...
例如,`String`类的`intern()`方法是如何实现字符串池的,`ClassLoader`又是如何动态加载类的。 `javax`包: 该包主要包含Java的扩展功能,如 Swing 组件(在`javax.swing`子包中)和XML处理(在`javax.xml`子包中...
java.lang 包中的 Object 类有 public boolean equals(Object obj) 方法,它比较两个对象是否相等。 其它对象的 equals 方法仅当被比较的两个引用指向的对象内容相同时,对象的 equals() 方法返回 true。“==”和...
在Java中,字符串被表示为`String`类的对象,该类位于`java.lang`包中,这意味着它在每个Java程序中都是默认可用的。字符串对象是不可变的,意味着一旦创建,其内容就不能更改。下面我们将深入探讨一些关于Java字符...