想必我们大家在刚接触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等已重写,所以我们在日常使用的时候才没有比较地址,直接比较内部属性。
四、结语
编程是这样的,最开始看山是山,后来看山不是山,再后来我就不知道了,目前还在学习,欸嘿,好好学习吧各位,兴趣是最好的老师。

3万+

被折叠的 条评论
为什么被折叠?



