在JAVA中==和equals()的区别

想必我们大家在刚接触java进行if判断时经常使用"=="来判断两边是否相等,但随着String类型的加入,我们会发现String类型定义的对象进行"=="判定时不好用了,这时老师想必就会告诉你用equals()来对比,你尝试后发现好用也就这样用下去了,那么,你是否考虑过为什么String类型为什么不能用"=="吗,接下来我们来详细了解一些相关知识点。

一、java中的数据类型

在Java中数据类型可分为基本数据类型和引用数据类型,这个类型划分于其息息相关。

1.1基本数据类型

a.整数类型:byte 1个字节 short 2个 int 4个 long 8个字节

                    1个字节=8位         【整数默认都是int 类型】

b.浮点类型:float 4个字节   double 8个字节

                    小数点后6-7位   小数点后15-16位    【小数默认是double类型】

c.字符类型:char 2个字节

d.布尔类型:boolean 1位

1.2引用数据类型

除了以上8个,其余所有都是引用数据类型,包括但不限于String,数组等等

二.基本数据类型 和 引用数据类型 传值/存值 的区别

基本数据类型赋值的时候, 把变量值 复制一份, 赋值过去

引用数据类型在赋值的时候, 把变量地址 复制一份 ,赋值过去

基本数据类型传值(方法内修改不影响外部)

引用数据类型传引用地址(方法内修改对象会影响外部)

至于这两种类型赋值都存到哪里了,和内存相关,有兴趣的小伙伴可以自己查询一下。

三、==和equals()的区别

3.1 ==相关

“==”既可以用于基本数据类型,也可以用于引用数据类型,但是其内部工作原理却不同。

在比较基本数据类型的时候,“==”比较的是两边的值

在比较引用数据类型的时候,“==”比较的是两边的地址

3.1.1引用数据类型地址是否相同

1. 引用地址相同的条件,两个引用变量存储的地址相同 当且仅当它们指向同一个堆内存对象。

String s1 = "hello";          // s1 指向字符串常量池中的 "hello"
String s2 = s1;               // s2 和 s1 指向同一个对象
System.out.println(s1 == s2); // true(地址相同)

2. 引用地址不同的情况如果两个引用变量指向 不同的对象(即使内容相同),它们的地址也不同。

String s1 = new String("hello");  // 在堆中新建对象
String s2 = new String("hello");  // 另一个新对象
System.out.println(s1 == s2);     // false(地址不同)
System.out.println(s1.equals(s2)); // true(内容相同)

特殊情况字符串常量池,和内存相关,有兴趣可以自行了解。

String a = "hi";      // 常量池中的对象
String b = "hi";      // 复用常量池的同一对象
System.out.println(a == b); // true(地址相同)

3.2 equals()相关

仅限引用数据类型,默认比较地址,但也可以通过重写来判定值,如String,Integer等已重写,所以我们在日常使用的时候才没有比较地址,直接比较内部属性。

四、结语

编程是这样的,最开始看山是山,后来看山不是山,再后来我就不知道了,目前还在学习,欸嘿,好好学习吧各位,兴趣是最好的老师。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值