String 与Long源码以及面试题-1

String
1.不变性
不可变是指的是类值一旦被初始化,就不能再被改变了,如果被修改,将会是新的类。

String s ="hello";
s ="world";
源码:
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
}

String 不变性的原因?
1.String 被 final 修饰,说明 String 类绝不可能被继承了,也就是说任何对 String 的操作方法,都不会被继承覆写;
2.String 中保存数据的是一个 char 的数组 value。我们发现 value 也是被 final 修饰的,也就是说 value 一旦被赋值,内存地址是绝对无法修改的,而且 value 的权限是 private 的,外部绝对访问不到,String 也没有开放出可以对 value 进行赋值的方法,所以说 value 一旦产生,内存地址就根本无法被修改。

使用场景:如果你自己定义类时,希望不可以变的,可以模仿String类的两点操作。

因为String 不变性,所以大多数操作方法是返回新的String.

String str ="hello world !!";
// 这种写法是替换不掉的,必须接受 replace 方法返回的参数才行,这样才行:str = str.replace("l","dd");
str.replace("l","dd");

2.相等判断
我们判断相等有两种办法,equals 和 equalsIgnoreCase。后者判断相等时,会忽略大小写,近期看见一些面试题在问:如果让你写判断两个 String 相等的逻辑,源码:

public boolean equals(Object anObject) {
    // 判断内存地址是否相同
    if (this == anObject) {
        return true;
    }
    // 待比较的对象是否是 String,如果不是 String,直接返回不相等
    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;
}

如果有人问如何判断两者是否相等时,我们可以从两者的底层结构出发,就像 String 底层的数据结构是 char 的数组一样,判断相等时,就挨个比较 char 数组中的字符是否相等即可。
3.替换和删除
replace 有两个方法,一个入参是 char,一个入参是 String,前者表示替换所有字符,如:name.replace(‘a’,‘b’),后者表示替换所有字符串,如:name.replace(“a”,“b”),两者就是单引号和多引号的区别。
Long
Long 关注的是缓存机制
缓存了从 -128 到 127 内的所有 Long 值,如果是这个范围内的 Long 值,就不会初始化,而是从缓存中拿。
##面试题
为什么使用 Long 时,大家推荐多使用 valueOf 方法,少使用
parseLong 方法
答:因为 Long 本身有缓存机制,缓存了 -128 到 127 范围内的 Long,valueOf 方法会从缓存中去拿值,如果命中缓存,会减少资源的开销,parseLong 方法就没有这个机制。
2 如何解决 String 乱码的问题
答:乱码的问题的根源主要是两个:字符集不支持复杂汉字、二进制进行转化时字符集不匹配,所以在 String 乱码时我们可以这么做:
所有可以指定字符集的地方强制指定字符集,比如 new String 和 getBytes 这两个地方;
我们应该使用 UTF-8 这种能完整支持复杂汉字的字符集。

发布了234 篇原创文章 · 获赞 4 · 访问量 6581

猜你喜欢

转载自blog.csdn.net/u010160949/article/details/104462389
今日推荐