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 }
未完待续。。。。