Java Development Kit(JDK)—— Java 开发工具包
Java Runtime Environment(JRE)—— Java 运行环境
javac —— Java 源码编译器
- JDK:提供了 Java 开发环境和运行环境。
- JRE:提供了 Java 运行的环境
JDK 其实包含了 JRE ,以及 javac、Java 程序调试和分析工具。
只需运行 Java 程序 JRE 就够了,若要编写 Java 程序就需要 JRK。
对于基本类型和引用类型 == 的作用效果是不一样的。
- 基本类型:比较值是否相同
- 引用类型:比较引用是否相同
String x = "String";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
因为 x,y 指向同一个引用,因此 == 为 true,但 new String() 方法则重写并开辟了内存空间,因此 == 为 false;而 equals 一直是比较值,所以为 true。
equals 本质上是 ==,像是String 和Integer 等是重写了 equals 方法的,将它变成了值得比较。
class Cat {
private String name;
public Cat(String name) { this.name = name; }
public void setName(String name) { this.name = name; ]
}
String e = new String("GG");
String d = new String("GG");
System.out.println(e.equals(d)); // true
Cat c1 = new Cat("MM");
Cat c2 = new Cat("MM");
System.out.println(c1.equals(c2)); // false
为什么前者是 true 而后者是 false?怎么回事?去看一下 equals 源码。
public boolean equals(Object obj) { return (this == obj); }
这证实了前面说的 equals 本质上是 ==,那为何会出现上面的情况?去 String 的 equals() 方法看一下。
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)
return false;
i++;
}
return true;
}
}
return false;
}
原来是 String 重写了 Object 的 equals()方法,将引用比较改成了值比较。
也就是说==对于基本类型是值比较,对于引用类型是引用比较;
equals默认是引用比较,但许多类将 equals()方法重写了,将它变成了值的比较,因此一般情况下equals是值的比较。
其实还有数值的比较,先去搜看一下,后续更新。



