zoukankan      html  css  js  c++  java
  • == 和 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");
  • 相关阅读:
    Effective C++ 学习一
    JavaScript 定义类和继承类的基本步骤
    Vararg collection Factory Method
    apache之httpd启动、终止、重启小结
    Thinking in C++ 学习笔记[1]
    Creational Pattern 之 Abstract Factory
    Perl WEB 开发之 Template
    C语言博客作业数据类型
    C语言博客作业一二维数组
    C语言博客作业函数
  • 原文地址:https://www.cnblogs.com/remta/p/12090155.html
Copyright © 2011-2022 走看看