写点什么

String 源码解析 -String 的使用注意

作者:zarmnosaj
  • 2022 年 5 月 10 日
  • 本文字数:1004 字

    阅读完需:约 3 分钟

String 源码解析-String 的使用注意

String 的相等判断(==与 equals())

看这个小标题应该勾起了大家的回忆,相信很多都会遇到一个面试题或者笔试题:==与 equals()有什么区别?


此分析也基本上是围绕这道题展开的,首先贴上 String 中 equals()方法的源代码:


public boolean equals(Object anObject) {    if (this == anObject) {        return true;    }    if (anObject instanceof String) {        String anotherString = (String)anObject;        int n = value.length;        if (n == anotherString.value.length) {            char v1[] = value;            char v2[] = anotherString.value;            int i = 0;            while (n-- != 0) {                if (v1[i] != v2[i])                    return false;                i++;            }            return true;        }    }    return false;}
复制代码


  1. 首先方法中第一步 this == anObject 判断了两个对象的内存地址是否相同

  2. if (anObject instanceof String)对两个对象是否类型一致进行了判断(是否同为 String 类型)

  3. if (n == anotherString.value.length)对两个对象中 value 的长度是否相等做了判断

  4. 最后的 while 对 value 指向的 byte 数组进行循环比较,判断每个 byte 是否一致


以上 4 点也完全解释了 equals()方法内部做的事情有哪些,==其实就只是对内存地址的简单比较。到这里其实此道题目也就迎刃而解了。

String 的字符替换

此点在实际写代码的时候比较容易碰到,比如:replace()、repalceAll()、repalceFirst(),一个是替换字符/字符串、一个是替换所有字符串、一个是替换匹配到的第一个字符串。


代码说明:


public class Demo {
public static void main(String[] args) { String s = "where are you"; System.out.println(s.replace('e', 'a')); System.out.println(s.replaceAll("e", "a")); System.out.println(s.replaceFirst("e", "a")); }}
复制代码


运行结果:


whara ara youwhara ara youwhare are you
复制代码


  1. replace 其实替换的是所有匹配到的字符

  2. repalceFirst 只会替换匹配到的第一个字符

  3. 要删除某个字符,使用 replace 进行替换即可

  4. 其中内部的实现基本都是使用正则表达式实现的,但是 replaceAll 使用的字符串的正则表达式,所以一些特殊符号需要进行转义,分别是:


( [ { / ^ - $ ** } ] ) ? * + .

用户头像

zarmnosaj

关注

还未添加个人签名 2020.02.06 加入

还未添加个人简介

评论

发布
暂无评论
String源码解析-String的使用注意_5月月更_zarmnosaj_InfoQ写作社区