java编程贴纸问题_【随笔】java编程中需要注意的几个小问题

本文详细探讨了Java中字符串和对象比较的深究,重点在于`==`和`.equals()`的区别,以及运行时常量池在字符串比较中的作用。通过实例展示了为何`s1==s2`返回true,而`s3==s4`和`s1.equals(s2)`与`s3.equals(s4)`的结果不一致,并解释了equals方法在对象比较中的行为。
摘要由CSDN通过智能技术生成

1.变量的比较

1 public static voidmain(String[] args) {2 String s1 ="hello";3 String s2 ="hello";4

5 String s3 = new String("hello");6 String s4 = new String("hello");7

8 System.out.println(s1==s2);9 System.out.println(s1.equals(s2));10

11 System.out.println(s3==s4);12 System.out.println(s3.equals(s4));13

14

15 Student st1=new Student("stu01",20,"male",85);16 Student st2=new Student("stu01",20,"male",85);17

18 System.out.println(st1==st2);19 System.out.println(st1.equals(st2));20

21 }

执行的结果为:

true

true

false

true

false

false

首先看System.out.println(s3==s4);为什么这句话返回false

java中的==对于基本数据类型而言,比较的是他们的值,而对于复合数据类型而言,比较的则是他们的地址,也就是说==其实是比较的两个引用。在本例中,s3对象和s4对象在内存中的不同位置,因此s3==s4返回false

那么为什么System.out.println(s1==s2);返回的则是true呢?因为在java虚拟机中,还有方法区的一部分叫做运行时常量池,而这里的“hello”就是存在于这一部分内存中,其中我们对“hello”进行引用,也就是说,这里的s1和s2都是常量池中的同一个“hello”的引用,那么s1==s2则返回的便是true。

那么System.out.println(s3.equals(s4));和System.out.println(st1.equals(st2));为什么一个返回true而一个返回false呢?

String中的equals比较的是字符串的值是否相等,s3和s4都是hello,所以返回的是true,那么System.out.println(st1.equals(st2));为什么返回的却是false呢?

我们都知道,所有的对象都继承自object对象,当然的,如果类中没有重写equals方法,那么我们所调用的其实也就是object中的equals方法。而在object类中的equals方法,其实也是用==实现的,所以这里的System.out.println(st1.equals(st2));也是对st1和st2的引用进行比较,所以返回的依旧是fasle。

2.

1 public static voidmain(String[] args) {2 double d=2.0;3 double f=1.1;4

5 if(Math.abs(d-f-0.9)<1e-6){6 System.out.println("YES!");7 }else{8 System.out.println("NO!");9 }10

11 System.out.println((2.0-1.1)==0.9);12

13 System.out.println(d-f);14

15 }

未完待续。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值