为了账号安全,请及时绑定邮箱和手机立即绑定

测试了一下,用equals和==都能出现相同的结果,老师讲错了么?

public boolean equals(Object obj){
		if(this==obj){
			System.out.print("你好1");
			return true;
		}
		if(obj==null){
			System.out.print("你好2");
			return false;
		}	
		if(!(obj instanceof subjects)){
			System.out.print("你好3");
			return false;
		}
		subjects subject=(subjects)obj;
		if(this.name==null){
			if(subject.name==null){
				System.out.print("你好4");
				return true;}
			else return false;
			
		}else{
			if(this.name==subject.name){
				System.out.print("你好5");
				return true;}
			else return false;
		}

运行结果:

subjectsToList得到一个课程数据:1 语文 王老师

subjectsToList得到一个课程数据:2 数学 刘老师

subjectsToList得到一个课程数据:3 政治 陈老师

取得课程:政治

你好1备选课程中是否包含课程:政治,true

新创建课程:政治

你好5备选课程中是否包含课程:政治,true

你好5备选课程中是否包含课程:语文,true


正在回答

5 回答

package test;

public class Student {
    String name;
    
    public Student(String name) { this.name = name; }
    
    @Override
    public boolean equals(Object obj) {
        Student stu = (Student) obj;
        if (this.name==stu.name) return true; // a
        // if (this.name.equals(stu.name)) return true; // b
        return false;
    }
    
    public static void main(String[] args) {
        String name0 = "ddd";
        String name1 = "ddd";
        // name0 = new String("ddd"); // c
        // name1 = new String("ddd"); // d
        Student stu0 = new Student(name0);
        Student stu1 = new Student(name1);
        System.out.println(stu0.equals(stu1));
    }
    /*
     * 现在简化模拟了你的写法, 控制台会打印true;
     * 如果解开c,d两行的注释, 控制台会打印false;
     * 如果注释a行, 解开b行注释, 
     * 则无论c,d两行是否注释, 结果都会是true, 
     * 这也是我们期待的结果, 所以应该使用equals比较字符串.
     * 为什么会这样, 去百度"Java字符串池".
     */

}


0 回复 有任何疑惑可以回复我~
#1

慕函数1733451 提问者

非常感谢!
2017-05-18 回复 有任何疑惑可以回复我~
//测试list的contains方法
	  public  void testContains(){
		subjects subject=subjectsToList.get(0);
		System.out.println("取得课程:"+subject.name);
		System.out.println("备选课程中是否包含课程:"+subject.name+","+subjectsToList.contains(subject));
		subjects subject2=new subjects(subject.id,subject.name,subject.teacher);
		System.out.println("新创建课程:"+subject2.name);
		System.out.println("备选课程中是否包含课程:"+subject2.name+","+subjectsToList.contains(subject2));
		subjects sub=new subjects("12","语文","王老师");
		System.out.println("备选课程中是否包含课程:"+sub.name+","+subjectsToList.contains(sub));
	  }
	public static void main(String[] args){
		ListTest list=new ListTest();
		list.subjectsAdd();
		list.testContains();
		/*list.testInt();
		list.listAddArray();
		//list.stringTest();
		list.listAddIdArray();
		list.modifyTest();
		list.addChildSubjects();
		list.testForEach1();*/
		//list.testForEach();
		//list.removeTest();
		//list.removeIdTest();
		//list.removeArray();
	}

这个是部分的!可能你们更想看这个

0 回复 有任何疑惑可以回复我~
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;


public class ListTest {
	public List<subjects> subjectsToList;
	public ListTest(){
		this.subjectsToList=new ArrayList();
		this.list=new ArrayList();
	}
	public List<Integer> list;
	//测试添加整型变量
	public void testInt(){
		list.add(1);
		System.out.println("基本类型数据必须用包装类作"+list.get(0));
		
	}
	public void subjectsAdd(){
		//为subjectsToList添加数据!
		subjects ar=new subjects("1","语文","王老师");
		subjectsToList.add(ar);
		//从subjectsToList中得到一个数据
		subjects ar1=(subjects)subjectsToList.get(0);
		System.out.println("subjectsToList得到一个课程数据:"+ar1.id+" "+ar1.name+" "+ar1.teacher);
	     ar1=new subjects("2","数学","刘老师");
	     //再往subjectsToList中添加一个数据,之前的数据往后推
	    subjectsToList.add(ar1);
	     ar1=(subjects)subjectsToList.get(1);
		System.out.println("subjectsToList得到一个课程数据:"+ar1.id+" "+ar1.name+" "+ar1.teacher);
		ar1=new subjects("3","政治","陈老师");
		//在指定位置添加数据,该位置上原来的数据往后移动
		subjectsToList.add(0,ar1);
		ar1=(subjects)subjectsToList.get(0);
		System.out.println("subjectsToList得到一个课程数据:"+ar1.id+" "+ar1.name+" "+ar1.teacher);
		int size=subjectsToList.size();
		//遍历方式一
		/*for(int i=0;i<size;i++){
			System.out.println("这是List中第"+i+"位的课程信息");
			ar1=(subjects)subjectsToList.get(i);
			System.out.println("课程:"+ar1.id+" "+ar1.name+" "+ar1.teacher);
		}
		*/
		//遍历方式二
		/*Iterator it=subjectsToList.iterator();
		System.out.println("有如下课程信息:");
		while(it.hasNext()){
			ar1=(subjects)it.next();
			System.out.println("课程:"+ar1.id+" "+ar1.name+" "+ar1.teacher);
		}*/
		
		
		
		}
	//遍历方式三 for each
	public void testForEach(){
			for(Object ar1:subjectsToList){
				//subjects ar1=(subjects)obj;
				System.out.println("课程:"+ar1.id+" "+ar1.name+" "+ar1.teacher);
			}
	}
	//数组内信息整个添加
	public void testForEach1(){
		for(subjects obj:subjectsToList){
			System.out.println("课程:"+obj.id+" "+obj.name+" "+obj.teacher);
		}
	}
	public void  listAddArray(){
		subjects[] subject={new subjects("4","英语","翟老师"),new subjects("5","地理","魏老师")};
		subjectsToList.addAll(Arrays.asList(subject));
	}
	//添加字符串测试
	/*public void stringTest(){
		String test="I love china!";
	    subjectsToList.add(5,test);
	    String test1=(String)subjectsToList.get(5);
	    System.out.println(test1);
	}
	*/
	//添加数组到指定位置
	public void listAddIdArray(){
		subjects[] subject={new subjects("6","地理","王老师"),new subjects("7","社会","刘老师")};
		subjectsToList.addAll(0, Arrays.asList(subject));
	}
	public void modifyTest(){
		subjectsToList.set(2, new subjects("h","heike","hhhhh"));
	}
	public void removeTest(){
		subjects move=(subjects)subjectsToList.get(0);
		System.out.println("我即将被删除,但你删错了,我是"+move.name+" "+move.teacher);
		subjectsToList.remove(move);
		testForEach();
	}
	public void removeIdTest(){
		subjectsToList.remove(0);
		System.out.println("我再删除0号!!");
		testForEach();
	}
	public void removeArray(){
		subjects[] st={(subjects)subjectsToList.get(0),(subjects)subjectsToList.get(1),(subjects)subjectsToList.get(2)};
		subjectsToList.removeAll(Arrays.asList(st));
		System.out.println("这真是大清除呀!!只剩下这些了!");
		testForEach();
	}
	//添加子类对象测试
	public void addChildSubjects(){
		childSubjects child=new childSubjects("100","儿子来了","妈妈是谁?");
		subjectsToList.add(0, child);
	}
	//测试list的contains方法
	  public  void testContains(){
		subjects subject=subjectsToList.get(0);
		System.out.println("取得课程:"+subject.name);
		System.out.println("备选课程中是否包含课程:"+subject.name+","+subjectsToList.contains(subject));
		subjects subject2=new subjects(subject.id,subject.name,subject.teacher);
		System.out.println("新创建课程:"+subject2.name);
		System.out.println("备选课程中是否包含课程:"+subject2.name+","+subjectsToList.contains(subject2));
		subjects sub=new subjects("12","语文","王老师");
		System.out.println("备选课程中是否包含课程:"+sub.name+","+subjectsToList.contains(sub));
	  }
	public static void main(String[] args){
		ListTest list=new ListTest();
		list.subjectsAdd();
		list.testContains();
		/*list.testInt();
		list.listAddArray();
		//list.stringTest();
		list.listAddIdArray();
		list.modifyTest();
		list.addChildSubjects();
		list.testForEach1();*/
		//list.testForEach();
		//list.removeTest();
		//list.removeIdTest();
		//list.removeArray();
	}
	
}

这个是完整的!

0 回复 有任何疑惑可以回复我~

亲把完整代码贴出来吧,看看。如果用==就可以的话就没必要重写equals方法了,this.name是String型的,一般是比较其值是否相等,用equals

0 回复 有任何疑惑可以回复我~
#1

慕函数1733451 提问者

已经把代码贴出来了!
2017-04-13 回复 有任何疑惑可以回复我~
#2

慕函数1733451 提问者

代码贴出来了,大神怎么不看呢?
2017-04-18 回复 有任何疑惑可以回复我~

把你的主方法main()里的代码贴出来看看

0 回复 有任何疑惑可以回复我~
#1

慕函数1733451 提问者

贴出来了,在后面
2017-04-13 回复 有任何疑惑可以回复我~
#2

慕函数1733451 提问者

代码贴出来了,大神怎么不看呢?
2017-04-18 回复 有任何疑惑可以回复我~
#3

ziom 回复 慕函数1733451 提问者

不好意思,当时看到你贴出来的代码长就打算过会再看的,结果忘了,楼下说的对,对于字符串的比较应该用equals,你用的==。其他的问题暂时没看出来
2017-04-18 回复 有任何疑惑可以回复我~
#4

慕函数1733451 提问者 回复 ziom

我也测试了一下,确实==比较的应该是地址,可是在这里用等号竟然能够不出现问题,也是奇怪了!我除了贴了一个长的,还贴了一个短的,可以看那个短的呀
2017-04-18 回复 有任何疑惑可以回复我~
#5

慕函数1733451 提问者 回复 ziom

话说,老师在这里已经重新写了equals方法了,那调用equals方法是调用的哪个equals方法呢?难道就是我们重写的这个?还是string类中的呢?
2017-04-18 回复 有任何疑惑可以回复我~
#6

ziom 回复 慕函数1733451 提问者

你使用==测出来的结果一致应该是由于巧合,还是要用equals比较字符串比较规范稳妥,因为Java中的字符串有一个字符串池的概念,举个栗子,String str0 = "str"; String str1 = "str"; System.out.println(str0==str1);最后会打印出true, 具体的详细规则你自己去百度了解一下。
2017-04-18 回复 有任何疑惑可以回复我~
#7

ziom 回复 慕函数1733451 提问者

至于是不是因为字符串池的原因,你可以通过传入new出来的name传入构造反向验证,嗯, 如果你了解过字符串池,应该就知道怎么反响验证了
2017-04-18 回复 有任何疑惑可以回复我~
#8

ziom 回复 慕函数1733451 提问者

String的equals方法会被调用(在重写的equals里),而我们重写的也会被调用,不然写它何用,关于老师的讲解视频,你可以再看一遍,很多模糊的地方在第二遍温习的时候就会明白了
2017-04-18 回复 有任何疑惑可以回复我~
#9

慕函数1733451 提问者 回复 ziom

能不能在你电脑上也测试一下呀!
2017-04-19 回复 有任何疑惑可以回复我~
#10

ziom 回复 慕函数1733451 提问者

为什么
2017-04-19 回复 有任何疑惑可以回复我~
#11

慕函数1733451 提问者 回复 ziom

我的意思是用==号,而不是equals,我觉得程序如此都是有原因的
2017-04-19 回复 有任何疑惑可以回复我~
#12

ziom 回复 慕函数1733451 提问者

我上面不是解释了原因吗
2017-04-19 回复 有任何疑惑可以回复我~
#13

慕函数1733451 提问者 回复 ziom

你使用==测出来的结果一致应该是由于巧合
2017-04-19 回复 有任何疑惑可以回复我~
#14

ziom 回复 慕函数1733451 提问者

- -。。。你误解我的意思了,我这个巧合指的是由于你的代码写成这样,所以恰好会出现这种情况,不是说程序会有时这样有时那样
2017-04-19 回复 有任何疑惑可以回复我~
#15

慕函数1733451 提问者 回复 ziom

你前面的意思我基本上是理解的,我也觉得不可思议,但是问题毕竟还是没搞明白,我在想你有没有试过用==号,万一你用等号也是可以的呢?那是不是说明我们理解的不够到位!
2017-04-19 回复 有任何疑惑可以回复我~
#16

ziom 回复 慕函数1733451 提问者

等会我给你写个测试
2017-04-19 回复 有任何疑惑可以回复我~
#17

慕函数1733451 提问者 回复 ziom

谢谢!
2017-04-19 回复 有任何疑惑可以回复我~
查看14条回复

举报

0/150
提交
取消

测试了一下,用equals和==都能出现相同的结果,老师讲错了么?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信