J2SE应用:JAVA语言关于字符串替换的思考

2016-02-19 20:59 5 1 收藏

有了下面这个J2SE应用:JAVA语言关于字符串替换的思考教程,不懂J2SE应用:JAVA语言关于字符串替换的思考的也能装懂了,赶紧get起来装逼一下吧!

【 tulaoshi.com - 编程语言 】

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

先来看我的代码:

Newsdetialsnt=(Newsdetials)ntIter.next();

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

Stringcontent=nt.getContent();

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

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

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

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

程序解释:

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

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

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

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

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

Newsdetialsnt=(Newsdetials)ntIter.next();

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

Stringcontent=nt.getContent();

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

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

Stringcontent0=content.replaceAll(""","'");

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

程序解释:

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

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

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

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

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

publicStringreplaceAll(Stringregex,Stringreplacement){

returnPattern.compile(regex).matcher(this).replaceAll(replacement);

}

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

publicStringreplaceAll(Stringreplacement){

reset();

booleanresult=find();

if(result){

StringBuffersb=newStringBuffer();

do{

appendReplacement(sb,replacement);

result=find();

}while(result);

appendTail(sb);

returnsb.toString();

}

returntext.toString();

}

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

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

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

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

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1624987.html

延伸阅读
1.创建对象   对于java程序中的 字符串直接常量 ,JVM会使用一个字符串池来保存它们。当第一次使用某个字符串直接常量时,JVM会将它放入字符串池中进行缓存。在一般情况下,字符串池中的字符串对象不会被垃圾回收。当程序再次需要使用该字符串时,无需重新创建一个新的字符串就可以直接让引用变量直接指向字符串中已有的字符串。而 使用n...
标签: Web开发
jce.jar security/US_export_policy.jar security/local_policy.jar ext/sunjce_provider.jar Java运行时会自动加载这些包,因此对于带main函数的应用程序不需要设置到CLASSPATH环境变量中。对于WEB应用,不需要把这些包加到WEB-INF/lib目录下。 以下是java中调用sun公司提供的3DES加密解密算法的样本代码: 代码如下: /*字符串 DESede(...
方法1:采用String的split,验证代码如下: import java.util.Arrays; public class TestSplit {  public static void main(String[] args) {   String orignString = new String("5,8,7,4,3,9,1");   String[] testString = orignString.split(",");   int[] test = { 0, 0, 0, 0, 0, 0, ...
项目要求: 计算一个字符串的长度(对日项目VB.NET) 以前的代码找不到了只能自己写一下了(找到了别人的代码觉得有点麻烦,没用) String.prototype.isBytes = function() {  'var cArr = this.match(/[^x00-xff|uff61-uff9f]/ig); 'return (cArr==null ? true : false);} 上面这段代码是我在JAVA项目里找...
在datagrid中,数据绑定时,怎么把数据库中的字符串按照自己设定的方式进行输出是个比较麻烦的事 这个问题困扰了我很久,也试着使用了很多方法: 1。 浏览器可以根据 的属性自动把回车符进行换行,但没有回车的段落就成了长长长长的一大行了,n久也没有解决这个矛盾,因为在 中浏览器强制把字符串同行输出,而没有自动换行。 2。用控件来装...

经验教程

37

收藏

60
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部