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.

目录
相关文章
|
4月前
|
Java API 微服务
2025 年 Java 从入门到精通学习笔记全新版
《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。
223 5
|
17天前
|
小程序 Java 知识图谱
Java 学习笔记 —— BMI & BMR 计算器
这是一个使用 Java 编写的 BMI 与 BMR 计算器小程序,可输入年龄、性别、身高和体重,计算身体质量指数(BMI)和基础代谢率(BMR),并输出健康评估结果。通过该项目,掌握了 Java 的输入处理、数据验证、条件判断、数学运算及格式化输出等基础知识,是 Java 初学者的理想练习项目。
|
17天前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
7月前
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
102 13
|
3月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
222 14
|
5月前
|
Java
深入JavaSE:详解Java对象的比较。
总的来说,Java对象的比较就像海洋生物的比较,有外在的,有内在的,有面对所有情况的,也有针对特殊情况的。理解并掌握这些比较方式,就能更好地驾驭Java的世界,游刃有余地操作Java对象。
88 12
|
6月前
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
165 23
|
6月前
|
Java 数据安全/隐私保护
Java 类和对象
本文介绍了Java编程中类和对象的基础知识,作为面向对象编程(OOP)的核心概念。类是对象的蓝图,定义实体类型;对象是具体实例,包含状态和行为。通过示例展示了如何创建表示汽车的类及其实例,并说明了构造函数、字段和方法的作用。同时,文章还探讨了访问修饰符的使用,强调封装的重要性,如通过getter和setter控制字段访问。最后总结了类与对象的关系及其在Java中的应用,并建议进一步学习继承等概念。
125 1
|
6月前
|
存储 缓存 Java
理解Java引用数据类型:它们都是对象引用
本文深入探讨了Java中引用数据类型的本质及其相关特性。引用变量存储的是对象的内存地址而非对象本身,类似房子的地址而非房子本身。文章通过实例解析了引用赋值、比较(`==`与`equals()`的区别)以及包装类缓存机制等核心概念。此外,还介绍了Java引用类型的家族,包括类、接口、数组和枚举。理解这些内容有助于开发者避免常见错误,提升对Java内存模型的掌握,为高效编程奠定基础。
276 0

热门文章

最新文章