永发信息网

"equals"和"=="的区别

答案:5  悬赏:60  手机版
解决时间 2021-02-27 13:40
  • 提问者网友:遁入空寂
  • 2021-02-26 16:53
public class ckeef

{ public static void main(String args[])

{ String s1,s2,s3,s4;

s1=new String("we are students");

s2="We are students";
s3="We are students";

s4=new String(s1);

System.out.println(s1.equals(s2));

System.out.println(s3==s2);//s2和s3为什么是对的??

System.out.println(s1.equals(s4));

System.out.println(s1==s4);//s1和s4的引用不是一样的么?为什么输出的是false??

}

}
菜鸟求解!!!!!!
最佳答案
  • 五星知识达人网友:毛毛
  • 2021-02-26 18:19
这个确实是容易引起混乱的。。。让人疑惑的。。。

关键在于。。。你要理解s1=new String("we are students");
s2="We are students";
这两个是不一样的。。。。new是用新建一个对象的方法。。。。而后一种是放在常量池中的。。。你一下次再用这种方法去创建的时候。。。就会去常量池里面找,所以
s2="We are students";
s3="We are students";

这两个是相同的。。。指向常量池中的"We are students";。。。

而s1=new String("we are students");
s4=new String(s1);
这两个是不同的对象。。。。。尽管他们的内容是一样的。。。
就像有两个人。。。他们的名字是相同的。。。。但是并不是一样的人。。。。

希望能帮到你。。。这个需要慢慢体会。。。。我刚开始的时候也比较混乱。。。不太理解。。。
全部回答
  • 1楼网友:七十二街
  • 2021-02-26 22:12
这个问题其实不菜 java虚拟机里有一个区域叫方法区,方法区里有一个常量区,如果你是String str = "abc",虚拟机认为“abc”是常量,放在常量区。下次你再定义String otherStr = “abc", 虚拟机并不新创建任何东西,而是连到刚才常量区里的”abc“,所以不管是equal还是==,都相等,因为值和地址都相等。 另外还有一个区域叫堆,如果String str = new String("abc"), 虚拟机会创建对象放到堆里,再String otherStr = new String("abc"),会在堆里放两个对象。所以==就是false,因为两个对象地址不同。
  • 2楼网友:不甚了了
  • 2021-02-26 20:41
呵呵,很经典的问题.详细说一下,别嫌烦哟~ 在java程序设计中,经常需要比较两个变量值是否相等。例如 1、简单数据类型比较 a = 10; b = 10; if(a == b){ //写要执行的代码 } 2、引用数据类型比较 ClassA a = new ClassA("abc"); ClassB b = new ClassB("abc"); if(a == b){ //写要执行的代码 } 显然在例1中 a == b的值为true,例2中a == b值为false 你应该有一些java基础吧,下面我用int类型和它的封装类Integer来说明简单类型和封装类型进行比较时的区别: ==和equals()的用法 先看一段代码: public class TestEqual{ public static void main(String [ ] args){ //简单类型比较 int a = 100; int b = 100; System.out.println("a == b?" + (a == b)); //引用类型比较 Integer c = new Integer(100); Integer d = new Integer(100); System.out.println("c == d?" + (c == d)); } } 运行该程序,会打印出以下信息: a == b? true c == b? false 可以看出,在引用类型比较中,虽然用了同一个参数“100”来构造两个变量,但他们仍然不同。 why?? 要知道,对于这两个引用类型变量c和d,他们指向的是两个不同的对象(只不过两个对象的值都是100),因为是指向两个对象,所以比较这两个变量会得到false的值。 注意啦,重要结论: 对于引用类型变量,运算符“==”比较的是两个变量是否引用同一对象。 ************************************************************************************************************* 那么如何比较对象的值是否相等呢? 在java中提供了equals()方法用于比较对象的值。我们把上面引用类型部分的程序稍作修改: Integer c = new Interger(100); Integer d = new Interger(100); System.out.println("c equals d?" + (c.equals(d) )); 运行后可得一个true,这是因为,方法equals()进行的是“深层比较”,他会去比较两个对象的值是否相等。 如果你想多学一点,一定会问:“这个可爱的equals()方法是由谁来实现的呢?” 我们知道,java中所有类的父类是Object类,在Object中,已经定义了一个equals()方法,但是这个默认的equals()方法实际上也只是测试两个变量引用是否指向同一对象(即与那个可爱的 == 功能一样)。所以它并不一定能得到你所期望的效果。所以我们还经常需要自己将定义的类(就是上面的TestEqual)中的equals()进行覆盖。像Integer封装类就已经覆盖了Object中的equals()方法,直接可以拿来比较引用类型c和d指向的对象的值。 好了,相信你一定耐心地看到了这里,我们来总结一下 == 和equals()两种比较方法,在使用时要注意: 1、如果测试两个简单类型的数值是否相等,则一定要用“==”来比较; 2、如果要比较两个引用变量对象的值是否相等,则要用对象的equals()方法进行比较; 3、如果需要比较两个引用变量是否指向同一对象,则使用“==”来进行比较; 还有,对于自定义的类,应该根据情况覆盖其父类或Object类中的equals()方法,否则默认的equals()方法功能与“==”相同。 OK! 你的疑问解决了吗?我的叙述你满意吗?
  • 3楼网友:孤独入客枕
  • 2021-02-26 20:28
==  和 Equals 的区别 1. == 是一个运算符。 2.Equals则是string对象的方法,可以.(点)出来。 我们比较无非就是这两种 1、基本数据类型比较  2、引用对象比较 1、基本数据类型比较 ==和Equals都比较两个值是否相等。相等为true 否则为false; 2、引用对象比较 ==和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false; 需注意几点: 1、string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同; 2、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。 所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的; 3、基本数据类型比较(string 除外) == 和 Equals 两者都是比较值; 拓展资料: =操作符专门用来比较变量的值是否相等。比较好理解的一点是:  int   a=10;  int   b=10;  则a==b将是true。  但不好理解的地方是:  String   a=new   String( "foo ");  String   b=new   String( "foo ");  则a==b将返回false。  对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为 "foo "的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用 "== "操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是 "foo ",应该是“相等”,但是==操作符并不涉及到对象内容的比较。  对象内容的比较,正是equals方法做的事。
  • 4楼网友:封刀令
  • 2021-02-26 19:08
public class ckeef { public static void main(String args[]) { String s1,s2,s3,s4; // 定义4个引用,但未指向任何对象。 s1=new String("we are students"); //将引用s1指向新生成的string对象 s2="We are students"; s3="We are students"; s4=new String(s1); //新建一个String使用s1内容构造,并用s4指向它。 System.out.println(s1.equals(s2)); System.out.println(s3==s2);//s2和s3为什么是对的?? System.out.println(s1.equals(s4)); System.out.println(s1==s4);//s1和s4的引用不是一样的么?为什么输出的是false?? } }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯