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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马张涛 中级黑马   /  2012-7-18 17:45  /  2047 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马张涛 于 2012-7-18 20:25 编辑

如下代码
public class StringMethods {

public static void main(String[] args)
{
  String s="Hello Java";
  String s1=s.replace("Java", "viva");
  String s2=s.replace("", "e");
  sop(s);
        sop(s1);
  sop(s2);
}
public static void sop(Object obj)
{
  System.out.println(obj);
}
}
打印结果为:
Hello Java
Hello viva
eHeeeleleoe eJeaeveae  //为什么会出现这个结果?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
本帖最后由 张_涛 于 2012-7-18 18:06 编辑

我是看楼主进来的。
String s2=s.replace("", "e");
改成
String s2=s.replace(" ", "e");
至于你的程序每个字符之间为什么会都加个e,不清楚为什么,一般不会这么用的。

点评

同名同姓,握手!  发表于 2012-7-18 20:29
回复 使用道具 举报
楼主应该是想把空格换成e把,就跟楼上的说的一样的。
经过我刚才的测试。无论你拿什么字符串去调用你这个把双引号里的空东西换成别的任何字符。
都会出现跟你一样的结果。所以我觉得应该是java里面的一种规定吧,把字符串中两相隔的任何两个字符用
""隔开。当你替换时它就能找到这个并将他替换掉。
回复 使用道具 举报
不懂啊···
回复 使用道具 举报
如果想分析上面的问题可以先看一下方法:
  1. public static void test(){
  2.                  String str1 = "Hello Viva";
  3.                  String st[] = str1.split("");
  4.                  for(String s:st){
  5.                          System.out.println(s);
  6.                  }
  7.          }
复制代码
先定义一个字符串,然后用""来将字符串分割,然后就会得到一个数组。现在就可以这样理解,每一个组成字符串的字母之间都会包含一个""字符。要不然就不会用split来分割出来数组。再看看楼上的代码:

  1. public class StringMethods {

  2.         public static void main(String[] args)
  3.         {
  4.            String s="Hello Java";
  5.            String s1=s.replace("Java", "viva");
  6.            String s2=s.replace("", "e");
  7.            sop(s);
  8.            sop(s1);
  9.            sop(s2);
  10.          }
  11.          public static void sop(Object obj)
  12.          {
  13.            System.out.println(obj);
  14.          }
  15.          
  16. }
复制代码
刚开始s为Hello java,在执行完 String s1=s.replace("Java", "viva");语句之后,现在s1为Hello viva 。然后再执行“String s2=s.replace("", "e");” 当执行replace("","e")时,刚开始第一段代码说过了,每一个组成字符串的字母之间都会包含一个""字符,所以就会将每个""替换成字母“e”,那么结果为也就是eHeeeleleoe eJeaeveae在每个字母之间添加一个e

点评

明白了,多谢!  发表于 2012-7-18 20:21

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. public class StringMethods
  2. {

  3. public static void main(String[] args)
  4. {
  5.   String s="Hello Java";
  6.   String s1=s.replace("Java", "viva");
  7.   String s2=s.replace(" ", "e");
  8.   sop(s);
  9.   sop(s1);
  10.   sop(s2);
  11. }
  12. public static void sop(Object obj)
  13. {
  14.   System.out.println(obj);
  15. }
  16. }
复制代码
结果:
  1. Hello Java
  2. Hello viva
  3. HelloeJava
复制代码
当引号之间没有任何东西时,它就把所有的字符前后没有空间的地方替换(也就是添加)成了e,
当引号之间有东西时,它会把引号之间的东西替换成后面引号里的e,

要是要网更深层了解,有兴趣的话去看下源码。

希望对你有帮助!
回复 使用道具 举报
应文 中级黑马 2012-7-18 19:23:34
7#
本帖最后由 应文 于 2012-7-18 19:29 编辑

[code]public class StringMethods {

public static void main(String[] args)
{
  String s="Hello Java";
  String s1=s.replace("Java", "viva");
  String s2=s.replace("", "e");       //注意看这个地方:""是空字符串,"" 不等于" "
  sop(s);
        sop(s1);
  sop(s2);
}
public static void sop(Object obj)
{
  System.out.println(obj);
}
}
打印结果为:
Hello Java
Hello viva
eHeeeleleoe eJeaeveae  

出现这个结果是因为""是一个空的字符串(String),但是它在内存中是存在的,是被分配内存空间的,即它占用内存空间(这也是实际存储大小要大于理论大小的原因),它是可以使用Object对象中的方法(如"".toString()) 。。
所以,其实,"HELLO JAVA"在内存中其实是"空字符串H空字符串E空字符串L空字符串L空字符串O空字符串 空字符串J空字符串A空字符串V空字符串A空字符串"(即是被''空字符所包围的)。。
当你使用replace()方法时,你替换的应该是""空字符串,结果就是eHeeeleleoe eJeaeveae  。。
如果是想替换空格的话,就使用" "而不是""。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马