公司网站域名更改怎么做,微信网站建设app公司,公司品牌策划设计,网站开发 数据库1. 区别 
“”操作符用于比较两个对象的地址是否相等。.equals() 方法用于比较两个对象的内容是否相等。 
Object 类的 .equals() 方法默认采用的是“”操作符进行比较。假如子类没有重写该方法的话#xff0c;那么“”操作符和 .equals() 方法的功效就完全一样——比较两个对…1. 区别 
“”操作符用于比较两个对象的地址是否相等。.equals() 方法用于比较两个对象的内容是否相等。 
Object 类的 .equals() 方法默认采用的是“”操作符进行比较。假如子类没有重写该方法的话那么“”操作符和 .equals() 方法的功效就完全一样——比较两个对象的内存地址是否相等。 
但实际情况中有不少类重写了 .equals() 方法因为比较内存地址的要求比较严格不太符合现实中所有的场景需求。拿 String 类来说我们在比较字符串的时候的确只想判断它们俩的内容是相等的就可以了并不想比较它们俩是不是同一个对象。 
况且字符串有字符串常量池的概念本身就推荐使用 String s  “字符串” 这种形式来创建字符串对象而不是通过 new 关键字的方式因为可以把字符串缓存在字符串常量池中方便下次使用不用遇到 new 就在堆上开辟一块新的空间。 
2. .equals()源码 
public boolean equals(Object anObject) {if (this  anObject) {return true;}if (anObject instanceof String) {String aString  (String)anObject;if (coder()  aString.coder()) {return isLatin1() ? StringLatin1.equals(value, aString.value): StringUTF16.equals(value, aString.value);}}return false;
} 
首先如果两个字符串对象的可以“”那就直接返回 true 了因为这种情况下字符串内容是必然相等的。否则就按照字符编码进行比较分为 UTF16 和 Latin1差别不是很大就拿 Latin1 的来说吧。 
HotSpotIntrinsicCandidate
public static boolean equals(byte[] value, byte[] other) {if (value.length  other.length) {for (int i  0; i  value.length; i) {if (value[i] ! other[i]) {return false;}}return true;}return false;
} 
这个 JDK 版本是 Java 17也就是最新的 LTS长期支持版本。该版本中String 类使用字节数组实现的所以比较两个字符串的内容是否相等时可以先比较字节数组的长度是否相等不相等就直接返回 false否则就遍历两个字符串的字节数组只有有一个字节不相等就返回 false。 
这是 Java 8 中的 equals 方法源码 
public boolean equals(Object anObject) {// 判断是否为同一对象if (this  anObject) {return true;}// 判断对象是否为 String 类型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;
} 
JDK 8 比 JDK 17 更容易懂一些首先判断两个对象是否为同一个对象如果是则返回 true。接着判断对象是否为 String 类型如果不是则返回 false。如果对象为 String 类型则比较两个字符串的长度是否相等如果长度不相等则返回 false。如果长度相等则逐个比较每个字符是否相等如果都相等则返回 true否则返回 false。 “如果要进行两个字符串对象的内容比较除了 .equals() 方法还有其他两个可选的方案。” 
1Objects.equals() 
Objects.equals() 这个静态方法的优势在于不需要在调用之前判空。 
public static boolean equals(Object a, Object b) {return (a  b) || (a ! null  a.equals(b));
}如果直接使用 a.equals(b)则需要在调用之前对 a 进行判空否则可能会抛出空指针 java.lang.NullPointerException。Objects.equals() 用起来就完全没有这个担心。 
Objects.equals(小萝莉, new String(小  萝莉)) // -- true
Objects.equals(null, new String(小  萝莉)); // -- false
Objects.equals(null, null) // -- trueString a  null;
a.equals(new String(小  萝莉)); // throw exception2String 类的 .contentEquals() 
.contentEquals() 的优势在于可以将字符串与任何的字符序列StringBuffer、StringBuilder、String、CharSequence进行比较。 
public boolean contentEquals(CharSequence cs) {// Argument is a StringBuffer, StringBuilderif (cs instanceof AbstractStringBuilder) {if (cs instanceof StringBuffer) {synchronized(cs) {return nonSyncContentEquals((AbstractStringBuilder)cs);}} else {return nonSyncContentEquals((AbstractStringBuilder)cs);}}// Argument is a Stringif (cs instanceof String) {return equals(cs);}// Argument is a generic CharSequenceint n  cs.length();if (n ! length()) {return false;}byte[] val  this.value;if (isLatin1()) {for (int i  0; i  n; i) {if ((val[i]  0xff) ! cs.charAt(i)) {return false;}}} else {if (!StringUTF16.contentEquals(val, cs, n)) {return false;}}return true;
}从源码上可以看得出如果 cs 是 StringBuffer该方法还会进行同步非常的智能化如果是 String 的话其实调用的还是 equals() 方法。当然了这也就意味着使用该方法进行比较的时候多出来了很多步骤性能上有些损失。 
同样来看一下 JDK 8 的源码 
public boolean contentEquals(CharSequence cs) {// argument can be any CharSequence implementationif (cs.length() ! value.length) {return false;}// Argument is a StringBuffer, StringBuilder or Stringif (cs instanceof AbstractStringBuilder) {char v1[]  value;char v2[]  ((AbstractStringBuilder)cs).getValue();int i  0;int n  value.length;while (n-- ! 0) {if (v1[i] ! v2[i])return false;i;}return true;}// Argument is a Stringif (cs.equals(this))return true;// Argument is a non-String, non-AbstractStringBuilder CharSequencechar v1[]  value;int i  0;int n  value.length;while (n-- ! 0) {if (v1[i] ! cs.charAt(i))return false;i;}return true;
}同样更容易理解一些首先判断参数长度是否相等不相等则返回 false。如果参数是 AbstractStringBuilder 的实例则取出其 char 数组遍历比较两个 char 数组的每个元素是否相等。如果参数是 String 的实例则直接调用 equals 方法比较两个字符串是否相等。如果参数是其他实现了 CharSequence 接口的对象则遍历比较两个对象的每个字符是否相等。