首页
IT
登录
6mi
u
盘
搜
搜 索
IT
Java的数据类型以及equals和==的区别
Java的数据类型以及equals和==的区别
xiaoxiao
2021-03-25
139
Java的数据类型
分为两种:
基本数据类型
(
值类型
)和
复合数据类型
(
引用类型
)
注:基本数据类型分为4类8种,
String属于引用类型中的类
在不同的数据类型中==和equals代表的含义不同:
在
基本数据类型
中,
没有eqauls
,
==代表值比较
在
复合数据类型
中,当他们用
(==)
进行比较的时候,比较的是他们在内存中的
存放地址
,
除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
JAVA当中
所有的类都是继承于Object这个基类的
,在Object中的
基类中定义了一个equals的方
法,这个方法的
初始行为是比较对象的内存地 址
,但在一些类库当中这个方法被覆盖掉了,如
String,Integer,Date在这些类当中equals有其自身的实现
,而
不再是比较类在堆内存中的存放地址
了
String情况较特殊,==比较的是地址,但
String是不可变的对象
,分两种情况讨论:
1、普通变量
①.
为啥s1==s2为true
。
String s1 = "hello";
这种方式,
java首先会在缓冲区查找是否有"
hello
"这个常量对象
,有就直接将其地址赋给s1,没有就创建一个"
hello
",然后将其赋给s1;然后
String s2 = "
hello
";
java同样会在缓冲区中查找"
hello
",这次能查找到了,因为s1创建了一个"
hello
",所以会将其地址赋给s2,如此,s1和s2便有了相同的地址。
②.
s3 == s4为false。
因为
String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象
,然后将指针指向新的 String 对象
2、final修饰的变量
当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用
。由于变量str1被final修饰,因此会被当做编译器常量
,所以在使用到str1的地方会直接将变量str1替换为它的 值。不过要注意,只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化.
转载请注明原文地址: https://ju.6miu.com/read-3970.html
技术
最新回复
(
0
)