java中String类的equals()、==及hashcode()

来源:互联网 发布:origin拟合数据 编辑:程序博客网 时间:2024/05/01 19:46

首先是  ==   ,我们有时候用这个来判断2个东西是否相等,这里指的是引用地址是否相等。

String s1 = "Programming";

String s2 = new String("Programming");
String s5 = "Program" + "ming";
System.out.println(s1==s2);//==是比较地址,s2这边是new出来的一块空间所以不等
System.out.println(s1==s5);
上面这段代码,运行之后输出的结果是false,true。

s1在创建的过程之中,经历了下面几个步骤:

(1)先定义一个名为s1的对String类的对象引用变量:String s1;(2)在栈中查找有没有存放值为"Programming"的地址,如果没有,则开辟一个存放字面值为"Programming"的地址,接着创建一个新的String类的对象o,并将o 的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"Programming"的地址,则查找对象o,并返回o的地址。所以当栈中存在你想创建的变量的值的时候,其实是引用已经存在栈中的地址,不是新建的。(3)将s1指向对象o的地址。
来自百度知道

s2在创建的时候,写了new,所以jvm给他重新开辟了一块内存,就不会和前面那个得地址一样,所以s1和s2不等

s5创建的时候就是指向了对象o的地址,所以s1和s5是相等的。


然后是equals()

我们可以看下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;    }
String里面是先判断2个的地址是不是相同,如果2个对象引用的地址是相同的,则直接返回true。如果引用不同,可以判断里面的字符串是不是相等。

关于hashCode()

public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;    }

String是给所有的对象都赋了一个值,jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。

从代码中可以看出如果字符串是“abc”,算出来的值就是 31*(31*(31*0+a)+b)+c ==》a*31^2+b*31^1+c*31^0

相当于某个数值往左移5位,然后减去自身。


注意一下,如果equals()要相等,那么hashCode()肯定要相等。




0 0
原创粉丝点击