文章标题

来源:互联网 发布:网络话费卡怎么用 编辑:程序博客网 时间:2024/06/06 02:14

基本知识点:

                 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一样