Java的数据类型以及equals和==的区别

    xiaoxiao2021-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为trueString 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)