String源码分析,解读面试题

来源:互联网 发布:.name域名是什么 编辑:程序博客网 时间:2024/06/07 22:15

1.String类不可被继承

#String类定义public final class String
  • String被定义为final类,final(最终的意思)定义的类不可以被继承。

2.String是不可变对象

#String属性private final char value[];private int hash;
  • final修饰的成员变量的引用(引用类似于指针,对应对象的内存地址)不可以被更改,引用对象不变。字符数组value存储String的元素,被final修饰,所以value的引用不可变。
  • private修饰的成员变量不可以被外部类直接使用,所以不能在外部直接修改成员变量,value被private修饰,所以不能在外部通过引用直接修改成员变量。
  • value仅提供了查询和比较的方法,没有提供提供公有的修改方法,所以不能在外部通过公有方法修改成员变量value。

3.下面的代码创建了几个String实例?

String s = new String("Hello world!");

通过下面的构造方法分析问题

#String构造方法public String(String orginal){    this.value = orginal.value;    this.hash = orginal.hash;}
  • “hello world” 是orginal的实例,orginal的value和hash引用赋给新的对象的value和hash引用。说明存在了两个String实例,引用对应同一个内存地址。
  • 如果orginal变量已经存在,则只是创建了一个新的对象引用,将orginal的对象引用赋给了新创建的s。

4.对比数组,String获取长度的方法?

String s = new String("Hello world!");int sLen = s.length();int[] arr = {1,3,5,7};int arrLen = arr.length;
  • 可以看到String s是通过length()方法获取的长度,而int数组arr的length属性获取的长度。
  • 不过看下面的源码就知道因为String使用char数组value存储的元素,因为value私有,所以提供了公有的length方法,两者获取长度的方法本质是一样的。
#String源码private final char value[];public int length() {    return value.length;}