基本知识点:
1、基本数据类型:byte、short、int、long、float、double、char、boolean
2. 引用数据类型:接口interface、类class、数组
3. java内存模型理解:http://www.importnew.com/19612.html
4. String基本知识理解:http://www.cnblogs.com/ITtangtang/p/3976820.html
5. java堆内存和栈内存:http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html
比较:
1、如果是比较基本数据类型那么只能够使用 == 。
2、引用类型比较:
class Value{
int i;
}
class ValueTest{
public static void main(String[] args) {
String s1 = “123”;
String s2 = “123”;
String s3 = “1234”;
String s4 = new String(“1234”);
String s5 = new String(“1234”);
StringBuffer s6 = new StringBuffer(s4);
StringBuffer s7 = new StringBuffer(“1234”);
System.out.println(s1 == s2);//true
System.out.println(s1.equals(s2));//true
System.out.println("1**********************");
System.out.println(s1 == s3);//false
System.out.println(s1.equals(s3));//false
System.out.println("2**********************");
System.out.println(s3 == s4);//false
System.out.println(s3.equals(s4));//true
System.out.println("3**********************");
System.out.println(s4 == s5);//false
System.out.println(s4.equals(s5));//true
System.out.println("4**********************");
System.out.println(s6 == s7);//false
System.out.println(s6.equals(s7));//false
System.out.println("5**********************");
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));//false
System.out.println(v1 == v2);//false
System.out.println("6**********************");
}
}
true
true
1**********************
false
false
2**********************
false
true
3**********************
false
true
4**********************
false
false
5**********************
false
false
6**********************
解释:
String的equals方法重写了继承Object的equals方法
Object源代码:
public boolean equals(Object obj) {
return (this == obj);
}
String源代码:
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;
}
根据代码可以知道Object的equals方法比较的对象的引用地址是否相同(是否是同一对象的引用),String类首先会判断是否是对象,如果是判断是否是同一对象的引用,付过是字符串,则会判断字符串的每一个字符是否相等返回结果值
java内存分为堆内存和栈内存,堆内存主要存储基本数据类型变量和对象的引用变流量,栈内存主要存储由new创建的对象和数组等。
String创建解释:
String OK1 = new String("ok");(1)
String OK2 = "ok";(2)
(1)会创建一个对象( new String(“ok”) )存储在堆内存中,和一个指向对象的引用OK1 存储在栈内存中。
(2)首先会在字符串常量池里面查看是否有 ok 这个字符串,如果没有就会在常量池里面添加进去,如果有就不会添加而是将引用指向已经存在的字符串
在1那里因为s1在字符串常量池创建了字符串 123 所以 s2就不会在创建而是指向已经创建的。
在2那里 就不用解释了吧
在3那里 == 那里地址不同所以是false, equals比较的是值,所以是true
在4那里因为是创建了两个对象,所以== 肯定不相同为false, 因为内容相同,所以equals为true
在5那里StringBuffer没有重写equals方法。所以 == 和 equals 方法都是比较的地址,两个对象的地址肯定不相同,所以是false
在6那里同5一样