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

获取屏幕的值与字符串相比较不相等,请问是什么原因?

获取屏幕的值与字符串相比较不相等,请问是什么原因?

慕码人2483693 2019-01-16 19:27:46
刚学java没多久,遇到一个比较基础的问题,搞不清楚产生的原因,希望能得到解答!谢谢。 System.out.println((StuArr[i].SName=="张三"));System.out.println((findName=="张三"));这2条语句,第一条是ture,第二条是false。StuArr[i].SName是把一个对象赋给了StuArr[i],然后该对象有SName成员。内容是"张三"。findName是String类型,赋值的内容是br.readLine(),键盘输入一行后回车的内容,内容也是"张三"。虽然我知道比较对象需要用equal,但是单说这个问题,为什么同样是字符串比较,第二条从屏幕获取的字符串"张三"跟"张三"比较,返回的是false呢? 我从目前学到的知识角度来分析的话,StuArr[i].SName和findName的hashcode都一样,他们的地址应该是同样的,那么应该返回ture。结果不是这样子。 另外我还有一点猜测,会不会br.readLine()获取的字符串在堆里,而SName成员变量在栈里,所以相比较之下会不同,但是这个怎么去验证呢? 具体代码如下: import java.io.*; import java.util.*; class students { private String SName; private int SAge; private static students[] StuArr; { StuArr = new students[10]; } //无参数构造器 students() { } students(String sname,int sage) { this.SName = sname; this.SAge = sage; } //SName的set和get方法 public void setSName(String sname) { this.SName = sname; } public String getSName() { System.out.println("姓名:" + this.SName); return this.SName; } //SAge的set和get方法 public void setSAge(int sage) { this.SAge = sage; } public int getSAge() { System.out.println("年龄:" + this.SAge); return this.SAge; } //将students对象保存进StuArr[]数组中。 public void setStuArr(students stu) { for (int i = 0;i<10 ;i++ ) { if (StuArr[i] == null) { StuArr[i] = stu; return; } } System.out.println("当前数组成员已满,添加失败。"); } public static void main(String[] args) throws Exception { students stu1 = new students(); //定义2个学生的值 stu1.setSName("张三"); stu1.setSAge(18); students stu2 = new students("李四",19); //将学生信息传入StuArr数组 stu1.setStuArr(stu1); stu2.setStuArr(stu2); System.out.println("============================"); System.out.println("搜索名字:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String findName = null; while ((findName=br.readLine()) != null) { for (int i = 0; i < 10 ;i++ ) { if (StuArr[i] == null) { continue; } else { System.out.println(("张三"==findName)); if (StuArr[i].SName == findName) { System.out.println("搜索结果如下:"); System.out.println("姓名:"+StuArr[i].SName); System.out.println("年龄:"+StuArr[i].SAge); } } } } } }
查看完整描述

1 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

你可以看下readLine的源码,在356行是new一个字符串,==符号是比较引用自然是不一样,这个就好比System.out.println("张三"==new String("张三"));的输出。如果你把setSName方法改成这样就都是输出false了public void setSName(String sname){ this.SName = new String(sname);}

查看完整回答
反对 回复 2019-02-12
  • 1 回答
  • 0 关注
  • 343 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信