当前位置:首页 > 分类 > JAVA基础 > JDK源码-String

JDK源码-String

1,String类可以被继承吗

String类定义如下

public final class String{...}

String类是一个final类,final类不能被继承。报错提示:The type StringDemo cannot subclass the final class String。

2,string的值为什么不能被修改

String类属性定义如下

private final char value[];

对象值用final字符数组保存,一旦初始引用地址不可修改,同时String类未提供修改value值的方法,并可保证线程安全

String类作为java中最常用的类,底层用的也是char,由此可见java中所有的操作最终还是由8种基本数据类型来完成。

3,为什么常用string作为map中的key

/** Cache the hash code for the string */
   private int hash; // Default to 0
   public int hashCode() {
       int h = hash;
       if (h == 0 && value.length > 0) {
           char val[] = value;

           for (int i = 0; i < value.length; i++) {
               h = 31 * h + val[i];
           }
           hash = h;
       }
       return h;
   }

string实例缓存了自己的hashcode,而在map操作中计算key的索引时会使用key的hashcode。


4,字符串倒序输出

String youfengxin = "youfengxin.com";
System.out.println(new StringBuilder(youfengxin).reverse().toString());

输出

moc.nixgnefuoy

5,string与char互转

String youfengxin = "youfengxin.com";
//string to char[]
char[] chars = youfengxin.toCharArray();
//char[] to string
System.out.println(new String(chars));

6,==和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;
    }

(==)是判断两个对象的引用地址refrence是否相等。对象的访问定位

equals先判断==,在判断类型,在比较每个字符,只有==true或者类型相同且每个字符都相等才返回true。


7,intern方法有什么用

 * When the intern method is invoked, if the pool already contains a
     * string equal to this {@code String} object as determined by
     * the {@link #equals(Object)} method, then the string from the pool is
     * returned. Otherwise, this {@code String} object is added to the
     * pool and a reference to this {@code String} object is returned.
     */
    public native String intern()

当intern()方法被调用,如果字符串池中含有一个字符串和当前调用方法的字符串eqauls相等,那么就会返回池中的字符串。如果池中没有的话,则首先将当前字符串加入到池中,然后返回引用。


8,String语法糖

String youfengxin = "youfengxin";
String com = ".com";
String youfengxin_com1 = youfengxin+com;
String youfengxin_com2 = "youfengxin.com";
String youfengxin_com3 = "youfengxin"+".com";
System.out.println(youfengxin_com1 == youfengxin_com2);
System.out.println(youfengxin_com1 == youfengxin_com3);
System.out.println(youfengxin_com2 == youfengxin_com3);

结果

false
false
true

但如果把youfengxin和com变量都改成常量final

final String youfengxin = "youfengxin";
final String com = ".com";
String youfengxin_com1 = youfengxin+com;
String youfengxin_com2 = "youfengxin.com";
String youfengxin_com3 = "youfengxin"+".com";
System.out.println(youfengxin_com1 == youfengxin_com2);
System.out.println(youfengxin_com1 == youfengxin_com3);
System.out.println(youfengxin_com2 == youfengxin_com3);

结果

true
true
true

常量拼接(字面量和final修饰的变量),虚拟机会直接优化成youfengxin_com2格式

变量拼接,编译后使用StringBuilder.append()拼接生成一个新的字符串