当前位置: 首页 > news >正文

呼家楼做网站的公司bt搜索引擎下载

呼家楼做网站的公司,bt搜索引擎下载,做电子杂志的网站,江苏网站制作企业1. 区别 “”操作符用于比较两个对象的地址是否相等。.equals() 方法用于比较两个对象的内容是否相等。 Object 类的 .equals() 方法默认采用的是“”操作符进行比较。假如子类没有重写该方法的话,那么“”操作符和 .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() 方法,还有其他两个可选的方案。”

1)Objects.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 exception

2)String 类的 .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 接口的对象,则遍历比较两个对象的每个字符是否相等。

http://www.dinnco.com/news/7247.html

相关文章:

  • 海宁市住房和城乡建设网站企业在线培训平台
  • wordpress 微信编辑器插件下载泉州seo培训
  • 网站 动态网络营销有哪些推广方式
  • 兰州做网站哪家专业杭州seo网站
  • 做外贸免费发布产品的网站域名停靠
  • 地税局网站怎么做变更能打开各种网站的搜索引擎
  • 网站建设人员职责分布在线一键建站系统
  • 沧县做网站价格百度指数名词解释
  • 网上做任务佣金高的网站网络营销形式
  • 网站目录结构图长沙关键词优化推荐
  • 合肥seo管理广州网站优化费用
  • 网站如何做中英文效果推广赚钱的软件
  • php网站开发的发展前景三只松鼠营销案例分析
  • 美仑-专门做服装的网站网站seo关键词优化
  • 装修公司做宣传在哪个网站b站新人视频怎么推广
  • 做网站用的插件磁力宝
  • 可以用什么做网站登录页面搜索引擎优化关键词
  • 设计一个官方网站推广广告优化方法
  • 课程网站建设目标任务合肥搜索引擎推广
  • 做数学网站一键免费创建论坛网站
  • 建站快车的优点315影视行业
  • wordpress自动推送给百度泰安seo网络公司
  • 青岛网站排名优化武汉网站开发公司
  • 找建设网站公司哪家好网络推广的目标
  • wordpress 怎么设置主页seo排名技术教程
  • 运动器材网站建设品牌推广方案怎么写
  • 帮人做钓鱼网站以及维护重庆seo技术博客
  • 中国跨境电商前三名深圳搜索优化排名
  • 天津网站建设icp备适合成人参加的培训班
  • 网站建设之织梦后台熊掌号主页济南新站seo外包