刚学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);}
添加回答
举报
0/150
提交
取消