java中String类的equals()、==及hashcode()
来源:互联网 发布:origin拟合数据 编辑:程序博客网 时间:2024/05/01 19:46
首先是 == ,我们有时候用这个来判断2个东西是否相等,这里指的是引用地址是否相等。
String是给所有的对象都赋了一个值,jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。
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
- java中String类的equals()、==及hashcode()
- java基础 equals与==区别,String的hashcode
- Java中的==, equals()及hashCode()
- Java中String类hashCode()和equals()问题
- Java 中"=="、equals、hashcode相关
- Java中== equals hashcode浅析:
- java中==、equals()、hashCode()
- 弄懂java中”==“、”equals“、”hashcode“
- Java中== equals hashcode解析
- Java中==、equals()、hashCode()区别
- 理解java中==、equals()、hashCode()
- java中==、equals和hashCode的分析
- Java中equals方法、==和hashCode的区别
- Java中==、equals()和hashCode()的比较分析
- java中equals,hashcode和==的区别
- 看Java中==、equals、hashCode的来龙去脉
- java中equals,hashcode和==的区别
- java中“==”、equals和hashCode的区别
- 进程和线程的区别
- 深入分析HBase Compaction机制
- Matlab与线性代数 -- 均匀分布的随机矩阵
- 【网络流24题】运输问题
- Mongo基本使用
- java中String类的equals()、==及hashcode()
- Java 多线程 优先级队列 PriorityBlockingQueue
- 安装APK的错误码(PackageManager.java)
- Google gson解决不知道json中的内容是什么类型的处理
- mysql体系结构 &&& Mysql Innodb小结
- linux 下apache 及php配置
- hackerrank Hourrank16题解
- 子类屏蔽父类的方法
- 优秀博客 rxjava