对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系统 #### 一、Input和Output Java IO系统是Java编程中的一个重要组成部分,它负责处理程序与外部资源(如文件、网络等)之间的数据交换。Java IO的设计以流为基础,可以分为输入流...
### 彻底理解Java IO系统:流、类型与高级应用 #### 一、Java IO系统概览 Java的IO(输入/输出)系统是其核心库`java.io`的一部分,提供了一系列丰富的接口和类,旨在处理各种数据输入输出场景。在Java中,IO操作...
Java中的IO流是Java核心库java.io中的关键组成部分,它为程序提供了与外部资源交互的能力,包括文件读写、标准设备输入输出等。Java的IO流机制基于流的概念,流可以被视为数据传输的通道,数据按照序列化的方式从...
4. **日期和时间API**:Java 8彻底改革了日期和时间处理,引入了`java.time`包,包含`LocalDate`、`LocalTime`、`LocalDateTime`等类,取代了原来的`java.util.Date`和`java.util.Calendar`。这些新类提供了更加友好...
Java回调机制是一种编程模式,它允许一个对象在另一个对象完成特定操作后被通知或调用。这种机制在软件设计中非常常见,特别是在处理异步操作和事件驱动编程中。通过回调,一个对象(调用者)可以注册一个回调函数或...
Java 8是Java编程语言的一个重要版本,引入了许多新特性,极大地提升了开发效率和...以上这些特性都在"java8中文文档API"中有所详细介绍,通过这个文档,开发者可以深入理解Java 8的新特性和使用方法,提升开发效率。
最后,关于`java.lang.String`类,它是不可变的,final修饰意味着不能被继承。字符串在Java中是对象,每个字符串常量都会在内存的常量池中创建一次,而通过`new`关键字创建的字符串则会在堆中创建。字符串连接操作...
在IT行业中,尤其是在Java编程领域,中文乱码问题是一个常见的挑战。这主要涉及到字符编码的处理,涉及到Unicode、GBK、UTF-8等不同编码格式之间的转换和一致性问题。本篇文章将深入探讨这个问题,并提供一种彻底...
理解Java的IO系统对于开发涉及数据传输和存储的应用至关重要,无论是简单的文本文件操作,还是复杂的网络通信,都有其身影。熟练掌握这些流类及其用法,可以更高效地处理输入输出任务,提高程序性能。同时,了解如何...
掌握上述六个问题对于深入理解Java语言至关重要。从字符串的操作到变量的初始化,这些基础知识不仅能够帮助你写出更高效的代码,还能避免许多常见的编程陷阱。希望这篇文章能对你学习Java有所帮助!
Java 8对日期和时间API进行了彻底的重构,引入了`java.time`包,提供了`LocalDate`、`LocalTime`、`LocalDateTime`等类,相比旧的`java.util.Date`和`Calendar`,新API更加易用和直观。 七、函数式接口 Java 8加强...
5. **日期与时间API(java.time)**:Java 8对日期和时间API进行了彻底改革,引入了`java.time`包,提供了更强大且易用的日期、时间、时区管理功能,替代了过时的`java.util.Date`和`java.util.Calendar`。...
日期时间API在Java 8中进行了彻底改革,引入了新的`java.time`包,替代了过时的`java.util.Date`和`java.util.Calendar`,提供了更直观、更易于使用的API。 学习Java编程,首先要掌握基础语法,包括变量、运算符、...
Java 8彻底改革了日期和时间处理,引入了`java.time`包,包括`LocalDate`, `LocalTime`, `LocalDateTime`等类,提供了更加友好和强大的日期时间操作功能,取代了之前饱受诟病的`java.util.Date`和`java.util....
Java序列化和反序列化是Java开发中常用的技术,它允许我们将Java对象转换成字节流,以便于存储、在网络中传输或在不同时间点重建对象。...理解和掌握这些概念有助于提升Java开发能力,并能有效地解决实际项目中的问题。
Java中的String类是编程中最常用的类之一,尤其是在Java 8及之前的版本中,对它的深入理解对于编写高效、可靠的代码至关重要。本文将探讨Java String的内部机制,特别是与常量池相关的概念。 首先,让我们来看一下...
2. **`main`方法的语法**:`main`方法是Java程序的入口点,`public static void main(String[] args)`是每个Java应用程序必须包含的。它必须是`static`的,因为程序在没有创建任何对象的情况下开始执行。 3. **初始...
首先,我们需要理解Java中的文件I/O操作。Java标准库提供了java.io包,其中包含了许多类用于处理输入/输出流。例如,File类用于表示文件和目录,它提供了创建、读取、写入、重命名和删除文件的方法。我们可以通过...
C 和 C++ 不支持字符串变量,在 C 和 C++ 程序中使用 Null 终止符代表字符串的结束,在 Java 中字符串是用类对象(String 和 StringBuffer)来实现的,这些类对象是 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 ...