你没有看错我说的就是那个最常用的java.lang.String,String可以说在Java中使用量最广泛的类了。

但是我却发现我弄错了他的一个API(也可以说是两个API),这个API是关于字符串替换的。

我的错误见解

之前我一直以为String有个API是这样子的,String replace(String oldString, String newString) 用来替换String中的第一个oldString为newString,这可能和我之前做的东西基本山替换的都是单一的字符串有关吧。

但是当我看到队友写的代码int containStringNumber = string.length() - string.replace("containString", "").length(),我认为containStringNumber的值是0或者1,但是我错了。这个结果可能会大于1的。

实际情况

通过API文档可以看出来String有4个替换方法:

1. String	replace(char oldChar, char newChar)
描述:Returns a string resulting from replacing all occurrences of oldChar in this string with newChar.
谷歌翻译:返回使用newChar替换此字符串中所有出现的oldChar而产生的字符串。
2. String replace(CharSequence target, CharSequence replacement)
描述:Replaces each substring of this string that matches the literal target sequence with the specified literal replacement sequence.
谷歌翻译: 将与该文字目标序列匹配的此字符串的每个子字符串替换为指定的文字替换序列。
3. String replaceAll(String regex, String replacement)
描述:Replaces each substring of this string that matches the given regular expression with the given replacement.
谷歌翻译:将给定替换的给定正则表达式匹配的此字符串的每个子字符串替换。
4. String replaceFirst(String regex, String replacement)
描述:Replaces the first substring of this string that matches the given regular expression with the given replacement.
谷歌翻译:将给定替换的给定正则表达式匹配的此字符串的第一个子字符串替换。

是的,String里面根本没有跟那个我自以为是的方法。

第一个方法是替换第一个没错,但是替换的是一个char,不是String。

第二个方法是替换的CharSequence(包括String, StringBuffer, StringBuilder),但是替换的是全部。

第三个replaceAll是替换全部的字符串正则表达式,

第四个是缺实是替换了第一个,但是人家名字写得明明白白的replaceFirst,而且替换的也是正则表达式。

教训与总结

这让我想起来前天的一篇文章《On The Value Of Fundamentals In Software Development 》,英文不好的可以自己翻译下。

我要好好学习Java的API了,白干了四年了,纯属一级菜鸟啊。

java.lang.String中的replace方法到底替换了一个还是全部替换了。的更多相关文章

  1. java.lang.String中的trim()方法的详细说明(转)

    String.Trim()方法到底为我们做了什么,仅仅是去除字符串两端的空格吗? 一直以为Trim()方法就是把字符串两端的空格字符给删去,其实我错了,而且错的比较离谱. 首先我直接反编译String ...

  2. java.lang.String 类的所有方法

    java.lang.String 类的所有方法 方法摘要 char charAt(int index) 返回指定索引处的 char 值. int codePointAt(int index) 返回指定 ...

  3. java:常用类(包装类,equals和==的比较,Date,java.lang.String中常用方法,枚举enum)

    *包装类: 将基本类型封装成类,其中包含属性和方法以方便对象操作. *byte---->Byte *short--->Short *long--->Long *float---> ...

  4. java.lang.Math中的基本方法

    java.lang.Math类提供的方法都是static的,“静态引入 ”使得不必每次在调用类方法时都在方法前写上类名:             import static java.lang.Mat ...

  5. mybatis invalid comparison: java.sql.Timestamp and java.lang.String报错解决方法

    这个错的意思是:java.sql.Timestamp和java.lang.String无效的比较 错误的原因是:拿传入的时间类型参数与空字符串进行比较就会报这个异常 解决方法:只保留非null判断就可 ...

  6. java基础---->String中的split方法的原理

    这里面主要介绍一下关于String类中的split方法的使用以及原理. split函数的说明 split函数java docs的说明: When there is a positive-width m ...

  7. Java的String中的subString()方法

    方法如下: public String substring(int beginIndex, int endIndex) 第一个int为开始的索引,对应String数字中的开始位置, 第二个是截止的索引 ...

  8. java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String错误的解决方法

    mmobjectid是在Oracle数据库中对应的是Number类型的,在JavaBean中定义的是Long类型的. List<BigDecimal> mmobjidAllFromMars ...

  9. java.lang.String里面的trim()方法——删除首尾空格

    结果如图 package com.softeasy.test1; public class String_trim { public static void main(String[] args) { ...

随机推荐

  1. python中的装饰器基本理论

    装饰器 : 本质上 是一个 函数 原则 : 1,不修改原函数的源代码 2,不修改原函数的调用方式. 装饰器的知识储备 装饰器 = 高阶函数 + 函数嵌套 +闭包 我的理解是,函数名也是一个变量,将函数 ...

  2. 资源-DotNet-站点:DotNet 站点列表

    ylbtech-资源-DotNet-站点:DotNet 站点列表 1.ASP.NET Web返回顶部 1.1.问卷星 https://www.wjx.cn/sample/service.aspx 1. ...

  3. jmeter添加自定义扩展函数之if判断

    1,打开eclipse,新建maven工程,在pom中引用jmeter核心jar包,具体请看---https://www.cnblogs.com/guanyf/p/10863033.html---,这 ...

  4. 测开之路十六:@classmethod与@staticmethod

    @classmethod 类方法 和属性一样,所有实例化的对象都共享类方法 @staticmethod 静态方法,可以理解为和类没有任何关系,只是放在了类里面 参数可以任意定义,根据自己的定义传参,也 ...

  5. Hibernate中常用HQL

    HQL是Hibernate自带的查询语言 HQL是一种面向对象的查询语言.SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类.实例.属性等. HQL的语法很像SQL的语法 以下举例均以学生 ...

  6. Java反射实现Servlet处理多个请求--server分发

    import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.serv ...

  7. Linux运维基础采集项

    1. Linux运维基础采集项 做运维,不怕出问题,怕的是出了问题,抓不到现场,两眼摸黑.所以,依靠强大的监控系统,收集尽可能多的指标,意义重大.但哪些指标才是有意义的呢,本着从实践中来的思想,各位工 ...

  8. Cocos2d-x之Array

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. Array是一个列表类容器,是一种线性序列结构:列表容器中的元素是有序的,可以通过下标来访问,就和数组一样.其中Vector也是一种列表容 ...

  9. undefined,null,var 0 = {},var s = '',的区别

    undefined:不清楚变量的类型:var m; null:知道该变量是对象的引用,但是地址为空 var o = {};这是一个对象,有指向地址,但是值为空 var 0 = '';这是一个空的字符串

  10. BZOJ 1779. [Usaco2010 Hol]Cowwar 奶牛战争

    传送门 考虑构建网络流模型 把一个流量看成一只奶牛的攻击过程,那么答案就是最大流 因为每只奶牛只能操作一波,所以构造分层图,一层相当于一步 第一层就是初始状态,从 $S$ 向所有 $J$ 奶牛连一条流 ...