JAVA学习笔记(5)_____String对象比较的一些个人见解

简介: 首先,我们来看一段程序public class StringCompareTest { public static void main(String[] args) { String s1 = "aaa"; String s2 = "aaa"; System.

首先,我们来看一段程序

public class StringCompareTest 
{
	public static void main(String[] args)
	{
		String s1 = "aaa";
		String s2 = "aaa";
		System.out.println(s1 == s2);

		System.out.println("-------------------");

		String s3 = new String("aaa");
		String s4 = new String("aaa");
		System.out.println(s3 == s4);

		System.out.println("-------------------");
	
		String s5 = "aaa";
		String s6 = new String("aaa");
		System.out.println(s5 == s6);

	}
}

你们认为输出结果是什么呢?

javac 编译的结果是:true , false , false;

我想很多人看到这要糊涂了,创建的字符串都是“aaa",为什么比较结果如此迥异呢?嘿嘿,下面是我的一些见解。

这里要引人字符串池(StringPool)和堆(heap)的概念。

 

  1、对于第一种情况,首先查找StringPool中是否存在“aaa"对象
 如果不存在,则在StringPool中创建一个 “aaa"对象, 然后将StringPool中的这个"aaa"对象的地址返回来,赋给引用变量s,这样s会指向  StringPool中的这个"aaa"字符串对象;
 如果存在,则不创建任何对象,直接将StringPool中这个“aaa"对象地址返回来,赋给s引用。因为s1、s2指向同一个对象”aaa",所以结果为true.

  2、对于第二种情况,首先在StringPool中查找是否有这个对象
  如果有,则不在StringPool创建"aaa"对象,直接在堆中(heap)创建"aaa"对象,将"aaa"对象地址返回 赋给s的引用,导致s指向了堆中创建的这个"aaa"对象;
  如果没有,则首先在StringPool中创建一个"aaa"对象,然后再在堆中创建一个"aaa"对象,然后将堆中这个”aaa"对象的地址返回赋给s引用,导致s指向了堆中所创建的这个  “aaa”。因为s3、s4指向堆中两个不同的对象,所以结果为false.

 3、 对于第三种情况,s5指向字符串池中的对象,s6指向堆中的对象,所以结果为false.

目录
相关文章
|
5天前
|
XML Java Maven
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
21 7
|
4天前
|
Java 数据安全/隐私保护
java类和对象
java类和对象
17 5
|
6天前
|
IDE Java 开发工具
Java“未封闭的 String 表达式”怎么解决
要解决Java中的“未封闭的 String 表示”问题,需检查并修正字符串字面量,确保每个字符串被正确地用双引号括起来。若字符串跨越多行,可使用字符串连接操作符(+)或引入文本块(JDK 13 及以上版本)。这能帮助避免语法错误,并使代码更整洁易读。
|
4天前
|
Java 编译器 C语言
【一步一步了解Java系列】:类与对象的联系
【一步一步了解Java系列】:类与对象的联系
13 4
|
5天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
4天前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
17 2
|
4天前
|
算法 Java API
【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)
【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)
14 1
|
7天前
|
Java
java构造方法时对象初始化,实例化,参数赋值
java构造方法时对象初始化,实例化,参数赋值
15 1
|
8天前
|
存储 Java
深入理解java对象的访问定位
这篇文章深入探讨了Java对象的访问定位机制,比较了使用句柄和直接指针两种主流的对象访问方式,并指出了它们各自的优势,例如句柄访问在对象移动时的稳定性和直接指针访问的速度优势。
17 0
深入理解java对象的访问定位
|
4天前
|
Java 数据安全/隐私保护
java学习笔记(基础习题)
java学习笔记(基础习题)
17 0