IT面试

020:举几个String的API以及案例

2019-03-06  本文已影响162人  程序熊大
pexels-photo-169573.jpeg

典型回答

这道题比较开放,主要考察面试者的基础和知识面,首先可以尽量列举自己用过的API,并给出应用场景和注意事项(展现自己的知识面),然后再挑一个比较经典的案例详细说明(展现自己的基础)。

我之前遇到一个经典的案例是replace和replaceAll的误用而导致的BUG,当时的案例我记录了下,大概如下面的代码所示:

public class StringSEAPIExample {

    public static void main(String[] args) {
        String sourceStr = "http://mp.weixin.com/test/xxxxx/123.jpg?xxx=yyy";
        String targetReplaceUrl = "TARGET_REPLACE_URL";

        String res1 = sourceStr.replaceAll(targetReplaceUrl, targetReplaceUrl);
        System.out.println("启用正则的结果:" + res1);

        sourceStr = "http://mp.weixin.com/test/xxxxx/123.jpg?xxx=yyy";
        targetReplaceUrl = "REPLACE_URL";
        String res2 = sourceStr.replace(sourceStr, targetReplaceUrl);
        System.out.println("字面匹配的结果:" + res2);
    }
}

上面的代码运行的结果如下图所示:


image.png

我们期望出现的是第二种效果,也就是正确替换,但是由于对这两个方法的误用,导致了第一行的结果,引发了程序的BUG(非常深刻的教训,所以记忆犹新)。

知识点梳理

API名称 参数 应用
构造方法 重载版本:默认版本,String,StringBuilder,StringBuffer,char数组,byte数组 创建String对象
length() String中字符的个数
charAt() int索引 取得String中该索引位置上的字符
getChars() 要复制部分的起点和终点的索引,复制的目标数组,目标数组的起始索引 将当前字符串的指定区间的字符拷贝到目标数组中,在目标数组中的起始位置由dstBegin参数确定
toCharArray() 生成一个char数组,包含该String的所有字符
equals(),equalsIgnoreCase() 与之比较的String 比较两个字符串的内容是否相同,如果要忽略大小写则使用第二个
compareTo() 与之比较的String 按照字典序比较String的内容,比较结果为负数、零或正数。注意,大小写不等价
contains() 要搜索的字符序列 如果该字符串包含参数对应的字符内容,则返回true,否则返回false
contentEquals() 与之比较的CharSequence或StringBuffer 如果该String与参数的字符内完全一致则返回true
startsWith() 可能的起始String。重载版本在参数中增加了偏移量 返回boolean结果,以表明该String是否以此参数开头
endsWith() 可能的后缀String 表明该String是否以此参数结尾
indexOf(),lastIndexOf() 重载版本包括:char,char与起始索引,String,String与起始索引 如果该String并不包含该参数,则返回-1,否则返回参数在String中的起始索引。lastIndexOf()则是返回该参数在该String中的最后一个索引
substring() 重载版本:起始所以,起始索引+终点索引 返回参数指定范围内的字符序列,是一个新的String
conact() 要连接的String 返回一个新的String对象
replace() 要替换的字符,用来进行替换的字符 会将能匹配的全部都替换掉;如果替换发生,则返回一个新的字符串,否则返回原来的字符串
replaceAll() 正则表达式,用来进行替换的字符 替换该字符串中所有满足正则表达式匹配的字符,返回新的对象
replaceFirst() 正则表达式,用来进行替换的字符 替换该字符串中第一个满足正则表达式匹配的字符,返回新的对象
valueOf() 重载版本:Object;char[];char[],偏移量,字符个数;boolean;char;int;long;float;double 返回一个表示参数内容的字符串
trim() 将该String两端的空格删除后,返回一个新的String
toLowerCase(),toUpperCase() 将字符的大小写改变后,返回一个新的String
intern() 将该String对应的字符序列移入字符串常量池,这样改字符序列在JVM里就是唯一一份了

参考资料

  1. https://www.baeldung.com/java-string
  2. https://stackoverflow.com/questions/10827872/difference-between-string-replace-and-replaceall
  3. 《Java编程思想》

本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。 javaadu
上一篇下一篇

猜你喜欢

热点阅读