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

刚学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);
                    }
                }
            }
        }
    }
}
慕码人2483693
浏览 344回答 1
1回答

慕容3067478

你可以看下readLine的源码,在356行是new一个字符串,==符号是比较引用自然是不一样,这个就好比System.out.println("张三"==new String("张三"));的输出。如果你把setSName方法改成这样就都是输出false了public void setSName(String sname){ this.SName = new String(sname);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java