String的面试题-==和equals

本文详细解析了Java中==与equals的区别,通过具体示例说明了两者在基本数据类型和引用数据类型中的不同表现,并深入探讨了字符串常量池对比较的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、首先对==和equals这两样做一个基本的认识。对于==,如果是基本数据类型,那么比较的就是其内容,如:int x=3,y=4,那么x==y的结果就是true。但是如果比较的是引用数据类型,那么比较的就是地址值是否相等。equals比较的是引用指向的内容是否相同。

2、先看一段程序,

    String s1 = new String("hello");
    String s2 = new String("hello");
    System.out.println(s1 == s2);
    System.out.println(s1.equals(s2));

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

    String s5 = "hello";
    String s6 = "hello";
    System.out.println(s5 == s6);
    System.out.println(s5.equals(s6));

首先还需要搞清楚String s1 = new String("hello")String s4 = "hello";这两个的区别,第一个创建了两个对象,在堆内存会创建对象的一片空间,而“hello”是存储在常量池里的。第二个只有在常量池里开辟了空间,并没有在堆内存中开辟空间。明白了这个问题,接下来的问题就好解决了。

  • 先分析s1和s2之间的比较,s1和s2都是通过new关键字创建出来的,他们在堆内存中创建出了两片地址空间,分别指向了s1和s2。所以==符号两边的地址不一样,所以为false。对于equals,因为创建了两个对象,虽然地址值不一样,但所指向的内容是一样的,所以equals的结果是true。

  • s3和s4之间,运用上面的解释,我们可以得出s3是创建了两个对象,s4只创建了一个对象,即在常量池里,所以地址值是不相同的,==的比较结果是false。但两个变量所指向的内容是相同的,所以equals的结果是true。

  • 对于s5和s6,因为都是用直接复制创建的字符串。首先s5在常量池里开辟了空间,栈内存中的s5就指向了常量池里的hello字符串,再创建s6的时候,先会去常量池里找,看有没有一样的字符串,如果有,就不用另外开辟空间,否则,就另外开辟空间。从程序中,可看出,创建的是一样的内容,那么就不会另外开辟空间,s6也直接指向了常量池里hello。所以,随后的这个==和equals的都是true。

最终程序打印的结果是:
false
true

false
true

true
true

### Java 中 `==` `equals()` 方法的区别 在 Java 编程语言中,`==` 操作符 `equals()` 方法用于不同的场景来比较两个实体。 对于基本数据类型,`==` 比较的是数值上的相等性。例如: ```java int a = 1; double b = 1.0; System.out.println(a == b); // 输出 true ``` 当涉及引用类型的比较时,情况有所不同。`==` 对于引用类型会检查两个引用是否指向同一个内存位置,即它们是否是指向同一对象的引用[^3]。 而 `equals()` 方法则更为灵活,默认情况下它继承自 `Object` 类,并且行为类似于 `==`,但是许多标准库类(比如 `String`, `Integer` 等)已经重写了此方法以便能够基于实际内容来进行有意义的对象间对比[^4]。 考虑如下例子展示两者的差异: ```java // 使用字符串作为演示 String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1 == str2); // false, 不同实例 System.out.println(str1.equals(str2)); // true, 内容相同 ``` 值得注意的是,在尝试调用像整数这样的原始类型上调用 `.equals()` 将导致编译错误,因为这些类型不是对象也没有定义该方法[^2]。 因此,在编写代码时应当注意区分何时应该使用哪一个操作符或函数,以确保程序按预期工作。 #### 总结 - **`==`:** - 基本数据类型:比较值。 - 引用类型:比较地址/引用。 - **`.equals()`:** - 默认实现如同 `==` (针对引用),但对于某些类已被改写为更合理的语义上的一致性测试。 - 应用于需要关注内部状态而非物理身份的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值