Java底层源码——Arrays.toString(数组) & object.toString() & new String()

简介: 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

1 2 3 取AbstractStringBuilder看看:

的确是这样,count是字符数组使用了的字符个数,而不是分配的空间大小;

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

new String()   这个其实也可以不说的,但是还是记录下;   就是当我想在函数中返回一个字符串,Object.toString()肯定用不了,可以用Arrays.toString(数组);还一种方式就是直接new一个字符串,本质应该是一样的:

  反正Arrays.toString()的本质也是构建StringBuilder,然后通过StringBuilder.toString()实现,都要新new处一块内存用于存放数组内容;

相关文章
|
3天前
|
存储 安全 Java
Java数组(Arrays)详解
Java 中的数组是一种用于存储固定数量同类型数据的高效数据结构,支持连续内存存储和随机访问。数组可以声明并初始化,通过索引访问和修改元素,获取长度,使用循环遍历,支持多维形式,并可通过 `Arrays` 类的方法进行复制和排序。数组具有固定大小和类型安全的特点,但需注意越界等问题。灵活运用数组能显著提升编程效率。
|
1月前
|
Java API 调度
掌握Java线程状态:从NEW到TERMINATED
本文探讨了操作系统与Java中线程的状态及其转换。操作系统层面,线程状态包括初始、就绪、运行、阻塞和终止。Java线程状态则细分为NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,并详细介绍了各状态的特性和转换条件。此外,还列举了Java中常用的线程方法,如`wait()`、`notify()`、`start()`和`join()`等,帮助理解线程控制机制。
掌握Java线程状态:从NEW到TERMINATED
|
16天前
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
|
17天前
|
存储 Java
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
35 2
|
8天前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
2月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
36 0
JAVA中Object类的常用方法详解
JAVA中Object类的常用方法详解
  JAVA中Object类的常用方法详解
|
6天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
21 2
下一篇
无影云桌面