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

本文详细解析了Java中equals方法与==运算符的区别,尤其针对String类进行了深入探讨,包括它们如何比较对象,以及在不同情况下创建的String对象数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作能像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;
    }
 

 

 

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

 

 

 

内容概要:该论文探讨了一种基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化方法。STAR-RIS作为一种新型可重构智能表面,能同时反射和传输信传统仅能反射的RIS不同。结合NOMA技术,STAR-RIS可以提升覆盖范围、用户容量和频谱效率。针对STAR-RIS元素众多导致获取完整信道状态信息(CSI)开销大的问题,作者提出一种在不依赖完整CSI的情况下,联合优化功率分配、基站波束成形以及STAR-RIS的传输和反射波束成形向量的方法,以最大化总可实现速率并确保每个用户的最低速率要求。仿真结果显示,该方案优于STAR-RIS辅助的OMA系统。 适合人群:具备一定无线通信理论基础、对智能反射面技术和非正交多址接入技术感兴趣的科研人员和工程师。 使用场景及目标:①适用于希望深入了解STAR-RISNOMA结合的研究者;②为解决无线通信中频谱资源紧张、提高系统性能提供新的思路和技术手段;③帮助理解PSO算法在无线通信优化问题中的应用。 其他说明:文中提供了详细的Python代码实现,涵盖系统参数设置、信道建模、速率计算、目标函数定义、约束条件设定、主优化函数设计及结果可视化等环节,便于读者理解和复现实验结果。此外,文章还对比了PSO其他优化算法(如DDPG)的区别,强调了PSO在不需要显式CSI估计方面的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值