zoukankan      html  css  js  c++  java
  • 你真的了解String的常见API吗?

    面试官Q1:请问String常见的方法有哪些,列举几个?

    String是我们开发中使用频率最高的类,它有哪些方法,大家一定不会陌生,例如:

    • length();//计算字符串的长度

    • charAt();//截取一个字符

    • getChars();//截取多个字符

    • equals();//比较两个字符串

    • equalsIgnoreCase();//比较两个字符串,忽略大小写

    • startsWith();//startsWith()方法决定是否以特定字符串开始

    • endWith();//方法决定是否以特定字符串结束

    • indexOf();//查找字符或者子串第一次出现的地方。

    • lastIndexOf();//查找字符或者子串是后一次出现的地方。

    • substring();//截取字符串

    • concat();//连接两个字符串

    • replace();//替换

    • trim();//去掉起始和结尾的空格

    • valueOf();//转换为字符串

    • toLowerCase();//转换为小写

    • toUpperCase();// 转换为大写

    但是像replace(),substring(),toLowerCase()这三个方法需要注意一下,我们看下下面一段代码:

    import java.util.*;
    public class StringTest {
         public static void main(String[] args){
          String ss = "123456";
          System.out.println("ss = " + ss);
          ss.replace('1', '0');
          System.out.println("ss = " + ss);
          }
    }

    打印结果:

    ss = 123456
    ss = 123456

    如果你不了解replace方法的源码,可能会认为最后的打印结果为 "ss = 023456",但是实际上方法内部创建了一个新的String对象,并将这个新的String对象返回。对ss是没有做任何操作的,我们也知道String是不可变的嘛。源码如下:

    public String replace(char oldChar, char newChar) {
        // 判断替换字符和被替换字符是否相同
        if (oldChar != newChar) {
            int len = value.length;
            int i = -1;
            // 将源字符串转换为字符数组
            char[] val = value; /* avoid getfield opcode */
            while (++i < len) {
               // 判断第一次被替换字符串出现的位置
                if (val[i] == oldChar) {
                    break;
                }
            }
            // 从出现被替换字符位置没有大于源字符串长度
            if (i < len) {
                char buf[] = new char[len];
                for (int j = 0; j < i; j++) {
                    // 将源字符串,从出现被替换字符位置前的字符将其存放到字符串数组中
                    buf[j] = val[j];
                }
                while (i < len) {
                    char c = val[i];
                    // 开始进行比较;如果相同的字符串替换,如果不相同按原字符串
                    buf[i] = (c == oldChar) ? newChar : c;
                    i++;
                }
                // 使用String的构造方法进行重新创建String
                return new String(buf, true);
            }
        }
        return this;
    }

    方法内部最后重新创建新的String对象,并且返回这个新的对象,原来的对象是不会被改变的。substring(),toLowerCase()方法也是如此。

    还有诸如contact()方法,源码如下:

    public String concat(String str) {
        int otherLen = str.length();
        if (otherLen == 0) {
            return this;
        }
        int len = value.length;
        char buf[] = Arrays.copyOf(value, len + otherLen);
        str.getChars(buf, len);
        return new String(buf, true);
    }

    从上可知参数str不能为null,否则就会包空指针异常。用contact()拼接字符串速度也很快,因为直接Arrays.copyOf,直接内存复制。

    面试的时候,如果能对一些方法有自己的认识,看过底层源码,对于面试官来说会有比较深刻的印象!

  • 相关阅读:
    质心坐标(barycentric coordinates)及其应用
    用表存储代替递归算法
    Lua学习之加载其他lua文件
    Mac 端配置 Lua 环境
    聊聊二手房交易遇到的恶心事
    Mac安装Python3后,如何将默认执行的Python2改为Pyhton3
    Mac平台下部署UE4工程到iOS设备的流程
    计算椭圆运动轨迹的算法
    OpenGL中的渲染方式—— GL_TRIANGLE_STRIP
    XDRender_ShaderMode_StandardPBR 间接光照(2)-镜面反射部分(1)
  • 原文地址:https://www.cnblogs.com/shanheyongmu/p/9583498.html
Copyright © 2011-2022 走看看