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

时间:2021-05-02 06:52:36

1.变量的比较

 1 public static void main(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 void main(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     }

 

 

未完待续。。。。