【前端学java】复习巩固-Java中的对象比较(15)

简介: 【8月更文挑战第11天】Java中的对象比较

基础知识巩固

在代码开发中,经常涉及两个数值的比较问题。在前端中,最简单的比较就是使用“==”运算符

1 === "1" // false
1 == "1"  // true

在java中,对象的比较和前端是存在差异的,我们通过本节内容详细巩固一下。开始之前,我们先复习一下差异项:

  • java中的单引号表示字符,一般是char类型的;java中的双引号是字符串,是String类型的。
  • 在Java中,=== 符号并不存在、也没有undefined这个概念
  • Java使用 == 操作符来比较两个值是否相等,当比较两个基本数据类型(如 int、char、double 等时,== 操作符的效果是相同的
  • 在比较两个对象的内容是否相等时,不能使用 == 操作符!在Java中,对象比较的是它们的引用,而不是它们的值。在这种情况下,你应该使用 .equals() 方法来比较两个对象的内容
  • java中,数据类型主要分为基本数据类型和引用数据类型
    | 基本数据类型 | | 引用数据类型 | |
    | --- | --- | --- | --- |
    | 整形(整数) | byte、short、int、long | String | 表示字符串 |
    | 浮点型数据类型(小数) | float、double | Array | 表示数组 |
    | 字符型数据类型 | char | Class | 表示类类型 |
    | 布尔型数据类型 | boolean | Interface、Enum | 表示接口类型及表示枚举类 |

“==” 比较符

基本数据类型比较

  public static void main(String[] args) {
   
   
     int a = 1;
     int b = 1;
     System.out.println(a==b); // true
  }

基本数据类型中,“==”比较的是数值大小

 public static void main(String[] args) {
   
   
     int a = 10;
     double b = 10.0;
     System.out.println(a==b); // 10和10.0数值相等,所以结果为true
  }

引用数据类型的比较

在Java中,对于引用数据类型(如对象、数组等),"=="操作符比较的是它们的引用是否相等,也就是说,比较它们是否指向内存中的同一个位置。

String a = "123";
String b = new String("123");
System.out.println(a == b);  // false

上述代码中,String a = "123"会创建一个字符串对象,new String("123")也会创建一个新的字符串对象,两个字符串内存地址不同,因此a==b结果为false

如果想比较值是否相同,我们使用.equals()方法。

String a = "123";
String b = new String("123");
System.out.println(a.equals(b)); // true

字符串的比较是一个比较常见的操作,因此,String类存在一些优化

String a = "123";
String b = "123";
System.out.println(a == b);  // true

如上述代码的字符声明方式,在字符比较时,比较的就是他们的值内容而不是引用地址。

类的比较

public class My_Utils {
   
   
    public static void main(String[] args) {
   
   
        Compare compare1 = new Compare();
        Compare  compare2 = new Compare();
        System.out.println(compare1 == compare2);
    }
}

class Compare {
   
   

}

观察上述代码,根据之前的知识,我们能很快知道compare1 == compare2的比较结果为fasle。
因为new 会创建一个新对象,比较的就是内存地址。
那我们使用equals是否能比较其内容呢?

Compare compare1 = new Compare();
Compare  compare2 = new Compare();
System.out.println(compare1.equals(compare2));    // false

结果为fasle,这是为什么呢?我们进入compare1对象上的的 equals内部看看就明白了
GIF 2023-10-28 13-06-24.gif
通过代码,我们可以知道,其内部实际就是还是调用了"=="运算符,自然结果还是fasle

包装类的比较

我们来复习下Java中的包装类有哪些:

  • Integer(对应int)
  • Double(对应double)
  • Float(对应float)
  • Long(对应long)
  • Short(对应short)
  • Byte(对应byte)
  • Character(对应char)
  • Boolean(对应boolean)

我们来看一个demo

    public static void main(String[] args) {
   
   
        Integer a = 200;
        Integer b = 200;
        System.out.println(a == b); 
    }

上述代码中Integer a = 200实际上是Integer numObj = Integer.valueOf(10); 的简写形式,我们称之为为自动装箱;这个过程是一个new的过程,创建了新对象。因此,根据 “==”在类中只比较引用地址的特性,我们可以知道上面的比较结果是fasle。
事实也的确如此!
我们看另外一个例子

    public static void main(String[] args) {
   
   
        Integer a = 200;
        Integer b = 200;
        System.out.println(a == b);  // false
        Integer c = 100;
        Integer d = 100;
        System.out.println(c == d);  // true
    }

image.png
结果似乎和我们想想的不一样,这是为什么呢?
原来,对于Integer类,Java会自动缓存-128到127之间的值,也就是说,如果创建的Integer对象的值在这个范围内,那么它们会被自动缓存为同一个对象。所以,当a和b的值都在这个范围内时,a == b的结果为true。
然而,当c和d的值超过这个范围时,Java不会为这些对象进行缓存。所以,尽管它们的值相同,但是因为它们不是同一个对象,所以c == d的结果为false。

相关文章
|
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
|
7月前
|
设计模式 缓存 Java
重学Java基础篇—Java对象创建的7种核心方式详解
本文全面解析了Java中对象的创建方式,涵盖基础到高级技术。包括`new关键字`直接实例化、反射机制动态创建、克隆与反序列化复用对象,以及工厂方法和建造者模式等设计模式的应用。同时探讨了Spring IOC容器等框架级创建方式,并对比各类方法的适用场景与优缺点。此外,还深入分析了动态代理、Unsafe类等扩展知识及注意事项。最后总结最佳实践,建议根据业务需求选择合适方式,在灵活性与性能间取得平衡。
374 3
|
6月前
|
存储 缓存 Java
理解Java引用数据类型:它们都是对象引用
本文深入探讨了Java中引用数据类型的本质及其相关特性。引用变量存储的是对象的内存地址而非对象本身,类似房子的地址而非房子本身。文章通过实例解析了引用赋值、比较(`==`与`equals()`的区别)以及包装类缓存机制等核心概念。此外,还介绍了Java引用类型的家族,包括类、接口、数组和枚举。理解这些内容有助于开发者避免常见错误,提升对Java内存模型的掌握,为高效编程奠定基础。
276 0
|
6月前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
127 0
|
7月前
|
存储 算法 安全
Java对象创建和访问
Java对象创建过程包括类加载检查、内存分配(指针碰撞或空闲列表)、内存初始化、对象头设置及初始化方法执行。访问方式有句柄和直接指针两种,前者稳定但需额外定位,后者速度快。对象创建涉及并发安全、垃圾回收等机制。
Java对象创建和访问
|
9月前
|
Java
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
9月前
|
安全 Java
Object取值转java对象
通过本文的介绍,我们了解了几种将 `Object`类型转换为Java对象的方法,包括强制类型转换、使用 `instanceof`检查类型和泛型方法等。此外,还探讨了在集合、反射和序列化等常见场景中的应用。掌握这些方法和技巧,有助于编写更健壮和类型安全的Java代码。
470 17
|
8月前
|
存储 Java
Java中判断一个对象是否是空内容
在 Java 中,不同类型的对象其“空内容”的定义和判断方式各异。对于基本数据类型的包装类,空指对象引用为 null;字符串的空包括 null、长度为 0 或仅含空白字符,可通过 length() 和 trim() 判断;集合类通过 isEmpty() 方法检查是否无元素;数组的空则指引用为 null 或长度为 0。