Java中String推断相等equals与==的差别以及StringBuilder的equals
Java中String类型具有一个equals的方法能够用于推断两种字符串是否相等,可是这样的相等又与运算符==所推断的“相等”有所不同,接下来进行分析,结论由程序进行验证
String的equals函数仅仅要两个字符串“看起来”相等,就能够返回true,“看起来”相等意思指的是,当两个字符串对象所存放的内容同样时,不须要存放的内存地址同样,可是==推断则仅仅有当推断的两个变量所使用的内存地址为同样时才返回true。比如有两个长得一模一样的双胞胎A,B,若使用A==B来推断会返回false。使用A.equals(B)则会返回true。
我们能够看object中的equals函数的源代码为
public boolean equals(Object obj) {
return (this == obj);
}
我们知道Java中全部的对象都默认继承自Object类。所以当我们没有重写equals的方法时,若使用equals来推断两个对象的是否相等时。仅仅有这两个对象指向的是同一个内存地址时。才会返回true,否则即使内容全然同样但在内存中是两个不同的内存地址也是返回false,此时若用双胞胎A,B来对照。A==B与A.equals(B)返回的都是false。
既然如此,那String的equals与==为什么会不一样呢,这里我们要看一下String中重写equals的源代码:
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中的equals函数首先推断其内存地址是否为同一个:
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;
}
}
当我们使用字符串连接--连接方式一般为+或concat("substring")--的方式创建字符串时,都会构建一个新的String对象。即在内存中开辟一个新的地址来存放,所以这个时候即使内容同样。用==推断的话,也是返回false;当我们使用等号赋值时,若内存中有该字符串。则该变量指向此内存地址二不是又一次创建一个,所以此时用==时会返回true,我们看一下例程:
public class StringTest01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String hello="hello";
String hel1=hello;
String hel2="hel";
String hel3=hel2+"lo";
String hel4=hel2.concat("lo");
System.out.println(hello);
System.out.println(hel1);
System.out.println(hel3);
System.out.println(hel4);
//==等号測试
System.out.println(hello==hel1);
System.out.println(hello==hel3);
System.out.println(hello==hel4);
System.out.println(hel3==hel4);
//equals函数測试
System.out.println(hello.equals(hel1));
System.out.println(hello.equals(hel3));
System.out.println(hello.equals(hel4));
System.out.println(hel3.equals(hel4));
//StringBuilder測试
StringBuilder helloBuilder = new StringBuilder("hel");
System.out.println(helloBuilder.equals(hel2));
}
}
其输出结果为:
最后一个StringBuilder的測试我们发现尽管使用equals来推断,可是返回的是false。这是为什么呢?
首先。当我们使用StringBuilder创建对象时。肯定会在内存中开辟一个新的专属的地址用于存放对象内容。可是即使StringBuilder中存放的内容与其它字符串的内容同样,使用equals来推断也是返回false,这是由于StringBuilder并没有重写equals函数。即StringBuilder的equals为:
public boolean equals(Object obj) {
return (this == obj);
}
所以会返回false。
Java中String推断相等equals与==的差别以及StringBuilder的equals的更多相关文章
- Java中string 创建对象时 “”和null的差别
null和""的差别 问题一: null和""的差别 String s=null; string.trim()就会抛出为空的exception String s ...
- 关于==和equals()方法&Java中string与char如何转换&String,StringBuffer
1.对于基本数据类型,可以直接使用==和!=进行内容比较 如:int x=30; int y=30; x==y; //true 基本数据类型 简单类型(基本类型) bo ...
- 【转载】 Java中String类型的两种创建方式
本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...
- Java中String类的特殊性
java中特殊的String类型 Java中String是一个特殊的包装类数据有两种创建形式: String s = "abc"; String s = new String(&q ...
- java中string内存的相关知识点
(一):区别java内存中堆和栈: 1.栈:数据可以共享,存放基本数据类型和对象的引用,其中对象存放在堆中,对象的引用存放在栈中: 当在一段代码块定义一个变量时,就在栈中 为这个变量分配内存空间,当该 ...
- java中String的相等比较
首先贴出测试用例: package test; import org.junit.Test; /** * Created by Administrator on 2015/9/16. * */ pub ...
- Java中String类的方法及说明
String : 字符串类型 一. String sc_sub = new String(c,3,2); // String sb_copy = new String(sb) ...
- java中String类型变量的赋值问题
第一节 String类型的方法参数 运行下面这段代码,其结果是什么? package com.test; public class Example { String str = new String( ...
- java中String的常用方法
java中String的常用方法1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len= ...
随机推荐
- 3.SOAP和WSDL的一些必要知识
转自:https://www.cnblogs.com/JeffreySun/archive/2009/12/14/1623766.html SOAP和WSDL对Web Service.WCF进行深入了 ...
- 3.字符设备驱动------Poll机制
1.poll情景描述 以之前的按键驱动为例进行说明,用阻塞的方式打开按键驱动文件/dev/buttons,应用程序使用read()函数来读取按键的键值. ) { read(fd, &key_v ...
- Scala——构造函数
Scala的构造函数分为主构造函数和辅助构造函数. 辅助构造函数 辅助构造函数比较容易理解,它们同C++和Java的构造函数十分类似,只有两处不同: 1.辅助构造函数的名称为this,这主要是考虑到在 ...
- CISP/CISA 每日一题 15
CISA 每日一题(答) 作业记帐: 监控和记录信息系统资源的使用,这些信息可被信息系统审计师用来执行: 1.将资源使用和相关用户挂钩以便实行计费: 2.通过改变系统软件的默认设置来最优化硬件性能 作 ...
- C++ 学习路线推荐
相信有非常大一部分学计算机的童鞋都是靠自学,即使本身是计算机专业的同学,也会认为只通过课堂上的学习是远远不够的,并且在上课时所用到的教材也不够好.然而自学的时候有个非常大的问题就是找不到合适的 ...
- css中的!important作用
css中的!important作用 一.总结 1.!important:是hack, 2.!important作用:让浏览器首选执行这个语句,当对同一个对象设置了多个同类型的属性的时候,首选执行这一个 ...
- 1. vue环境搭建和配置
const 相对于 var # 全局安装 vue-cli install可以简写成i 1.$ npm install --global vue-cli # 创建一个基于 webpack 模板的新项 ...
- 给已有数据的oracle表建立外键关系
PS:这里是给自己做个备忘,下次遇到同类问题的时候,方便查找: 客户在有主外键关系的2张表进行页面删除时报错已有子记录,运维后台处理的时候应该找出相应的数据,先删除子记录,在删主表记录:但客户要的急, ...
- Python编写Appium测试用例(1)
有段时间没有使用python编写测试用例了,很长时间以来,感觉appium这个测试工具确实不错,今天又重新拿起来,分享一下自己学习的一些用例,欢迎大家一起交流.学习! 1.登录客户端 #coding= ...
- 关于CSDN2013博客之星的一些看法
最近一个周,最火的话题当然要数CSDN2013博客之星拉票了. 实话实说,从12月14日开始,我连续5天拉票. 通过QQ群.QQ好友.CSDN文章.给CSDN粉丝发私信等多种方式拉票,真是累死我了. ...