`
alex8946
  • 浏览: 359219 次
  • 性别: Icon_minigender_1
  • 来自: 广东广州
社区版块
存档分类
最新评论

java进阶之字符串替换的思考

阅读更多

最近在开发的过程中用到了字符串的替换, 本来觉得挺简单的问题,却总也解决不了。字符串明明是替换了,却总也输出不了正确结果,很是郁闷,到底是为什么呢?

先来看我的代码:

Newsdetials nt=(Newsdetials)ntIter.next();

System.out.println("新闻明细记录 "+nt);

String content=nt.getContent();

System.out.println("新闻的内容是 : "+content);

//转换字符串中的双引号为单引号

content.replaceAll("\"","'");

System.out.println("替换后的字符传是: "+content);

程序解释:

程序的前部分是通过迭代器来遍历新闻的明细记录。

我的目的是想用双引号来替换掉字符串中的单引号。

以上是我开始使用的方法,我输出的结果是什么呢?也许你会和我当初的想法相同?输出的是替换后的内容。

答案是错的。输出的内容和其替换前的内容相同。明明替换了,这是为什么呢?我也是好久都没找到答案。

一个偶然的机会,让我实现了我的目的。我的实现如下:

Newsdetials nt=(Newsdetials)ntIter.next();

System.out.println("新闻明细记录 "+nt);

String content=nt.getContent();

System.out.println("新闻的内容是 : "+content);

//转换字符串中的双引号为单引号

String content0=content.replaceAll("\"","'");

System.out.println("替换后的字符传是: "+content0);

程序解释:

这一段代码看上去和前段相同,但却实现了我的目的。

 

我很是不解,就看了一下源代码,才发现其中的奥妙。我们分析一下上面的两段程序:

唯一的不同点是:后者将替换后的字符串赋给了另一个字符串变量,也就是说将替换后的字符串取出,而前者没有。也就是这一点导致了结果的不同。

于是我就查看了其实现的源代码:

我们来看String的replaceAll()方法的实现:

public String replaceAll(String regex, String replacement) {

return Pattern.compile(regex).matcher(this).replaceAll(replacement);

}

我们可以看到,其最终是调用了matcher(this).replaceAll(replacement)方法来实现的,我们看其是怎么实现的:

public String replaceAll(String replacement) {

reset();

boolean result = find();

if (result) {

 

StringBuffer sb = new StringBuffer();

 

do {

appendReplacement(sb, replacement);

result = find();

} while (result);

appendTail(sb);

return sb.toString();

}

return text.toString();

}

 

看这一段代码让我们明白了一切:

我们知道在java中,如果传递的是对象,那么是址传递,所以让我们以为,让原字符串替代后就可以了。同时我们调用了该字符串的替代方法,直接就修改了其串的值。

上面的代码告诉我们,错了。

因为粗体的部分产生了一个新的对象:StringBuffer的一个实例,而返回的是他的串值,而不是原来的content。

到此,你是否也弄明白了呢?? 

分享到:
评论

相关推荐

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    9.2.7 替换字符串中的内容 226 9.2.8 String对象——磐石刻字 227 9.3 String类的最佳拍档——StringBuffer类 227 9.3.1 StringBuffer:专业操纵字符 228 9.3.2 String和StringBuffer一个都不能少 229 9.4 最...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    9.2.7 替换字符串中的内容 226 9.2.8 String对象——磐石刻字 227 9.3 String类的最佳拍档——StringBuffer类 227 9.3.1 StringBuffer:专业操纵字符 228 9.3.2 String和StringBuffer一个都不能少 229 9.4 最...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例076 批量替换某一类字符串 95 实例077 把异常与错误信息显示到窗体中 97 实例078 从字符串中分离文件路径、 文件名及扩展名 98 实例079 判断手机号的合法性 99 实例080 用字符串构建器追加字符 100 实例081 去掉...

    Linux C程序设计大全

    3.7.5 关于printf函数的疑问——缺少字符串地址参数 第4章 C语言中的指针与字符串 4.1 sizeof运算符 4.1.1 sizeof运算符的应用——得到内置类型的大小 4.1.2 sizeof运算符的应用——得到复合类型的大小 4.2 指针的...

    xheditor-1.1.14

    说明:这个函数执行时返回的值为上传程序返回的msg变量,可能为字符串或者数组,若为字符串则直接代表url,若是数组,则必需包含一个url的变量,其它可由可开发者自定义 备注:1.0.0 beta2新添加 plugins:自定义...

    HTML开发王

    3.5.5 文本字符串 3.5.6 使用uri 3.5.7 使用颜色 3.5.8 使用长度 3.5.9 内容类型(mime类型) 3.5.10 语言代码 3.5.11 字符编码 3.5.12 单字符 3.5.13 日期和时间 3.5.14 链接类型 3.5.15 介质描述符 3.5.16 脚本数据 ...

Global site tag (gtag.js) - Google Analytics