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处一块内存用于存放数组内容;

相关文章
|
1月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
71 7
|
2月前
|
数据采集 人工智能 Java
Java产科专科电子病历系统源码
产科专科电子病历系统,全结构化设计,实现产科专科电子病历与院内HIS、LIS、PACS信息系统、区域妇幼信息平台的三级互联互通,系统由门诊系统、住院系统、数据统计模块三部分组成,它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。
46 4
|
13天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
1月前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
Java 中的 String Pool 简介
|
1月前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
java 为什么 String 在 java 中是不可变的?
|
1月前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
129 13
|
1月前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
65 12
|
1月前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
101 5

热门文章

最新文章