zoukankan      html  css  js  c++  java
  • 关于 equals

    JDK1.8后字符串常量池被移动到堆(Heap)中,显式的String常量放在堆里的常量池,而String对象放在普通的堆中。

    复习:栈放的是引用,实际的数据都是保存在堆中。

    String a = "abc";
    String b = "abc";
    String c = new String("abc");
    String d = new String("abc");
    System.out.println(a == b);
    System.out.println(a == c);
    System.out.println(c == d);

    从结果“true false false”反推概念,对象a,b使用显示声明,“abc”是在常量池中的同一个内存,而c,d使用new声明,相当于两个不同的普通对象,分别保存在堆中。

    然后“‘==’比较的是地址,‘equals’比较的是值”这句话对String是成立的,但对其他对象并不完全成立。

    equals是超类Object的一个方法,实际上也是间接使用“==”比较:

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

    其中String重写了equals方法:

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
  • 相关阅读:
    Java设计模式之责任链模式
    多线程几个常用方法的实例
    Activiti工作流
    Java线程常用方法汇总
    Java线程的几个概念
    多线程——实现Callable接口
    java对象在JVM堆中的数据结构
    对计算机世界的认知
    wait、notify为什么要放在同步代码块中
    java synchronized关键字的底层实现
  • 原文地址:https://www.cnblogs.com/LinsenLi/p/12418471.html
Copyright © 2011-2022 走看看