`

彻底理解Java中的String类

阅读更多
对String类的理解网上有很多的资料,个人觉得很多都是错误的,错误的解释危害性更大。所以为了解释清楚,就来看代码,代码运行出的结果才是最具有说服力的。说明:以下都是个人的理解,欢迎指正。

public class StringTest {
    public static void main(String[] args) {
        String str1 = new String("abc");

        String str2 = "abc";

        if (str1 == str2) {
            System.out.println("str1 == str2");
        } else {
            System.out.println("str1 != str2");
        }

        String str3 = "abc";
        if (str2 == str3) {
            System.out.println("str2 == str3");
        } else {
            System.out.println("str2 != str3");
        }

        str1 = str1.intern();

        if (str1 == str2) {
            System.out.println("str1 == str2");
        } else {
            System.out.println("str1 != str2");
        }
       
        String str4 = new String("abc");
        str4 = str4.intern();
       
        if (str1 == str4) {
            System.out.println("str1 == str4");
        } else {
            System.out.println("str1 != str4");
        }
    }

}


运行结果:
str1 != str2
str2 == str3
str1 == str2
str1 == str4


看看运行结果后,给出我自己的理解说明:

1、String有一个所谓的String pool,这是一个什么东西呢,我理解是它是堆(heap)上特殊的一个空间(我叫它特殊堆)。注意它也是在堆上。

2、产生String类型的对象有两种方法,那么这两种方法有什么区别呢?我的理解是String str = “abc”是先用equals方法(String类覆盖了equals方法)判断这个特殊堆(String pool)是否有abc,有则将原来在栈中指向abc的引用赋值给str,否则就在这个特殊堆(String pool)上创建一个abc对象。String str2 = new String("abc")则是在普通堆上创建abc对象。所以str和str2是指向不同的对象,它们是不同的。

3、String有个intern()方法,这个方法是个本地方法,当用String str2 = new String("abc")来创建对象时,它相当于告诉JVM,我这个abc对象是放在特殊堆(String pool)上的。所以第三个打印结果是相等的。

4、需要注意的一点:String是final类,它是恒定类,一旦创建就无法改变,所以用intern()方法是重新在String pool中创建了一个新的对象。

5、String类有一个伴随类StringBuffer,需要了解它们之间的区别请google之。
分享到:
评论

相关推荐

    彻底明白 Java 语言中的IO系统

    ### 彻底理解Java语言中的IO系统 #### 一、Input和Output Java IO系统是Java编程中的一个重要组成部分,它负责处理程序与外部资源(如文件、网络等)之间的数据交换。Java IO的设计以流为基础,可以分为输入流...

    彻底明白 Java 语言中的IO系统 .pdf

    ### 彻底理解Java IO系统:流、类型与高级应用 #### 一、Java IO系统概览 Java的IO(输入/输出)系统是其核心库`java.io`的一部分,提供了一系列丰富的接口和类,旨在处理各种数据输入输出场景。在Java中,IO操作...

    彻底明白java中的IO流

    Java中的IO流是Java核心库java.io中的关键组成部分,它为程序提供了与外部资源交互的能力,包括文件读写、标准设备输入输出等。Java的IO流机制基于流的概念,流可以被视为数据传输的通道,数据按照序列化的方式从...

    Java8中文文档

    4. **日期和时间API**:Java 8彻底改革了日期和时间处理,引入了`java.time`包,包含`LocalDate`、`LocalTime`、`LocalDateTime`等类,取代了原来的`java.util.Date`和`java.util.Calendar`。这些新类提供了更加友好...

    两个经典例子让你彻底理解java回调机制(csdn)————程序.pdf

    Java回调机制是一种编程模式,它允许一个对象在另一个对象完成特定操作后被通知或调用。这种机制在软件设计中非常常见,特别是在处理异步操作和事件驱动编程中。通过回调,一个对象(调用者)可以注册一个回调函数或...

    java8中文文档API

    Java 8是Java编程语言的一个重要版本,引入了许多新特性,极大地提升了开发效率和...以上这些特性都在"java8中文文档API"中有所详细介绍,通过这个文档,开发者可以深入理解Java 8的新特性和使用方法,提升开发效率。

    java彻底理解bytecharshortintfloatlongdouble.doc

    最后,关于`java.lang.String`类,它是不可变的,final修饰意味着不能被继承。字符串在Java中是对象,每个字符串常量都会在内存的常量池中创建一次,而通过`new`关键字创建的字符串则会在堆中创建。字符串连接操作...

    彻底解决中文乱码的问题

    在IT行业中,尤其是在Java编程领域,中文乱码问题是一个常见的挑战。这主要涉及到字符编码的处理,涉及到Unicode、GBK、UTF-8等不同编码格式之间的转换和一致性问题。本篇文章将深入探讨这个问题,并提供一种彻底...

    彻底明白Java的IO系统

    理解Java的IO系统对于开发涉及数据传输和存储的应用至关重要,无论是简单的文本文件操作,还是复杂的网络通信,都有其身影。熟练掌握这些流类及其用法,可以更高效地处理输入输出任务,提高程序性能。同时,了解如何...

    学习Java 必须搞懂的6个问题

    掌握上述六个问题对于深入理解Java语言至关重要。从字符串的操作到变量的初始化,这些基础知识不仅能够帮助你写出更高效的代码,还能避免许多常见的编程陷阱。希望这篇文章能对你学习Java有所帮助!

    Java8+jdk1.8中文文档.zip

    Java 8对日期和时间API进行了彻底的重构,引入了`java.time`包,提供了`LocalDate`、`LocalTime`、`LocalDateTime`等类,相比旧的`java.util.Date`和`Calendar`,新API更加易用和直观。 七、函数式接口 Java 8加强...

    Java JDK1.8中文API文档

    5. **日期与时间API(java.time)**:Java 8对日期和时间API进行了彻底改革,引入了`java.time`包,提供了更强大且易用的日期、时间、时区管理功能,替代了过时的`java.util.Date`和`java.util.Calendar`。...

    java72-java.zip

    日期时间API在Java 8中进行了彻底改革,引入了新的`java.time`包,替代了过时的`java.util.Date`和`java.util.Calendar`,提供了更直观、更易于使用的API。 学习Java编程,首先要掌握基础语法,包括变量、运算符、...

    JAVA-8-261.zip

    Java 8彻底改革了日期和时间处理,引入了`java.time`包,包括`LocalDate`, `LocalTime`, `LocalDateTime`等类,提供了更加友好和强大的日期时间操作功能,取代了之前饱受诟病的`java.util.Date`和`java.util....

    一文带你彻底理解Java序列化和反序列化

    Java序列化和反序列化是Java开发中常用的技术,它允许我们将Java对象转换成字节流,以便于存储、在网络中传输或在不同时间点重建对象。...理解和掌握这些概念有助于提升Java开发能力,并能有效地解决实际项目中的问题。

    浅谈Java String内幕(上)

    Java中的String类是编程中最常用的类之一,尤其是在Java 8及之前的版本中,对它的深入理解对于编写高效、可靠的代码至关重要。本文将探讨Java String的内部机制,特别是与常量池相关的概念。 首先,让我们来看一下...

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第05章_高级类特性2(共69页).pptx

    2. **`main`方法的语法**:`main`方法是Java程序的入口点,`public static void main(String[] args)`是每个Java应用程序必须包含的。它必须是`static`的,因为程序在没有创建任何对象的情况下开始执行。 3. **初始...

    Java实现资源管理器

    首先,我们需要理解Java中的文件I/O操作。Java标准库提供了java.io包,其中包含了许多类用于处理输入/输出流。例如,File类用于表示文件和目录,它提供了创建、读取、写入、重命名和删除文件的方法。我们可以通过...

    java和c++区别

    C 和 C++ 不支持字符串变量,在 C 和 C++ 程序中使用 Null 终止符代表字符串的结束,在 Java 中字符串是用类对象(String 和 StringBuffer)来实现的,这些类对象是 Java 语言的核心,用类对象实现字符串有以下几个...

    疯狂JAVA讲义

    9.3.2 String、StringBuffer和StringBuilder类 322 9.3.3 Math类 327 9.3.4 Random类 328 9.3.5 BigDecimal类 330 9.4 处理日期的类 333 9.4.1 Date类 333 9.4.2 Calendar类 334 9.4.3 TimeZone类 337 9.5 ...

Global site tag (gtag.js) - Google Analytics