初识String类中的toString()和equals()
程序员文章站
2022-04-15 23:20:27
一、String类中的equals()方法①String类重写equals()的源代码长什么样?public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject;...
String类是被final修饰的,是不可被继承的。
String类底层是基于char数组的。
一、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;
}
②比较字符串相等,用equals(),不能用"==",String不是基本数据类型,是引用数据类型
1."=="比较引用数据类型,比较的是地址是否相等
2.=="比较基本数据类型,比较的是值是否相等
3.equals()比较引用数据类型,默认的也是比较地址是否相等
4.【注意】String类重写了equals方法,比较的是内容是否相同。
//String是一个引用数据类型
//创建字符串对象
String s1 = "yourenA";
String s3 = new String("yourenA");
System.out.println(s1==s3);//false
System.out.println(s1.equals(s3));//true
③ String s1 = "hhh";和String s1 = new String("hhh");在内存中的区别
一、String s1 = "hhh";
1.在编译期,JVM会去常量池查找是否存在"hhh"
2.如果不存在,就在常量池开辟一个空间来存储"hhh",把地址赋给栈指针
3.如果存在,就不用开辟新的空间,直接把地址赋给栈指针
4.然后在栈内存中开辟一个名为s1的空间,来存储"hhh"在常量池中的地址
总结:因此无论是"=="还是equals()判断都相等,==:因为在常量池中只有一份内存空间,地址全部相同。
//以下方法创建字符串对象,可能创建了一个对象,也可能一个对象也没有创建
String s1 = "hhh";
String s2 = "hhh";
System.out.println(s1 == s2);//true
System.out.println(s1.equals(s2));//true
二、String s1 = new String("hhh");
1.在编译期,JVM会去常量池查找是否存在"hhh"
2.如果不存在,就在常量池开辟一个空间来存储"hhh"
3.如果存在,就不用开辟新的空间
4.在运行期,通过String的构造器在堆内存中new了一个新的空间(new Sring("hhh"))
5.然后将常量池中的"hhh"复制一份到该堆内存的空间中
6.在栈内存中开辟一个名为s1的空间,存放堆内存中新空间的地址
总结:只要是new String(),则,栈中的地址都是指向最新new出来的堆中的地址,"=="判断的是地址,当然不等的。
至于equals,String类重写了equals,判断内容是否相同,明显相同,因此equals是相等的。
//以下方法创建字符串对象,至少创建了一个对象,也可能创建两个对象
String s3 = new String("yyy");
String s4 = new String("yyy");
System.out.println(s3 == s4);//false
System.out.println(s3.equals(s4));//true
二、String类中的toString()方法
①String类重写toString()的源代码长什么样?
public String toString() {
return this;
}
②代码
String s1 = "yourenA";
//String类已经重写了toString方法
System.out.println(s1.toString());//yourenA
//打印是自动调用对象的toString()方法
System.out.println(s1);//yourenA
本文地址:https://blog.csdn.net/weixin_43486332/article/details/107354534
推荐阅读
-
JavaSE的包装类,自动装箱和自动拆箱 ,字符窜转换,toString(),equals(), hashCode()的区别
-
Java的String类中的startsWith方法和endsWith方法
-
【Java】请解释String类“==”和“equals”的区别
-
初识String类中的toString()和equals()
-
PAI中的Object类、toString、equals方法
-
Java:object类 中常用equals()和 toString()方法的重写
-
java类中的equals、hashCode和toString方法
-
Object最高父类的方法应用 equals和toString
-
Java中替代equals,compareTo和toString的方法
-
java实体类中equals和hashCode方法的重写