Java基础
1.JDK 和 JRE 的区别
A. JDK:java Development Kit的简称,即java开发工具包,提供Java的开发环境和运行环境。
B. JRE:Java Runtime Environment的简称,即Java运行环境,为Java的运行提供了所需环境。
总结:具体来说JDK其实包含了JRE,同时还包含了编译器(javac),还包含了很多Java程序试调和分析工具。
2. == 和 equals 的区别
A. ==
对于基本类型和引用类型 == 的作用效果是不同的
eg:
基本数据类型:比较的是值是否相同
引用数据类型:比较的是引用是否相同
String x = "Hello";
String y = "Hello";
String z = new String("Hello");
//true
System.out.println(x == y);
//false
System.out.println(x == z);
//true
System.out.println(x.equals(y));
//true
System.out.println(x.equals(z));
解析:x 和 y 指向的同一个引用,所以 == 也是 true
new String()方法则是重新开辟了内存空间,所以 == 结果是 false
equals比较的一直是值,so 结果都是 true。
B. equals
equals本质就是 == ,不过 String 和 Integer 等重写了 equals 方法,从而变成了值的比较。
eg:
其结果为 false,则说明其本质就是 ==
其源码为:
public boolean equals(Objeect obj){
return (this == obj);
}
到这里,我们发现两个相同值的 String 对象,为何会返回 true 呐?
String t1 = new String("你好");
String t2 = new String("你好");
//true
System.out.println(t1.equals(t2));
同样的,进入 String 和 equals 方法中:
eg:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
从而可以看出 String 重写了 Object 的 equals 方法,其引用比较变成了值比较!
总结:
= = 对于基本类型来说是值的比较,对于引用类型来说是引用的比较。
equals 默认是比较引用,但很多类会重写其 equals 方法,
eg:String,Integer 等重写 equals 方法,从而引用比较变成了值的比较
因此,一般情况下 equals 比较的是值是否相等。