java 从入门到精通

java 中 String == 原理 equals 和

2021-04-27  本文已影响0人  Exception_Cui
image.png
引用类型,==比较的是地址
String str1="abc" 相当于直接new 了一个string的对象,值在堆内存的字符串常量池
String str2="abc" 先是在字符串常量池里面寻找,如果有这个对象,那么直接就赋值给str2,
所以str1和str2的地址相同

char[] charArray={'a','b','c'}
现在堆里面创建一个char[]类型的对象,
String str3=new String(charArray),
在堆里面创建一个字符串的对象,然后将char类型转换为byte[],然后将地址给str3

String 是个引用类型,一旦定义是不可变得
String str1=“123”,
str1 ="234"  //相当于重新new了一个对象


== 和equals的区别

基本数据类型 == 比较的就是值
   
引用数据类型 或者对象
    重写了      equals   比较的就是值
    没有重写  equals   比较的还是地址

所以一般来讲 == 比较地址,equals比较值
int a =0;
int b=0
a==b;             true  基本数据类型 == 就是比较值

------------------------------------------------------
String str1="abc" ;
String str2="abc";
str1 == str2    true 引用数据类型 == 比较的就是地址(因为String 有个字符串常量池,所以这个值为true)

Persion p1= new Persion("张三");
Persion p2 =new Persion("张三"); 
p1 ==p2         false  == 比较的是地址
------------------------------------------------------

基本数据类型没有equals

String str1 = "abc";
String str2 = new String("abc");
str1 == str2                   false 此时两个地址不一样
str1.equals(str2)              true    //比较的是内容  原因是 String 重写了 equals 方法
 
Persion p1= new Persion("张三");
Persion p2 =new Persion("张三"); 
p1== p2                        false 此时两个地址不一样
p1.equals(p2)                  false   //没有重写 equals 还是比较的地址,查看object的源码
image.png image.png
上一篇 下一篇

猜你喜欢

热点阅读