• “==”和equals的区别


    总结几句话:

    ==双等号始终是


        1.基本数据类型:比较存储的值是否相等。
        2.引用数据类型:比较所指对象的地址值是否相等。


    equals


        1.没有被重写过:

            相当于==;但是不能比较基本数据类型,比较的是引用对象的所指对象的地址值。
        2.被重写过(一般被String重写):比较的是对象的(内容)。

    代码示例参考

    1. public static void main(String[] args) {
    2. //基本数据类型的比较
    3. int num1 = 10;
    4. int num2 = 10;
    5. System.out.println(num1 == num2); //true
    6. //引用数据类型的比较
    7. //String类(重写了equals方法)中==与equals的比较
    8. String s1 = "hello";
    9. String s2 = "hello";
    10. System.out.println(s1 == s2); //true,比较地址值:内容相同,因为常量池中只有一个“hello”,所以它们的地址值相同
    11. System.out.println(s1.equals(s2));//true,比较内容:内容相同,因为常量池中只有一个“hello”,所以它们的地址值相同
    12. System.out.println(s1.equals("hello")); //true
    13. String s3 = new String("hello");
    14. String s4 = new String("hello");
    15. System.out.println(s3 == s4); //false,比较地址值:s3和s4在堆内存中的地址值不同
    16. System.out.println(s3.equals(s4)); //true,比较内容:内容相同
    17. //没有重写equals方法的类中==与equals的比较
    18. People p1 = new People();
    19. People p2 = new People();
    20. People p = p2;
    21. System.out.println(p1);//People@135fbaa4
    22. System.out.println(p2);//People@45ee12a7
    23. System.out.println(p); //People@45ee12a7
    24. System.out.println(p1.equals(p2)); //false,p1和p2的地址值不同
    25. System.out.println(p.equals(p2)); //true,p和p2的地址值相同
    26. }

    附加

    String类对equals()方法进行了重写。

    1. String s1 = "hello";//在字符串常量池中创建"hello",并将地址值赋值给s1;
    2. String s2 = new String("world");//通过new关键字在堆中创建对象,并将对象地址值赋值给s2.

    对于String s2 = new String(“world”);
    首先在堆内存中申请内存存储String类型的对象,将地址值赋给s2;
    在方法区的常量池中找,有无hello:
    若没有,则在常量池中开辟空间存储hello,并将该空间的地址值赋给堆中存储对象的空间;
    若有,则直接将hello所在空间的地址值给堆中存储对象的空间。

    对于String s1 = “hello”;
    在方法区的常量池中找,有无hello,如果没有,就在常量池中开辟空间存储hello。
    然后只需要将hello所在空间的地址值赋给 s1。

    字符串作为最基础的数据类型,使用非常频繁,如果每次都通过 new 关键字进行创建,会耗费高昂的时间和空间代价。Java 虚拟机为了提高性能和减少内存开销,就设计了字符串常量池. 在JDK1.7之前字符串常量池是存储在方法区的。JDK1.7之后存储在堆中了。

  • 相关阅读:
    基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
    华为云安全亮相世界互联网大会
    Go语言的100个错误使用场景(40-47)|字符串&函数&方法
    vue 实现数字验证码功能
    【C++】构造函数分类 ③ ( 调用有参构造函数的方法 | 括号法 | 等号法 )
    项目管理:团队执行力差,管理不善是根源
    怎么写自动注册苹果ID的工具,会用到哪些源代码?
    基于spring boot+ vue+ mysql开发的UWB室内外定位系统源码
    qdox获取java类文件中方法体代码
    【CSS】自定义下拉框
  • 原文地址:https://blog.csdn.net/m0_63615119/article/details/133754819