`

Java基础问题:java.lang.String - intern()

    博客分类:
  • Java
 
阅读更多

原文: http://forum.javaeye.com/viewtopic.php?t=17912


搂主的问题问的含含糊糊:flyjie给出了非常详细的解释,
不过就是没有解释String实例化的特殊方面以及Intern()方法的含义

-------
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
java代码: 
String str ; 

这样声明str它只支是一个对象的reference,不会产生实际的对象。如果没有初始化str,编译时便会发生错误。 
java代码: 
String str1=new String("test"); 
String str2 = "test"; 

str1是一个新的对象。new关键字的意思就是创建某个新的对象。而str2是一个对象的引用。 它们的内容相同,但内存地址是不一样的。 java中对象的引用存在Stack(栈)中,而对象由Heap(堆)分配空间。 

3、引用==变量?  不一定 
java代码: 

  public class TestString { 
public static void main(String[] args) { 
String s1 = "test"; 
String s2 = new String("test"); 
if (s1 == s2) 
System.out.println("s1 == s2"); 
else 
System.out.println("s1 != s2"); 
if (s1.equals(s2)) 
System.out.println("s1 equals s2"); 
else System.out.println("s1 not equals s2"); 
} 
} 

我们将 s2 用 new 操作符创建程序输出:s1 != s2 s1 equals s2. 
java代码: 

s2 = s2.intern(); 

在你加上这句话后,上面的程序输入:s1 == s2 s1 equals s2 

而String a = "test" ; String b = "test" ; a == b 会返回true; 这里a="test"时创建一个在栈中的reference, b=test时jvm发现栈中已存在名为"test"的字符串,直接引用。结论:String 是个对象,要对比两个不同的String对象的值是否相同明显的要用到 equals() 这个方法. 而== 比较的是内存地址的值。 

4、private final String a = "test", 这个a属于常量,存放在常量存储空间(CS)中。 

5、建议你看看<<深入浅出java虚拟机>>一书。 

-------
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------



总结

1. 在学习JAVA的时候就知道==比较的是内存地址.而equals比较的是内存地址对应的值!(可是还是有很多的人问来问去的,真不知道他们JAVA的基础课程是怎么学的?!)

2. JAVA所有的对象都是存放在堆中的!你获取的"对象"仅仅只是对象的引用而已

3. String是比较特殊的对象,特殊在
3.1 > String a = new String("test") -此时你是在堆中实例化了一个字符串对象
3.2 > String b = "test"-此时JVM会先去堆中寻找这样的对象;如果有就返回此对象的引用;如果没有就重新实例化一个这样的对象!基于这样的一个过程所以JAVA要求String不可以更改值的。

3.3 >intern()方法就是试图完成这样的一个寻找过程
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

这里有一份详细的参考资料:

关于Java栈与堆的思考 http://www.javafan.net/article/20051123115654293.html

分享到:
评论

相关推荐

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

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

    Java练习题02.pdf

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

    java源码之jdk源码

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

    JavaAPI 1 6

    - 设计模式是软件工程中的重要概念,Java API 1.6的实现中融入了许多设计模式,如工厂模式(`Class.newInstance()`)、单例模式(`java.lang.Runtime`)等,帮助开发者实现更灵活、可维护的代码结构。 3. **SSH...

    JAVA API文档

    1. **Java类库概述**:Java API文档首先介绍了Java的核心类库,这些类库包括基础类如`java.lang`,I/O操作如`java.io`,网络编程如`java.net`,集合框架如`java.util`,以及多线程编程如`java.concurrent`等。...

    java String类的实现

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

    jdk-1.8_191(64-bit).zip

    **Java系统类库** 包含了大量的预定义类,如`java.lang`、`java.util`和`java.io`等,这些类提供了基础功能,如字符串操作、集合框架、输入/输出处理以及网络通信等。开发者可以利用这些类库快速构建复杂的应用程序...

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

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

    java C++ 书籍收藏

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

    正确使用String类的几点注意

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

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

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

    字符串string.zip

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

    设计模式_java语言中的应用

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

    OpenJDK中rt.jar源码文件

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

    java String详解

    Java中的`String`类是编程中非常基础且重要的部分,它代表不可变的字符序列。在Java中,字符串被广泛用于各种操作,如拼接、比较、搜索、格式化等。`String`类位于`java.lang`包中,是所有Java程序的默认组成部分,...

    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...

    JVM内幕:java虚拟机详解

    Java虚拟机是Java应用程序运行的基础,其复杂的内部结构确保了程序的高效性和安全性。理解JVM的工作原理对于优化Java程序、解决性能问题具有重要意义。通过深入学习JVM的各个组件及其工作方式,开发人员可以更好地...

    [jvm]深入JVM(一):从

    [jvm]深入JVM(一):从"abc"=="abc"看java的连接过程收藏 一般说来,我不关注java底层的东西,这次是一个朋友问到了,注意不光是 ... assert(java_lang_String::is_instance(entry), "must be string"); return entry; }

    rt.jar源码

    这些目录代表了不同的命名空间,其中`java`目录下的源码包含了许多基础的Java类,如`java.lang.Object`、`java.util.ArrayList`等;`javax`、`com`、`org`等则包含了各种扩展和第三方库。 `java`包: 此包包含了...

Global site tag (gtag.js) - Google Analytics