黑马程序员技术交流社区

标题: 请教一个有关String类的一个小问题,有点不解? [打印本页]

作者: 滔哥    时间: 2014-8-20 13:59
标题: 请教一个有关String类的一个小问题,有点不解?
问题类型:
java
问题描述:

@在第一次出现的时候是在3的位置,这个没错,可是在后面的时候我又创建了@的位置,

为什么在最后一次出现@的位置还是3了,请问这是为什么,不是说最后一次出现的位置吗?因该是2才对啊!
  1. String s1 = "gdh@qq.com";

  2. System.out.println(s1.substring(1,4));//包含1但不包含4;

  3. System.out.println(s1.indexOf("@"));

  4. System.out.println(s1.substring(2,6));
  5. System.out.println(s1.lastIndexOf("@")); //最后一个出现的位置;
复制代码




作者: masai158    时间: 2014-8-20 13:59
因为String是不可变的,无论你怎么截取,s1还是原来的s1,除非你把截取的新字符串重新赋值给另一个变量,否则,s1永远都是最原始的s1

作者: GoodMorning    时间: 2014-8-20 14:08
因为每次操作都没有赋值给s1,所以s1的值为gdh@qq.com,即@的位置还是3
作者: 周峰峰    时间: 2014-8-20 14:09
因为s1的值从来没变过
作者: 不再上网    时间: 2014-8-20 14:12
substring的方法必须要赋值给那个变量后,才生效。等用=号接收才生效的(s1=s1.substring(1,4));

作者: lonlywalker    时间: 2014-8-20 14:12
在Java中string一旦定义就不可变。。
作者: 她只是过客    时间: 2014-8-20 14:13
总共就一个@ ,,最后一次出现的位置号不是和第一次出现的位置一样吗,是3,,不是2
作者: 塞肥肥塞牙人    时间: 2014-8-20 14:14
String一定义就不会再改变   而且从来没有给S1赋过值
作者: 她只是过客    时间: 2014-8-20 14:18
代码没有重新创建@的位置,用的一直都是源代码S1
作者: 余攀    时间: 2014-8-20 14:21
涛哥,好问题,哈哈哈!

s1.substring(1,4) 是截取字符串“gdh@qq.com”,结果gh@q

05.System.out.println(s1.indexOf("@")); 这个结果是获取@位置是3,那为什么呢?因为他是从s1("gdh@qq.com")里面获取的,而不是从s1.substring(1,4)这个截取的值(即gh@q)里面取的,所以结果不是2;

同理,下面那个s1.substring(2,6)取的值是h@qq.c  ,那08.System.out.println(s1.lastIndexOf("@"));结果还是3呢,因为他获取的值是从s1(“gdh@qq.com”)里面取的,而不是从h@qq.c里面取,所以还是3,不是2;

那为什么会这样呢,因为,每次截取的字符串并没有赋值,意思是没有覆盖了原来的s1,所以,整个过程s1的值都没变,都是字符串“gdh@qq.com”;

如果每次将截取的值赋值给s1, 即s1 =s1.substring(1,4);或s1 =s1.substring(2,6);,像这样的话,结果就是楼主所说的情况了;



作者: 滔哥    时间: 2014-8-20 14:36
余攀 发表于 2014-8-20 14:21
涛哥,好问题,哈哈哈!

s1.substring(1,4) 是截取字符串“”,结果gh@q

测试这个功能啊!
作者: 刘瑞    时间: 2014-8-20 15:00
不错,就是这样的
作者: 不想飞不到    时间: 2014-8-20 17:31
你只是使用方法截取了String对象的一部分,并没有把返回的对象指向s1,所以s1还是指向初始化时的字符串对象
作者: 一顿一只牛    时间: 2014-8-20 18:11
String s1 = "gdh@qq.com";  String初始化之后就不能改变值了
作者: 刘瑞    时间: 2014-8-20 19:57
绕来绕去都是一样的,S1没有变化,@只出现了一次,都是3角标的位置
作者: 0小菜鸟0    时间: 2014-8-20 23:10
呵呵 ,你知道S1的值并没有改变吗,你要这样写String s1 = s1.substring(2,6)这样就会改变;变量是要重新赋值的,你截取的是一个字符串,但是没有赋值给原来的变量
作者: Louis.hui    时间: 2014-8-21 14:45
以为去字符串是是从零开始,“@”下标数是3,所以就是3了
作者: 奋发吧小白    时间: 2014-8-21 16:22
你也是新手?
作者: 笑脸迷人    时间: 2014-8-22 11:03
对于s1调用它的函数subString,replace等方法,这些方法的返回值并没有赋值给s1
那么
s1这个String类型的指针并没有改变位置,他依然指向着常量池中"gdh@qq.com"的位置,
作者: lfs454766767    时间: 2014-8-23 09:47
s1 一直都没变化吧!
作者: MeryStyle    时间: 2014-8-24 06:05
将操作后的结果保存到一个 String类型的字符串中,然后再对这个字符串进行操作会得到你想要的答案。因为对原字符的操作并不影响它自身,而是将其结果保存到其它变量,这样也起到了保护原字符串的作用。
作者: 夜半风    时间: 2014-8-24 20:51
直接上代码
String s1 = "gdh@qq.com";
System.out.println(s1.substring(1,4).indexOf("@"));
System.out.println(s1.substring(2,6).lastIndexOf("@"));
作者: 夜半风    时间: 2014-8-24 20:53
夜半风 发表于 2014-8-24 20:51
直接上代码
String s1 = "gdh@qq.com";
System.out.println(s1.substring(1,4).indexOf("@"));

结果是
2
1
作者: dba_hotmail    时间: 2014-8-27 17:48
s1又没有重新赋值没有任何修改
作者: lfsfxyzljhm    时间: 2014-8-27 18:11
这位同学,我想说你可能把subString()这个方法理解错了,s1.subString()并没有改变s1这个字符串。其实这样写就是你想要的答案:2 了    如下:s2=s1.subString(2,6);System.out.println(s2.lastIndexof('@'))。
作者: 左脑想你    时间: 2014-8-27 20:04
String是有返回值的每次操作都是产生新的字符串,老的字符串是不变的呀
作者: 淡调调/ka    时间: 2014-8-29 22:51
S1从一开始被赋值:String s1 = "gdh@qq.com"  之后从来都没变过,之后都是打印的截取的子串。楼主可以看一下相关的API文档。  既然S1一直都是“gdh@qq.com”,那么最后出现@的位置当然是角标3咯。:P
作者: 欢欢    时间: 2014-8-30 18:34
好长时间没来论坛了,论坛变得越来越人性化了!
作者: bfl625    时间: 2014-8-31 17:45
首先解释一下substring(),返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。调用substring方法后,原字符串并不改变。
另外就是lastIndexOf()返回指定子字符串在此字符串中最右边出现处的索引,从后面开始查找,但是返回的还是该字符串的索引,而不是从后面开始数!所以调用indexOf()和lastIndexOf()的返回值是相同的。
作者: Mr.JUN    时间: 2014-11-4 13:59
给我点分好不?




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