2 u013370108 u013370108 于 2016.04.19 23:17 提问

java代码:为什么输出结果是false?

控制台输入:asdf,为什么结果是false?求Scanner的具体解释

 public class StringTest {

    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        String s1="asdf";
        String s2=scan.next();
        System.out.println(s1==s2);
    }
}

6个回答

w172087242
w172087242   Ds   Rxr 2016.04.20 14:27
已采纳

因为System.in是标准控制台输入字符流,这样输入的东西都是以流式传输,当控制台读到控制台输入的流后,
会用当前系统默认编码对流进行字符编码获取字符串,形式如String s = new String(byte[], Charset.defaultCharset());
这时候生成的是一个new出来的字符串对象,引用地址就发生了改变,且其值不会出现在字符串常量池中,如果想要值new出来的
string对象的值也进行常量池,可以调用方法intern进行刷入。

希望可以帮到你。

u013370108
u013370108 谢了,懂了
一年多之前 回复
fubo1990
fubo1990   2016.04.20 07:54

String 不属于基本类型。基本类型可以进行==比较。 String是引用类型的。==比较的是对象的地址。equals比较的是两个对象的值。

qinjisheng_11
qinjisheng_11   2016.04.19 23:23

那个比较改成:System.out.println(s1.equals(s2));,这个是比较两个字符串相等,而“==”是比较两个字符串的内存地址是不是相同

zhujuyu
zhujuyu String 为引用类型,所以要比较字面值的话是不能够使用‘==’
一年多之前 回复
qinjisheng_11
qinjisheng_11 回复Chopstickss_: 不好意思,忘了把基本类型的比值除外了
一年多之前 回复
qinjisheng_11
qinjisheng_11 对象的引用,不就是指针,然后是这块内存的地址呀!如有不对请指教
一年多之前 回复
qq_34043294
qq_34043294 回复Chopstickss_: 地址。。
一年多之前 回复
qq_34043294
qq_34043294 回复有节奏的键盘: 你确定==是比较地址??
一年多之前 回复
qq_34043294
qq_34043294 回复有节奏的键盘: 你确定==是比较地址??
一年多之前 回复
oiu1010110
oiu1010110   2016.04.20 00:20

这两个不是同一个对象。

qq_24334403
qq_24334403   2016.04.20 11:16

scan。next获得字符串是new 出来的新串了吧,不会指向常量池的的字符串吧,猜的

u010646502
u010646502   2016.04.20 13:59

字符串比较不能用==

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!