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

相关文章
|
30天前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第14天】Java零基础教学篇,手把手实践教学!
111 65
|
20天前
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
|
19天前
|
设计模式
在实际开发中,什么时候应该使用 `new` 关键字,什么时候应该使用 `Object.create()` 方法?
【10月更文挑战第29天】`new` 关键字适用于创建具有特定类型和初始化逻辑的对象实例,以及实现基于原型链的继承;而 `Object.create()` 方法则适用于基于现有对象创建相似对象、避免构造函数的副作用、创建具有特定原型链的对象等场景。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象,以实现更高效、更灵活的代码结构。
|
1月前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
31 4
|
1月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
30 2
|
1月前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第13天】Java零基础教学篇,手把手实践教学!
41 1
|
1月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
28 2
|
1月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
安全 Java
Java并发编程笔记之CopyOnWriteArrayList源码分析
并发包中并发List只有CopyOnWriteArrayList这一个,CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行修改操作和元素迭代操作都是在底层创建一个拷贝数组(快照)上进行的,也就是写时拷贝策略。
19550 0
|
Java 安全
Java并发编程笔记之读写锁 ReentrantReadWriteLock 源码分析
我们知道在解决线程安全问题上使用 ReentrantLock 就可以,但是 ReentrantLock 是独占锁,同时只有一个线程可以获取该锁,而实际情况下会有写少读多的场景,显然 ReentrantLock 满足不了需求,所以 ReentrantReadWriteLock 应运而生,ReentrantReadWriteLock 采用读写分离,多个线程可以同时获取读锁。
3134 0
下一篇
无影云桌面