一、== 和 euqals
1.==2.euqals3.区别 二、Int和Integer三、Obj类四、基本数据类型字节数
一、== 和 euqals
1.==参考资料:https://blog.csdn.net/qq_36522306/article/details/80550210
对于基本数据类型来说,== 比较的是值。
对于引用数据类型来说,== 比较的是对象的内存地址。
equals() 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。equals()方法存在于Object类中,而Object类是所有类的直接或间接父类,因此所有的类都有equals()方法。
3.区别是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同 。即会比较堆内存的地址,equals只比较堆里面的内容。
==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
==指引用是否相同, equals()指的是值是否相同
==是运算符,而equal是方法,可以由自己重写。
我们可以举个例子:
import java.util.Scanner;
public class HelloWorld_Test {
public static void main(String[] args) {
String s1 = "Start";
String s2 = "Start";
String s3 = new String("Start");
if(s1 == s2) System.out.println("s1==s2");
if(s1.equals(s2)) System.out.println("s1 equals s2");
if(s1 == s3) System.out.println("S1 == S3");
if(s1.equals(s3)) System.out.println("s1 equals s3");
}
}
结果如下:
可以看到s1 == s2但s1 !== s3,这时有个问题了:只有指向同一个内存空间才能判断成功,为什么s1和s2是两个变量能实现s1 == s2即指向同一个内存空间?
可以看到上述图中的s3和s4存于常量池中。对于基本数据类型(byte,short,char,int,float,double,long,boolean)来说,他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的,对于这样的字符串 “abc” 也是相同的道理,在常量池中,一个常量只会对应一个地址,因此不管是再多的 abc,“abc” 这样的数据都只会存储一个地址,所以所有他们的引用都是指向的同一块地址,因此基本数据类型和String常量是可以直接通过==来直接比较的。而new出来的不在常量池中,单独占堆内存。
但若创建一个Integer a = 128,Integer b = 128,并不能实现a == b
因为Integer型在常量池中的存储范围为[-128,127],127在这范围内,因此是直接存储于常量池的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以a,b分别指向了两个不同的对象地址,故而导致了不相等。
Tips:Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。
(引用自:https://blog.csdn.net/lcsy000/article/details/82782864)
二、Int和Integer接上述,Integer和Int有差别吗?
区别(引用自 https://www.cnblogs.com/bigdata-stone/p/10560759.html):
1.Integer是int的包装类,int则是java的一种基本的数据类型;
2.Integer变量必须实例化之后才能使用,而int变量不需要实例化;
3.Integer实际是对象的引用,当new一个Integer时,实际上生成一个指针指向对象,而int则直接存储数值
4.Integer的默认值是null,而int的默认值是0。
Integer变量和int变量进行比较时,只要两个变量的值相等,则结果就为True,(因为包装类Integer和基本数据类型比较的时候,java会自动拆箱为int,然后进行比较,实际上就是两个int变量进行比较),下面运行的结果为true。
三、Obj类上述说到equals()方法存在于Object类中,那Object类到底是什么还没有完全解释清楚(主要自己也没完全搞懂),故在此记录:
Java Object 类是所有类的父类(所有类的祖先),也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法,位于 java.lang 包中。上述equals若不重写,默认使用的是Obj的equals方法。若当前类不写明继承,则隐式继承Obj类。
public class HelloWorld extends Object{
//显示继承
}
public class Runoob {
//隐式继承
}
四、基本数据类型字节数
学机组的时候已经学过了,以C语言为例再复习一下:
而Java 中有 8 种基本数据类型,分别为:
6 种数字类型:
4 种整数型:byte、short、int、long
2 种浮点型:float、double
1 种字符类型:char
1 种布尔型:boolean。
除char外其他均与上述64位相同(无long long型),而char型 java采用unicode,2个字节(16位)来表示一个字符,故为16位。
对于 boolean,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1 位,但是实际中会考虑计算机高效存储因素。



