1.面试篇==和equals()区别、源码String线程安全问题(StringBuilder)
2.String源码分析(1)--哈希篇
3.为什么我并未重写equals方法,源码equals和==的源码结果就已经不一样了?
4.java中while()语句:为什么不能用a==b ,却可以用a.equals(b)?!源码!源码!源码gdb查看ios源码
面试篇==和equals()区别、源码String线程安全问题(StringBuilder)
equals(值相等) ==(引用相等)
equals源代码中可以看到:
JDK自带的源码equals有两种,针对Object对象及String对象
1、源码String中的源码equals
==判断是否相等,相等直接返回true->再判断是源码否为string类型,否直接返回false->是源码则继续判断对象length->循环判断char是否相等(jdk8使用的是char,高版本的源码jdk已使用效率更高的byte)
2、Object中的源码equals
直接return (this == obj),一般业务对象比较要改造equals方法
p.s.自定义对象需要重写equals
二、源码String线程安全问题
String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、网易云任务源码append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
String源码分析(1)--哈希篇
本文基于JDK1.8,从Java中==符号的使用开始,解释了它判断的Linux导出java源码是对象的内存地址而非内容是否相等。接着,通过分析String类的equals()方法实现,说明了在比较字符串时,应使用equals()而非==,因为equals()方法可以准确判断字符串内容是否相等。
深入探讨了String类作为“值类”的特性,即它需要覆盖Object类的equals()方法,以满足比较字符串时逻辑上相等的需求。同时,强调了在覆盖equals()方法时也必须覆盖hashCode()方法,偷源码判几年以确保基于散列的集合(如HashMap、HashSet和Hashtable)可以正常工作。解释了哈希码(hashcode)在将不同的输入映射成唯一值中的作用,以及它与字符串内容的关系。
在分析String类的hashcode()方法时,介绍了计算哈希值的公式,包括使用这个奇素数的原因,以及其在计算性能上的优势。进一步探讨了哈希碰撞的概念及其产生的影响,提出了防止哈希碰撞的mallplus作者卖源码有效方法之一是扩大哈希值的取值空间,并介绍了生日攻击这一概念,解释了它如何在哈希空间不足够大时制造碰撞。
最后,总结了哈希碰撞与散列表性能的关系,以及在满足安全与成本之间找到平衡的重要性。提出了确保哈希值的最短长度的考虑因素,并提醒读者在理解和学习JDK源码时,可以关注相关公众号以获取更多源码分析文章。
为什么我并未重写equals方法,equals和==的结果就已经不一样了?
一张简图讲解当使用==为false就是因为创建的是两个对象,在堆内存中是两个不一样的地址,对于引用类型,==只是比较引用地址是否一样,这里显然0x不等于0x
但通过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;
}
比较的是内容是否一样。一样所以是ture
但如果String s1 = "abc";
String s2 = "abc";
使用==结果就是true,因为引用的地址是一样的,内容必然一样。
java中while()语句:为什么不能用a==b ,却可以用a.equals(b)?!!!
呵呵,这是一个JAVA基础问题,“==”如果用来比较基本类型,如int、float、boolean类型的时候,是比较值,而在比较其它类的时候,都是比较类对象的内存地址,就如你现在这种情况。
answer是一个String对象,“y”也是一个Stirng对象,虽然它们的值一样,但是他们的内存地址是不同的,所以输出结果是false。
而你调用String对象的equals方法,它会按该String对象的值进行比较,所以返回就是true了,你要是感兴趣的话你可以看一下String对象的equals方法的源代码,它重载Object对象的equals方法。
2024-11-19 00:24
2024-11-18 23:55
2024-11-18 23:48
2024-11-18 23:37
2024-11-18 22:45
2024-11-18 22:20
2024-11-18 22:04
2024-11-18 21:51