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

© 梁珍珍 初级黑马   /  2013-7-18 22:55  /  1272 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 梁珍珍 于 2013-7-18 23:01 编辑
  1. public class Test {
  2.                 public static void main(String[] args) {
  3.                         String s = "abc";
  4.                         s.substring(1);
  5.                         s.replace("bc", "xyz");
  6.                        System.out.println(s);
  7.                        String value = new String ("abc");
  8.                        System.out.println(s == value);
  9.                 }
  10.        }
复制代码
这个最后为什么答案是  abc  和 false???求解!

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

6 个回复

倒序浏览
本帖最后由 白堇翎 于 2013-7-18 23:07 编辑

首先substring需要指定第几个字符和第几个字符换 你只写了个1 没有a指定和谁换 所以就没有换成
replace只能替换字符(char类型)而你写的是字符串 当然也不能换
所以你的第一次打印结果没有变

最后你new了一个新的String类型的字符串value 他指向的是堆内存中的abc
而你的s指向的是常量池中的abc
==比较的是引用对象 但是你这里的value和abc引用的对象不同所以返回结果是false

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
白堇翎 发表于 2013-7-18 23:05
首先substring需要指定第几个字符和第几个字符换 你只写了个1 没有a指定和谁换 所以就没有换成
replace只能 ...

看了API和你说的有点出处

substring
public String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾。
示例:

"unhappy".substring(2) returns "happy"
"Harbison".substring(3) returns "bison"
"emptiness".substring(9) returns "" (an empty string)

参数:
beginIndex - 起始索引(包括)。
返回:
指定的子字符串。
抛出:
IndexOutOfBoundsException - 如果 beginIndex 为负或大于此 String 对象的长度。
回复 使用道具 举报
本帖最后由 白堇翎 于 2013-7-18 23:42 编辑

那这一行应该改成根据描述  是返回了一个字符串 但是你没有接受
String s1 = s.substring(1);
再打印下s1看就知道了

我直接帮你改下好了 你应该是想要这种效果
  1. class Test {
  2.         public static void main(String[] args) {
  3.                 String s = "abc";
  4.                 String s1 = s.substring(1);
  5.                 s = s.replace("bc", "xyz");
  6.                 System.out.println(s);
  7.                 System.out.println(s1);
  8.                 String value = new String("abc");
  9.                 System.out.println(s == value);
  10.         }
  11. }
复制代码
回复 使用道具 举报
你截取完了以后不重新赋值, 默认当然还是原来那个值拉..

String s1 = new String("abc")  //在内存空间中重新开辟了一个堆区是String 类型  栈区值为 abc;  比如内存地址是0x 9998

String s = "abc";  //在内存空间中重新开辟了一个堆区是String 类型  栈区值为 abc;  比如内存地址是 0x9999

== 是比较他们的地址值.. 0x 9998   能恒等于 0x 9999 吗?

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
public class Test{

        public static void main(String[] args){
       
                String s1 = "abc";
               
                //从字符的index=1开始截取,存入s2中
                String s2 = s1.substring(1);
               
                //显示s2中内容 s2 = bc;
                System.out.println(s2);
               
                //将s2中内容替换
                String s3 = s2.replace("bc","xyz");
               
                //显示s3——s3 = xyz;
                System.out.println(s3);

                //新建字符串对象newS1 —— 创建两个对象一个存在于堆内存中;
                String newS1 = new String("abc");;

                // 操作符 == 比较的是地址值;其中s1存在于常量池,因此为flase
                System.out.println(s1 == newS1);

                //equals()方法比较的是两对象内容
                System.out.println(s1.equals(newS1));
        }
}
回复 使用道具 举报

  1. public class Show{

  2.         public static void main(String[] args){
  3.        
  4.                 String s1 = "Welcome to Java";
  5.                 String s2 = new String("Welcome to Java");
  6.                 String s3 = "Welcome to Java";
  7.                
  8.                 System.out.println(s1 == s2);// 显示false
  9.                 System.out.println(s1 == s3);// 显示true

  10.                 /*
  11.                  * 内存中存在一个字符串缓冲区,类似理解为字符串缓冲区;

  12.                  * 用双引号内的字符序列为直接量创建的字符串,存在于内存的字符串常量池中。
  13.                  * 用直接量新建一个字符串对象,JVM就会到常量池中去寻找,如果没有就创建一个。
  14.                  * 如果匹配那么就把已有字符串对象引用地址传递给新建对象。它们指向同一个地址值。

  15.                  * 而用new操作符创建的对象,在堆内存中创建一个对象,并把地址传递给变量
  16.                  *
  17.                  
  18.                  * 操作符 == 比较两对象的地址值
  19.                  * 方法equals()根据字符串特点进行了覆写与Object类中的equals()方法不同,它比较两字符串对象的内容。  
  20.                  */                 

  21.                 System.out.println(s1.equals(s2));// 显示true

  22.                 s1 = "Hello Java";// 原来字符串中String s1 = "Welcome to Java" s1 的内容并没有更改,只是变量引用值s1指向新的对象地址;

  23.                 System.out.println(s1 == s3);// 显示false
  24.                 System.out.println(s2.equals(s3)); //显示true
  25.                 System.out.println(s2 == s3); //显示false
  26.         }
  27. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马