黑马程序员技术交流社区

标题: string类的问题 [打印本页]

作者: 傲鸽    时间: 2013-7-1 22:06
标题: string类的问题
  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.        }
复制代码
写出以下代码执行结果,分析为什么?
作者: 肥猫    时间: 2013-7-1 22:16
本帖最后由 肥猫 于 2013-7-1 22:37 编辑

首先,你那个substring用法错了.举个例子应该这么用substring(1,3);
第二Srting类其大多数方法都是final的,并不将子字符串返回覆盖原字符串,这里你重新给S赋值就行了s =s.replace("bc","xyz");当然要是你够犀利完全可以玩转StringBuffer.
第三,假设你不需要原字符串改变,只是想问两个ABC为啥返回false,那么原因在于value后面那个new.哈哈同一个问题说多了就没意思了.
作者: liguangcaiup    时间: 2013-7-1 22:35
输出结果
abc
false
首先字符串被定义后是不能改变的,System.out.println(s);  输出的是abc
s.replace("bc", "xyz");  s中的内容是不会替换的,而是返回新的被替换的字符串。
若String  s1 =s.replace("bc", "xyz");  System.out.println(s1);  输出的是axyz
String value = new String ("abc"); 虽然value和s内容一样,但不是一个对象,所以返回false
若用s1.equals(s) 是比较内容,则返回true。
下面的话希望能解决楼主疑惑:程序在运行的时候会创建一个字符串缓冲池。当使用 s = "abc" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象。在第一次创建后,s先被放到了池中,如果后面创建s1= "abc",程序找到了具有相同值的 s,然后将s1引用s所引用的对象,这时s和s1引用同一个对象,s==s1为true。楼主程序中,使用了 new 操作符,他明白的告诉程序:“我要一个新的!不要旧的!”与是一个新的"abc"Sting对象被创建在内存,这时s和s1引用不同一个对象,s==s1就会为false。


作者: 神之梦    时间: 2013-7-1 22:40
肥猫 发表于 2013-7-1 22:16
首先,你那个substring用法错了.举个例子应该这么用substring(1,3);
第二Srting类其大多数方法都是final的, ...

哥们,你第一点记错了,substring那么用没问题
作者: 肥猫    时间: 2013-7-1 22:47
神之梦 发表于 2013-7-1 22:40
哥们,你第一点记错了,substring那么用没问题

那么用没效果的,没重新给S赋值,而且,你提醒我我又去查了API,这是说明:
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。
示例:

"hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns "mile"

参数:
beginIndex - 起始索引(包括)。
endIndex - 结束索引(不包括)。

作者: ㄗs:/|丶hearts    时间: 2013-7-1 22:51
输出: abc     false
s.substring(1);  s.replace("bc", "xyz"); 这两个方法都是返回一个新的string(也就是结果) ,s并没有改变。
Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。s 和 value 的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。
作者: 神之梦    时间: 2013-7-1 22:59
肥猫 发表于 2013-7-1 22:47
那么用没效果的,没重新给S赋值,而且,你提醒我我又去查了API,这是说明:
返回一个新字符串,它是此字符串的 ...

API中有只传一个参数的substring方法,我明白哥们的意思,我也只是跟哥们说下,substring方法是可以只传一个参数的,没别的意思
String substring(int beginIndex)
          返回一个新的字符串,它是此字符串的一个子字符串。
作者: 肥猫    时间: 2013-7-1 23:04
神之梦 发表于 2013-7-1 22:59
API中有只传一个参数的substring方法,我明白哥们的意思,我也只是跟哥们说下,substring方法是可以只传 ...

哦,呵呵,是我会错意了,真不好意思.,.~~:loveliness:
作者: 神之梦    时间: 2013-7-1 23:08
肥猫 发表于 2013-7-1 23:04
哦,呵呵,是我会错意了,真不好意思.,.~~

没事,因为substring方法有只传一个参数的和可以传两参数的,开始以为是哥们记错了,嘿嘿
多多交流:handshake




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