皮皮网

【php服务器源码】【php 快递源码】【20秒源码】equals源码分析

2024-12-23 01:45:24 来源:微信企业 源码

1.String源码分析(1)--哈希篇
2.equals()和==到底有什么区别啊?
3.面试篇==和equals()区别、源码String线程安全问题(StringBuilder)
4..equals()到底是分析什么意思?
5.为什么我并未重写equals方法,equals和==的源码结果就已经不一样了?

equals源码分析

String源码分析(1)--哈希篇

       本文基于JDK1.8,从Java中==符号的分析使用开始,解释了它判断的源码是对象的内存地址而非内容是否相等。接着,分析php服务器源码通过分析String类的源码equals()方法实现,说明了在比较字符串时,分析应使用equals()而非==,源码因为equals()方法可以准确判断字符串内容是分析否相等。

       深入探讨了String类作为“值类”的源码特性,即它需要覆盖Object类的分析equals()方法,以满足比较字符串时逻辑上相等的源码需求。同时,分析php 快递源码强调了在覆盖equals()方法时也必须覆盖hashCode()方法,源码以确保基于散列的集合(如HashMap、HashSet和Hashtable)可以正常工作。解释了哈希码(hashcode)在将不同的输入映射成唯一值中的作用,以及它与字符串内容的关系。

       在分析String类的hashcode()方法时,介绍了计算哈希值的公式,包括使用这个奇素数的原因,以及其在计算性能上的优势。进一步探讨了哈希碰撞的概念及其产生的影响,提出了防止哈希碰撞的有效方法之一是扩大哈希值的取值空间,并介绍了生日攻击这一概念,解释了它如何在哈希空间不足够大时制造碰撞。20秒源码

       最后,总结了哈希碰撞与散列表性能的关系,以及在满足安全与成本之间找到平衡的重要性。提出了确保哈希值的最短长度的考虑因素,并提醒读者在理解和学习JDK源码时,可以关注相关公众号以获取更多源码分析文章。

equals()和==到底有什么区别啊?

       1、功能不同

       "=="是判断两个变量或实例是不是指向同一个内存空间。

       "equals"是判断两个变量或实例所指向的内存空间的值是不是相同。

       2、定义不同

       "equals"在JAVA中是一个方法。

       "=="在JAVA中只是一个运算符合。

       例子:

       Student student1 = new Student();

       Student student2 = new Student();

       System.out.println(student1.equals(student2));

       System.out.println(student1 == student2);

       3、急切网源码运行速度不同

       "=="比"equals"运行速度快,因为"=="只是比较引用。

       "equals"比"=="运行速度要慢。

扩展资料

       equals()方法特点:

       1、自反性:x.equals(x)返回true;

       2、对称性:若x.equals(y)为true,则y.equals(x)亦为true;

       3、传递性:若x.equals(y)为true且y.equals(z)也为true,则x.equals(z)亦为true;

       4、一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次、第三次、第n次调用也均为true,hdmi驱动源码前提条件是没有修改x也没有修改y;

       5、对于非空引用x,x.equals(null)永远返回为false。

       

参考资料:

百度百科-equals

面试篇==和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 并没有对方法进行加同步锁,所以是非线程安全的。

.equals()到底是什么意思?

       当我们在Java中使用".equals()"方法时,需要明确其行为并不像我们直观想象的那样比较对象内容。实际上,".equals()"比较的是对象的引用地址,这是由Java语言的内部机制决定的,而非程序员可以控制。如果一个类没有重写"equals()"方法,那么它默认比较的就是对象的内存地址,而非内容,即使对象的属性值相同,也可能返回false。

       然而,如果类已经重写了"equals()"方法,情况就有所不同。在这种情况下,".equals()"可能会比较对象的内容,但并非总是如此。例如,当我们尝试比较Integer对象a和Double对象b,尽管它们的数值相等,但执行a.equals(b)时返回的结果会是false,因为Integer和Double是不同的类,即使值相同,它们在内存中的地址不同,所以默认的equals()方法会比较地址而不是值。

       因此,要理解".equals()"的真正行为,关键在于查看类是否重写了这个方法,并理解其具体的实现。不重写时,它比较的是地址;重写后,可能比较的是内容,但具体取决于重写代码的逻辑。查看相关类的源码是确定equals()行为的关键步骤。

为什么我并未重写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,因为引用的地址是一样的,内容必然一样。