1. == 和 equals的区别

java特性和优势

  • 简单性
  • 面向对象
  • 可移植性
  • 高性能
  • 分布式
  • 动态性
  • 多线程
  • 安全性
  • 健壮性

java程序运行机制

  • 解释型
  • 编译型

源码文件(.java 文件) -->Java编译器 – >字节码文件(.class文件)-- >类加载器 – >字节码校验器 – > 解释器 --> 操作系统平台


1. == 和 equals的区别

  • 对于object类来说没有区别,这一点可以从object类中的equals方法源代码中体现

    public boolean equals(Object obj) {
          
          
            return (this == obj);
        }
    

    源码中可以看到equals的本质就是 ==,而 == 对于基本数据类型比较内容,对于引用数据类型自然是引用地址。

  • object类是所有类的父类,即所有的类对象都可以调用equals方法,但不是所有的类中的equals方法都和 == 没有区别,毕竟object类中的equals方法没有被final修饰(被final修饰的方法不能被重写),是可以被子类重写的,对于字符串对象在使用equals和 == 返回结果不同,正是因为String,Integer等类重写了equal方法,我们来看String中的equals方法源码

    public boolean equals(Object anObject) {
          
           // a.equals(b),a为调用方
             // 1.判断地址是否一致,一致则相同
            if (this == anObject) {
          
          
                return true;
            }
            // 2.判断b是不是String类,不是直接返回false
            if (anObject instanceof String) {
          
          
                // 3.将b转型为String类
                String anotherString = (String)anObject; 
                // a的长度
                int n = value.length;
                // 4.a和b的长度相同继续比较,不同不需要比较了
                if (n == anotherString.value.length) {
          
          
                    // 5.a和b转换成字符数组
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    // 6.挨个字符比较是否相同
                    while (n-- != 0) {
          
          
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            // 2.b不是string类直接返回false
            return false;
        }
    

    可以看出来String重写equals方法,是通过上面的6个步骤最终从比较地址值,变为比较内容的。


彩蛋(对于上面红色字体加下划线标注的内容小扩展)

final–表示最终的,体现在java中

1.被final修饰的类不能被继承,表示最终的类,没有子类。

2.被final修饰的方法不能被重写,子类默认继承父类的方法,但不能去重写父类的方法。

3.被final修饰的变量表示常量,常量不可以修改 。注:使用static final关键字联合声明的变量称为全局常量;

此外还有一个特殊的例子

public static void main(String[] args) {
    
    
        // 如果使用final修饰一个对象引用,他的值是可以被改变的,但地址引用是不变的
        final User user = new User("xiaoming", 18);
        System.out.println(user.getAge()); // 18 
        user.setAge(15);
        System.out.println(user.getAge()); // 15
        user = new User("xiaoming", 18); // 这里的user是编译报错的,显然不能更改他的引用
    }

猜你喜欢

转载自blog.csdn.net/qq_42743223/article/details/108478706