A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黑马吕世成 于 2012-11-13 19:00 编辑

     class test
{
public static void main(String[] args)
{
byte[] b = new byte[3] ;
try{System.in.read(b);}catch(Exception  e){}//当输入 1 时
String s = new String(b);

System.out.println(s); //显示结果为 1
System.out.println(s1.equals("1"));//结果为false
}


如上程序,通过一个byte数组创建的String类,调用equals也会返回false了,是不是缺了什么?百度好久也没看出点什么

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
本帖最后由 邵天强 于 2012-11-13 20:50 编辑

1.首先你要了解String,String被final修饰,内容是不能被更改的。
2.String s=new String(b);包含两个对象,一个是s,一个是new String(b);
s.equals("1");其中“1”在在内存中被分配一块内存,new String(b)(new String("1")):在内存中是另一块内存,而s指向的是new String("1")这块内存,而不是“1”这块内存,所以返回false
3.内存图解释如下:

从图上可以很清楚的看出为什么结果为false了,
如果你的代码改成如下:
public class test {
public static void main(String[] args) {
  byte[] b = new byte[3];
  try {
   System.in.read(b);
  } catch (Exception e) {
  }// 当输入 1 时
  String s = "1";      
  System.out.println(s); // 显示结果为 1
  
  System.out.println(s.equals("1"));// 结果为false
}
}
此时的结果则返回true,因为此时s指向了“1”这块内存
如图:

多研究一下,对象在内存中的分配情况,其实这类的问题很容易明白。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
黑马吕世成 来自手机 中级黑马 2012-11-13 21:32:57
藤椅
邵天强 发表于 2012-11-13 20:40:06
本帖最后由 邵天强 于 2012-11-13 20:50 编辑

1.首先你要了解String,String被final修饰,内容是不能被更改的。
2.String s=new String(b

string的equals方法已经覆写过了,比较的是内容与地址无关。还有就是你想说string对象不可变吧!这个你再好好去理解下!关于string对象的构造函数你也看看!来自: Android客户端

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
呵呵,谢谢指正,刚才我仔细看来以下,你在定义的byte[]b=new byte[3]时,定义的长度为3
而你用键盘输入时只输入了1,而在内存中已经给你分配了三个内存空间,程序会默认给你补全,看如修改下代码:
package com.itheima;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class test {
public static void main(String[] args)
{
byte[] b = new byte[3] ;
try{System.in.read(b);}catch(Exception  e){}//当输入 1 时

String s = new String(b);
    System.out.println(s.length());
System.out.println(s); //显示结果为 1
System.out.println("1".length());
System.out.println(s.equals("1"));//结果为false
}

}
结果如下:

上面的结果显示s的长度为3,而“1”的长度为1,那结果自然不相同了
如果把代码改成:
package com.itheima;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class test {
public static void main(String[] args)
{
byte[] b = new byte[1] ;
try{System.in.read(b);}catch(Exception  e){}//当输入 1 时

String s = new String(b);
    System.out.println(s.length());
System.out.println(s); //显示结果为 1
System.out.println("1".length());
System.out.println(s.equals("1"));//结果为false
}

}
结果如下:

欢迎再次指正,让我们共同努力

回复 使用道具 举报
黑马吕世成 来自手机 中级黑马 2012-11-14 01:38:46
报纸
邵天强 发表于 2012-11-13 22:00:16
呵呵,谢谢指正,刚才我仔细看来以下,你在定义的byte[]b=new byte[3]时,定义的长度为3
而你用键盘输入时只输入了1,而在内存中已经给你分配了三个内存空间,程序会默认给你补全,看如修改

亲,你太有才了。不过如果是这样,那通过字节流读入有点局限了。谢谢了来自: Android客户端
回复 使用道具 举报
在java中,object中的“==”和equals方法是一样的,比较的都是地址值,但是String类、Integer等类,覆写了equals方法。
回复 使用道具 举报
{:soso_e194:}ooooooooo
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马