【面试八股】Java底层源码——Arrays.toString(数组) & object.toString() & new String()

Java.lang->String

  • java的字符串是常量,它的值在创建后不能修改(字符串里的元素不能修改);
    在这里插入图片描述
  • 不能用String[索引]的形式来取得对应索引处的元素值
    在这里插入图片描述
  • 初始化,String s="hello world" 等价于 char data[] = {'h', 'e', 'l','l','o',' ','w','o','r','l','d'};,然后String s = new String(data);

StringBuilder、StringBuffer、String区别

  • String一旦创建不可变,不可进行修改;而StringBuilder、StirngBuffer可变长,可修改,通过setCharAt()方法;
  • 因为StringBuilder线程不安全的性质,适合单线程使用,效率高;StringBuffer提供线程安全支持,适合多线程;

Object.toString()

在这里插入图片描述
  这种形式的返回值并不像我们通常以为的那样,而是一个带有对象字符串hashcode(后面会专门记录hashcode的知识)的字符串形式,即对象的字符串表示形式,反正就不是返回转换后字符串的本身;
所以,没有特殊需求,做题的时候还是不要用这种,用Arrays.toString()这种;
示例:
在这里插入图片描述

Arrays.toString(数组)

在这里插入图片描述
Arrays类包含用来操作数组(排序、搜索、转换等)各种方法,可以把数组当作列表的静态工厂;
Arrays.toString(char[] a)为例,它的实例输出如下:
在这里插入图片描述
就是以一种这样的形式[字符数组元素1,字符数组元素2,......]输出,源码的确差不多这样:
在这里插入图片描述
  逻辑很清楚,上面判断就不说了,下面则是以StringBuilder.toString()的形式返回的,那么这不就是Object.toString()的形式吗,为什么会输出字符串而不是之前的带有hashcode的东西?
看看JDK中关于StringBuilder.toString()的介绍:
在这里插入图片描述
相当于对toString方法进行了重写(所有对象都是Object的子类,子类对父类方法重写);
在这里插入图片描述
  果然,但这里的value和count是什么意思,我看了StringBuilder源码里面没有关于它俩的说明,想到这应该是父类的东西,value代表字符数组,count应该是要copy的个数,意思是从索引0开始copy value,共copy count个元素;

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

取AbstractStringBuilder看看:
在这里插入图片描述
的确是这样,count是字符数组使用了的字符个数,而不是分配的空间大小;

  所以StringBuilder的toString()方法和普通Object的toString()方法不一样的,前者重新new了一个字符串,后者返回object的带有hashcode的字符串!
示例:
在这里插入图片描述

new String()

  这个其实也可以不说的,但是还是记录下;
  就是当我想在函数中返回一个字符串,Object.toString()肯定用不了,可以用Arrays.toString(数组);还一种方式就是直接new一个字符串,本质应该是一样的:
在这里插入图片描述
  反正Arrays.toString()的本质也是构建StringBuilder,然后通过StringBuilder.toString()实现,都要新new处一块内存用于存放数组内容;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值