String源码分析,解读面试题


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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值