言成言成啊 | Kit Chen's Blog

java中equals和==的区别

2019-09-16

java中equals和==的区别

对于基本类型来说,==是对数值的比较。

对于引用类型来说,==是对地址值的比较。

1
2
3
int num1=1;
int num2=1;
System.out.println(num1==num2)//true

因为int是基本类型,基本类型中==是对数值比较。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String str1="abc";
String str2="abc";
char[] charsArray={
'a','b','c'
};
String str3=new String(charsArray);

System.out.println(str1==str2);//true
System.out.println(str1==str3);//false
System.out.println(str2==str3);//false

System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//true
System.out.println(str2.equals(str3));//true

原文链接:https://blog.csdn.net/weixin_40304387/article/details/81071816 (以下文字看原文链接理解)

采用字面值的方式创建一个字符串时,JVM(Java Virtual Machine,即java虚拟机)首先会去字符串池中查找是否存在”abc”这个对象,如果不存在,则在字符串常量池中创建”abc”这个对象,然后将池中”abc”这个对象的引用地址返回给”abc”对象的引用s1,这样s1会指向字符串常量池中”abc”这个字符串对象;如果存在,则不创建任何对象,直接将池中”abc”这个对象的地址返回,赋给引用s2。因为s1、s2都是指向同一个字符串池中的”abc”对象,所以结果为true。

采用new关键字新建一个字符串对象时,JVM首先在字符串池中查找有没有”abc”这个字符串对象,如果有,则不在池中再去创建”abc”这个对象了,直接在堆中创建一个”abc”字符串对象,然后将堆中的这个”abc”对象的地址返回赋给引用s3,这样,s3就指向了堆中创建的这个”abc”字符串对象;如果没有,则首先在字符串池中创建一个”abc”字符串对象,然后再在堆中创建一个”abc”字符串对象,然后将堆中这个”abc”字符串对象的地址返回赋给s3引用,这样,s3指向了堆中创建的这个”abc”字符串对象。s4则指向了堆中创建的另一个”abc”字符串对象。s3 、s4是两个指向不同对象的引用,结果当然是false。

在堆内存中(从jdk1.7开始),有一个空间,叫字符串常量池。字符串直接创建的,在字符串常量池中存储。而在字符串常量池中,存储着字符串对象。字符串在最底层是用byte数组存储的。

new关键字创建时,会把char型数组转换成字符数组,然后创建。

基本类型和引用类型

  • 基本类型

    • 整型
      • byte
      • short
      • int
      • long
    • 浮点型
      • float
      • double
    • 字符型
      • char
    • 布尔型
      • boolean
  • 引用类型(java为每种基本类型,都提供了对应的封装类型)

    • Byte
    • Short
    • Integer
    • Long
    • Float
    • Double
    • Character
    • Boolean

注意:在泛型类中,类型只能是引用类型,不能是基本类型。

阅读量