2
回答
java中正则表达式在替换时用appendReplacement和replaceAll有什么区别
替换原理是怎么样的,都在什么情况下使用
举报
happylifelx
发帖于4年前 2回/1K+阅
共有2个答案 最后回答: 4年前

跑下这段程序你就明白了

public static void main(String[] args){
        Pattern p = Pattern.compile("java");
        Matcher m = p.matcher("java java java");
        StringBuffer sb = new StringBuffer();
        if(m.find()){
            m.appendReplacement(sb,"python");
        }
        System.out.println(sb);

        if(m.find()){
            m.appendReplacement(sb,"python");
        }
        System.out.println(sb);

        if(m.find()){
            m.appendReplacement(sb,"python");
        }
        System.out.println(sb);

        System.out.println(m.replaceAll("c++"));
    }



--- 共有 3 条评论 ---
happylifelx回复 @yearh : 恩恩,懂了,谢啦呵呵 4年前 回复
yearh回复 @happylifelx : 你可以看下replaceAll的源代码,其实内部也是通过appendReplacement来实现的,所以性能应该是一样的 4年前 回复
happylifelx那就是说appendReplacement是逐段匹配替换添加到缓冲区,replaceAll是一下子全部替换后返回,我说的准确吗?后者更常用,不过对于长文本替换时哪个效率更高呢? 4年前 回复
appendReplacement()是把字符串放到缓冲区操作的,整体操作之后返回的! 
replaceAll()则是一个一个的来进行拆分比较的.
当然你指的是java的
要注意replace   在js中只替换第一个注意要用全局正则
String 跟StringBuffer 是不一样的
String 长度不可变 线程不安全 
StringBuffer 长度可变 安全
长度是说jvm 初始化的长度
String 初始化之后如果想改变对象,那么jvm相当于新开辟了内存堆栈付给对象 原来的内存被废止掉
而 StringBuffer 是在原来的堆栈(内存地址)前后直接增加或减少内存  那么指向的还是原来的那片内存
所以要养成习惯  在做字符串的增加减少的时候 习惯用StringBuffer去做
常用的地方就是sql语句形成
两个都关联了效率问题 
当然现在大公司都会要求性能  要养成良好的习惯 对你有帮助
顶部