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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马戴帅军 中级黑马   /  2013-10-3 19:30  /  2196 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马戴帅军 于 2013-10-4 14:30 编辑
  1. String s = "abc";//定义一个字符串类型s赋值为abc。
  2.             s.substring(1);//将字符串从1角标获取出来。
  3.             
  4.             s.replace("bc", "xyz");//将字符串中的bc用xyz替换。
  5.             
  6.            System.out.println(s);
复制代码
上面的代码,第二行和第三行没有执行到,这是个获取问题,获取是只获取而不改变字符串本身吗?毕老师视频里也有说字符串一旦创建就不能修改了,那么第二行和第三行的代码只有写在打印结果里才用用吗?如果要改变字符串的值,就是打印的结果,必须将方法写在打印的括号中吗?写在代码中是没有用的对吗?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

11 个回复

倒序浏览
本帖最后由 陈钦涛 于 2013-10-3 20:03 编辑

上面的代码,第二行和第三行没有执行到,这是个获取问题,获取是只获取而不改变字符串本身吗?是的,上面的String类型的“abc”创建后就不可更改,如果想更改的话就用StringBuilder或者StringBuffer来构造”abc“。第二行第三行的方法分别会有一个截取后和替换后的字符串类型的返回值,你用一个字符串类型的变量来引用吧,然后就可以在代码中其他地方就可以引用了。你只是把截取和替换的方法写出来,没有用打印语句输出它们的返回值的话是不会直接打印出来的。
            String s = "abc";
            String s1=null,s2=null;         
            s1= s.substring(1);
            System.out.println(s1);
            s2=s.replace("bc", "xyz");
            System.out.println(s2);
            System.out.println(s);

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
  1.         String s = "abc";//定义一个字符串类型s赋值为abc。
  2.      String s1=   s.substring(1);//将字符串从1角标获取出来。
  3.         
  4.       String s2=  s.replace("bc", "xyz");//将字符串中的bc用xyz替换。
  5.         
  6.        System.out.println(s);
  7.        System.out.println(s1);
  8.        System.out.println(s2);
  9. 只要改变字符串长度或内容,改变之后的字符串就不是原来的字符串,必须定义新的引用指向新的字符串
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
subString()该方法返回值类型为String,这时在堆内存中生成一个新字符串对象, 但是该字符串对象你根本就没有指向那个类类型变量,所有你打印s,这两句是不会执行的,因为你根本没有调用,在replace()方法也是一样。 所有你打印原s结果为原来的字符串,  如果你这样修改, s= s.substring(1);  s=s.replace("bc", "xyz");这样运行的结果才为xyz, 才会运行这两句的

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
Simple_love 发表于 2013-10-3 20:07
subString()该方法返回值类型为String,这时在堆内存中生成一个新字符串对象, 但是该字符串对象你根本就没 ...

第二句和第三句没有调用的话,怎么解释呢?是不是没有等号就没有赋值呀。
回复 使用道具 举报
哥么,基础要加强点,你的String s 自始至终没有改变啊
我知道你的意图:见下面的代码,是你想要的结果
public class temp
{
        public static void main(String[] args)
        {
                String s = "abc";//定义一个字符串类型s赋值为abc。
        String s1 = s.substring(1);//将字符串从1角标获取出来。
        String s2 = s.replace("bc", "xyz");//将字符串中的bc用xyz替换。
                System.out.println(s);
                System.out.println(s1);
                System.out.println(s2);
        }
}


我没有运行,但我可以告诉你结果
abc
bc
axyz

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
黑马戴帅军 发表于 2013-10-3 20:10
第二句和第三句没有调用的话,怎么解释呢?是不是没有等号就没有赋值呀。
...

使用subString()方法, 就在堆内存中生成新的字符串对象, 但是该字符串对象在内存中存在, 又没有指向那个类类型变量, 当你打印s是, 他调用的还是原来的那个"abc"的对象, 而不是调用新的字符串对象, 我是这样的意思
回复 使用道具 举报
麦子 发表于 2013-10-3 20:17
哥么,基础要加强点,你的String s 自始至终没有改变啊
我知道你的意图:见下面的代码,是你想要的结果
pub ...

多谢,明白了。我是今天才看到String类的,有不明白的就来问问,顺便赚点技术分。
回复 使用道具 举报
仔细看好API。每个返回值类型都是String 类型的,代表都重新有了一个值,一般void都是直接对调用者生效,而返回值类型为其他的都是有一个值的,需要定义一个这个返回值类型的参数来接收。
建议多多看好API,要会看,并且要理解

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
  1. String s = "abc";//定义一个字符串类型s赋值为abc。
  2. s.substring(1);//将字符串从1角标获取出来。
  3. s.replace("bc", "xyz");//将字符串中的bc用xyz替换。
  4. System.out.println(s);
  5. 输出结果:abc
复制代码

改为如下这样就可以了
  1. String s = "abc";//定义一个字符串类型s赋值为abc。
  2. String s1 = s.substring(1);//将字符串从1角标获取出来。
  3. String s2 = s.replace("bc", "xyz");//将字符串中的bc用xyz替换。
  4. System.out.println(s);
  5. System.out.println(s1);
  6. System.out.println(s2);

  7. 输出结果:
  8. abc
  9. b
  10. axyz
复制代码
说明:对字符串s进行了方法操作,但是你没有把操作结果用一个新的变量记录下来。希望你能理解ok~~~~~~~~~~



评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
String中的substring方法是返回另外的一个子字符串,而不是对原来的s字符串进行修改,同样的replace也是返回一个新的字符串,替代原来的内容;你二,三行肯定有执行到,只是你没有保存执行的结果而已
  1. String s = "abc";
  2.                System.out.println(s.substring(1));
  3.                
  4. System.out.println (s.replace("bc", "xyz"));
  5.                
  6. System.out.println(s);
复制代码
这样修改的代码就可以验证二,三行的执行结果

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
如果问题已经解决,请重新编辑帖子,修改帖子的主题分类为“提问结束”{:soso_e181:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马