== 和 equals() 的区别

== 和 equals() 的区别

  • 基本数据类型:
    • 六数字 :byte、short、int、long、float、double;
    • 一布:boolean
    • 一字节:char
== 比较运算符

比较的是内存地址

在比较 基本 数据类型的时候比较的是他们的 值 是否相等

在比较 引用 数据类型的时候比较的是他们的引用(内存地址)是否相等<是否指向同一个对象>

注意:你可以用==来比较基本数据类型和它对应的包装类,二者类型兼容可比较(java底层给你自动转换了)若不兼容,编译会报错

这里还需要注意char类型,它比较的是字符的ASCLL码值。具体char的玩法自己去研究吧。

equals() 方法

该方法是Object的一个方法,因为java中所有的类都默认继承了Object类,所以,所有的类对象都可以使用此方法。如果有特殊要求还可以对这个方法进行重写。

因为它是一个方法,所以基本数据类型的变量是点不出这个方法的哟,它只能用于引用类型的比较

他在比较File、Date、String 及其包装类,比较的是对象的内容是否相等,因为这些特殊的类都重写了equals()方法,

比较其他类型的时候,比较的是他们的引用(内存地址)是否相等<是否指向同一个对象>

String对象的创建

字面量创建String对象

虽然创建了两个变量,但c和c2引用的是常量池中的同一个 "崩坏酱"。(常量池 位于堆中单独的一块内存区域)

  • 在创建的过程中,系统会先去常量池中找 有没有 "崩坏酱" 这个字符串,如果有,则将引用赋值给c和c2;如果没有则会在常量池中添加 "崩坏酱" 这个字符串,然后再赋值给c和c2.

     String c = "崩坏酱";
     String c2 = "崩坏酱";
     //所以
     System.out.println(c==c2); // true 
    
new创建String对象
  • 在创建的过程中,系统会先去常量池中找有没有 "律化娜" 这个字符串,如果有,则直接在堆中创建 "律化娜" 这个对象,然后把引用赋值给a和b;如果没有则会在常量池中添加 "律化娜" 这个字符串,然后在堆中创建一个 "律化娜" 对象,再把这个对象的引用赋值给a和b
    String a = new String("律化娜");
    String b = new String("律化娜");
    • 总结:字面量创建字符串比new的方式创建更高效,更省内存。
字符串相加问题

String字面量相加,如果一开始常量池中没有"崩坏";这种情况现在的JVM做优化以后,它会将相加的结果 "崩坏" 直接添加到常量池中,而不会添加 "崩"、"坏"、"崩坏" 三个字符串,然后再将"崩坏"的引用赋值给s。

String s = "崩"+"坏";

String对象相加,java会通过StringBuilder去实现这三个对象的相加,同样的情况,如果常量池中没有"233",它会先在常量池中添加2和3 ,然后根据相加的结果在堆中创建一个"233"字符串对象,然后把这个对象的引用赋值给s2.

String s2 = new String("2")+new String("3")+new String("3");
原文地址:https://www.cnblogs.com/remta/p/12090155.html