黑马程序员技术交流社区

标题: 一个关于String的比较简单的问题额! [打印本页]

作者: 黑马吕世成    时间: 2012-11-13 18:22
标题: 一个关于String的比较简单的问题额!
本帖最后由 黑马吕世成 于 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了,是不是缺了什么?百度好久也没看出点什么
作者: 邵天强    时间: 2012-11-13 20:40
本帖最后由 邵天强 于 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”这块内存
如图:

多研究一下,对象在内存中的分配情况,其实这类的问题很容易明白。
作者: 黑马吕世成    时间: 2012-11-13 21:32
邵天强 发表于 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对象的构造函数你也看看!
作者: 邵天强    时间: 2012-11-13 22:00
呵呵,谢谢指正,刚才我仔细看来以下,你在定义的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
邵天强 发表于 2012-11-13 22:00:16
呵呵,谢谢指正,刚才我仔细看来以下,你在定义的byte[]b=new byte[3]时,定义的长度为3
而你用键盘输入时只输入了1,而在内存中已经给你分配了三个内存空间,程序会默认给你补全,看如修改

亲,你太有才了。不过如果是这样,那通过字节流读入有点局限了。谢谢了
作者: 王震阳老师    时间: 2012-11-14 08:42
在java中,object中的“==”和equals方法是一样的,比较的都是地址值,但是String类、Integer等类,覆写了equals方法。
作者: jerry2627    时间: 2012-11-14 16:09
{:soso_e194:}ooooooooo




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2