• equal与== 个人笔记


    首先看看以下的图,看清楚了图咱们要说的知识点也就说说清楚了一半


    int a=10;
    String b="ss";
    String c=new String("kkk");
    Person d=new Person("dlf");
    String e=new String("kkk");
    String f="ss";


    jvm中有堆heap,栈stack,常量池constant。
    我们的基本对象,包含int,double等都放在栈里,引用类型如String,Person(Person 就是一个pojo类而已)引用(如上面的c,d)放在栈里,真实的数据放在堆中。


    == 比較的是两个对象在栈中存放的数据是否一样
    b==f 比較的就是两个105的地址 (105就是指ss在常量池中的地址)
    c==e 一个1063一个1095 自然就不相等了


    equals 比較的事堆中的内容
    c.equsls(e) 就是两个kkk在比較 答案不言自明


    Objeck的equals方法例如以下
        public boolean equals(Object obj) {
            return (this == obj);
        }
    换句话说object的类的==与equals就是一回事
    有兴趣的能够看看String的equals方法


    关于==与equals说完了,再说说字符串的构建
    对字符串的构建 我们最常使用的有两种
    String a1="bbb";
    String a2=new String("ccc");
    两种方式有不同
    第一种方式,通过上面的图大家也看到了,bbb这个数据存放在常量池里;准确的说是用String a1="bbb"这样的方式产生字符串,jvm首先会在常量池里查找是否有bbb这个数据,假设有就把bbb这个数据的地址给a1,否则就在常量池里新建一个数据单元里面存放bbb,然后把这个单元的地址给a1。

    (上图中的两个105 就是这个样例)
    另外一种方式在于 在编译的时候会有一个ccc在常量池,等到执行的时候,会在堆区在创建一个数据单元里面存放ccc,然后a2里面就存放堆里面那个数据单元的地址!另外即使堆中已经有了这个字符串,通过new的方式,还会再产生一个堆区的数据(如上图中的1063与1095)


    所以
    String a=new String("bbb");
    产生了两个对象,一个在堆一个在常量池。




    String a=new String("bbb");
    String c=new String("ccc");
    产生了四个对象,两个在堆两个在常量池。


    String a1=new String("sss");
    String a2=new String("sss");


    对于这样的情况,堆区肯定有两个对象,那常量池里面呢?

    一个sss还是两个sss 我不敢肯定 但我预计应该是两个。

  • 相关阅读:
    杭电 HDU 1279 验证角谷猜想
    C# SQL 整表插入
    iframe截取站点的部分内容
    Thrift安装介绍
    赵雅智_Swift(3)_swift凝视
    Android API 文档 离线秒开方法
    xml文件的根节点layout_width或者layout_height设置无效果的原因分析
    函数指针使用演示样例(參考Linux-内核代码)
    eclipse中的项目受svn管理
    野人与传教士问题
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5135887.html
Copyright © 2020-2023  润新知