equals与==号 异同 String的字符串池

工作能像if语句可以选择干,也可以不选择干多棒!

if与if表并列,if与else表否则;if的if表包含(注:if包含嵌套有递增或递减顺序);

if与else if表选择。

      三种常见执行方式。

1、流程结构:顺序执行,条件分支,循环。

2、运算结构:八种基本数据的7中运算符对栈地址操作,与引类型的对象引用转换运算。

3、逻辑结构:...................................................................................................................


进入主题:1、equals与==的区别  ?     如果是String,那么String创建了几个对象?

首先遇到此类问题一般由两部分解释,慨念部分与示例代码部分; 再就是字符串池三者内存图来判断

1概念:同:1) 都可以比较变量是否相等
                    2) 在equals方法没有重写时, 在比较引用类型时的方式与==一致, 都是比较对象的地址是否相同
                    注: ==比较的是变量的栈值。

             异:1)==是运算符, 基本数据类型和引用数据类型都可以使用,equals是方法, 只有引用数据类型才能使用。

                    2)equals方法可以通过重写, 改变比较方式, 根据程序需要, 比较对象的内容是否相同

                  

 

 

 

原理分析:

双"=="号java的九种数据都能比较,比较的是栈里面的地址值。因为栈里面的地址与地址值在声明定义时就已经确定时唯一且地址号与地址号里面的值时固定不变的。 所以当使用==去判断两个对象或者两个基本数据时只要地址相等,那么它两就一定相等。

在equals没有重写时:因为所有类默认继承Object.使用时都是常规JDK提供的equals.

例如: int s1=5;  int s2=5;       s1==s2   等于true;   

          但是:如果  User  user1=new User("小名","15岁");    User  user2=new User("小明","15");

                              user1==user2      等于false;                       user1.equals (user2) 等于false;

解释1:在内存中JVM在占用操作系统内存时也是从优从简而行的,但是由于是new的肯定是两个房间。一旦进入栈里面那么就是两个地址在初始化存在两个唯一性的,否则你要改变我那么你就再来个地址装改变后的值,之前的值就永远对应之前地址号。

所以用双==号就为  false;

解释2:而equals是一个方法,方法其实就是类的一个成员,还是默认来源于java.Object类。

并且equals也只能比较应用类型。再度并且它的比较方式是与==一模一样的   "形式"。形式一样判断就是如果user1与user2的地址也是一样那么user1与user2就相等,而实际引用数据都存放在堆中,存放的形式是以   new  这个关键字建立的。每创建一个数据存储的对象都是在堆中划分一个新的空间。既然是新的空间,那么他们怎么可能同地址(房间号)。

所以用user1.equlas(user2)就为false;

在有重写的时候(前提要知道String是一种非常常用,才成为一种特殊的类。所以被JDK资源默认重写,并且还划分了内存池)。


 

//分下下面用eclipse测试结果

package com.bean;

        public class Userq {
        
            public int id;
            public String name;
            public Userq(int id, String name) {
                this.id = id;
                this.name = name;
            }
            public Userq(int id) {
                this.id = id;
            }   
        }

package com.bean;

public class StringBuferApend {

        public static void main(String[] args) {
            Userq us1=new Userq(5,"小明");
            Userq us2=new Userq(5,"小明");
            Userq us3=new Userq(5);
            Userq us4=new Userq(5);

            // 引用类型间的比较,,new出来的不管你拿什么比结果都是false,除非重写比较规则。
            System.out.println((us1==us2)+"\t"+us1.equals(us2));   false            false
            System.out.println((us3==us4)+"\t"+us3.equals(us4));   false            false

           //基本类型与默认重写的String比较
            int s1=5,s2=5;
            System.out.println(s1==s2);       true
            String a="55555";
            String b="55555";
            String a1=new String("55555");
            String b1=new String("55555");

              //因为特殊内存是jvm给的为了精简内存认为只要值一样就是同地址,因为默认重写比较了
            System.out.println(a==b);      
            System.out.println(a.equals(b));     //true(因为被默认重写)

           
            System.out.println(a1==b1);   //false    new  地址不一样了     
            System.out.println(a.equals(b));    //true(因为被默认重写)

           
            
        }

}
 


下面我们在看内存图:

左边为栈,右边为堆,下边String池,且String内只要内容文本一致就默认在栈中地址一样这就是重写效果与堆不一样

String S2=hell,     String   S3=hell;   那么S2==S3     S2.equals(S1)   都为true.

 

eclipse,中的重写equals  原理的核心代码如下:

//常规的重写

public boolean equals(Object obj){

//仔细看也是用==比较

     if(this==obj)     return true;

    if(obj instanceof User)   return true;

       User user=(User)obj;

    if(this.id==user.id)     return true;

     return  false;

}

 

 

 

 

//字符串

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;
    }
 

 

 

写的可能很混乱但是很详细!谅解

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值