zoukankan      html  css  js  c++  java
  • Java-从堆栈常量池解析equals()与==

    一.基本概念

    ①JAVA中的基本数据类型(简单类型,内置类型):

      字节型(byte),短整型(short),整型(int),长整型(long),字符型(char),浮点型(float),双精度型(double),布尔型(boolean);注意都是小写的,没有String类型,String类型不是Java中的基本数据类型。

    ②变量类型(按变量的作用域区分):

      全局变量,成员变量,局部变量。

    ③堆:

      存放所有new出来的对象,该对象的引用存在栈中,当栈中的引用消失后堆中的对象的由垃圾回收器负责回收。

    ④栈:

      存放基本类型的变量的引用和其他对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)

      栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。

    ⑤常量池:

      存放字符串常量和基本类型常量(final修饰的在编译期间就能够确定的并被保存在已编译的.class文件中的一些数据)。

     1 package cn.edu.whu.compare;
     2 
     3 public class CompareTest {
     4     public static void main(String[] args) {
     5         // "ab"存在常量池中,a指向常量池中"ab"的地址
     6         String a = "ab";
     7         // “b”存在常量池中
     8         final String bb = "b";
     9         String cc = "b";
    10         String b = "a" + bb;
    11         String c = "a" + cc;
    12         /**
    13          * 变量b的值在编译就可以确定指向常量池中“ab”的地址, 因为bb使用了final修饰并且bb指向确定的字符串
    14          * 变量c的值只有在运行时才能确定,变量c相当于在运行时new了一个String对象,这个新对象存储在堆中
    15          */
    16         System.out.println(bb == cc);// true
    17         System.out.println(a == b); // true
    18         /**
    19          * a指向“ab”在常量池中"ab"的地址 c指向在运行时创建的对象“ab”在堆中的地址
    20          * c.intern()返回一个String对象,这个String对象指向--->c指向的对象“ab”在常量池中的地址
    21          */
    22         System.out.println(a == c); // false
    23         System.out.println(a == c.intern()); // true
    24     }
    25 }

    二.equals()与==的区别

    ①关于==操作符

    此操作符比较两个对象(上实例中的各种变量名,常量名)在栈中的值(是一个内存地址,该地址存了实际的对象的内容),如果值相等则返回True,否则返回False

    ②Object类定义的equals方法:

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

      即:Object类的equals是直接通过==比较两个对象的内存地址,那么也就是说任何继承自Object类的子类如果不重写equals方法那么其实equals与==两种比较方法结果是一样的。

    ③String类定义的equals方法

     1     public boolean equals(Object anObject) {
           //当两个比较对象的内存地址相同时就不用在比较了直接返回true,因为内存地址都相等了,存的东西肯定一样啊!!
    2 if (this == anObject) { 3 return true; 4 }
          //比较字符串中的每一个字符,只有每一个字符值都相等那么两个对象才equals
    5 if (anObject instanceof String) { 6 String anotherString = (String)anObject; 7 int n = value.length; 8 if (n == anotherString.value.length) { 9 char v1[] = value; 10 char v2[] = anotherString.value; 11 int i = 0; 12 while (n-- != 0) { 13 if (v1[i] != v2[i]) 14 return false; 15 i++; 16 } 17 return true; 18 } 19 } 20 return false; 21 }

    参照上面注释所讲的,多余的不解释了。

    版权所有,转载请注明出处!

  • 相关阅读:
    软件测试基础5 ——系统测试之软件质量
    软件测试基础4 ——系统测试之测试方法
    软件测试基础3 ——系统测试之系统测试类型
    软件测试基础2 ——系统测试之测试对象与测试级别
    软件测试基础1 ——系统测试之测试基础
    《软件测试方法和技术》-读书笔记(三)
    《软件测试方法和技术》-读书笔记(二)软件缺陷的产生
    《软件测试方法和技术》-读书笔记(一)
    bug的一些事
    开发版速达-提供在线帐套配置功能
  • 原文地址:https://www.cnblogs.com/foreverngu/p/4345823.html
Copyright © 2011-2022 走看看