关于Arrays.fill方法和Java赋值的底层原理
目录
- 问题
- 原理
- 参考
问题
今天在写leetcode的时候看到了这样一个例子:
StringBuilder[] a = new StringBuilder[5];
Arrays.fill(a, new StringBuilder("asdfg"));
a[0].deleteCharAt(0);
for (StringBuilder s : a) {System.out.println(s);
}
和输出
sdfg
sdfg
sdfg
sdfg
sdfg
底下的人解释说是因为fill方法是将Object引用分配给指定的数组中的每个元素,所以当改变数组中其中一个元素时,别的元素也会同时改变,因为他是同一个。
然后我略加思索,敲出了下面的代码:
int b = 1;
int[] a = new int[5];
Arrays.fill(a, b);
b = 2;
System.out.println(Arrays.toString(a));
但是结果却是
[1, 1, 1, 1, 1]
原理
为什么就没发改变了呢?这就牵扯到一个有意思的东西了:
1、如果变量是基本数据类型,此时赋值的是变量所保存的数据值.
于是
int a1=1;int a2=a1
是两个内存空间中有两个1,他们相等.
2、如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值,于是
StringBuilder a1 = new StringBuilder();
StringBuilder a2 = new StringBuilder();
a2=a1
是两个内存空间现在指向了同一个地址,他们的内容是同一个内容。
回到上述的问题中,为什么第一段代码改变了而第二段代码没有改变呢?
我认为根本就不是那个人说的“因为fill方法是将引用分配给数组中的每一个元素”,而是因为fill方法的本质相当于“=”号,当你使用Arrays.fill(a, new StringBuilder("asdfg"));
时,“=”号将此对象的地址赋值给了a数组中的所有元素。而当你使用Arrays.fill(a, b);
时,“=”号只是将b的值赋值给了a数组中的所有元素。所以当你a[0].deleteCharAt(0);
时,地址中的值发生了改变,所以所有元素都发生了改变。而当你改变b的值时,a自然不会变。
参考
链接: Java核心技术系列之华东师范大学Java核心技术第四章对象与类,话谈Java中的赋值与变量交换底层原理、构造函数、信息隐藏、this
问题原文:
链接: 在java中的StringBuilder数组中操作StringBuilder
关于Arrays.fill方法和Java赋值的底层原理相关推荐
- Java集合—ArrayList底层原理
原文作者:0 errors 0 warnings 原文地址:用大白话告诉你ArrayList的底层原理 目录 一.数据结构 二.线程安全性 三.继承关系 四.构造方法 五.add()方法 六.扩容机制 ...
- java锁的底层原理
知识整理 Synchronized 内置锁,JVM级别 使用 底层 锁升级过程.CAS操作的缺点[替换线程和copy mw] 优化 代码优化:同步代码块.减少锁粒度.读锁并发 JDK自带 偏置锁.轻量 ...
- Java集合框架底层原理
Java集合框架 Java集合框架 List集合 ArrayList底层实现原理 ArrayList数组扩容技术(数组拷贝) 扩容大小 查询和删除 集合中的泛型 LinkedList Vector 线 ...
- Java集合—HashMap底层原理
原文链接:最通俗易懂搞定HashMap的底层原理 HashMap的底层原理面试必考题.为什么面试官如此青睐这道题?HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好o ...
- kafka和zookeeper下载地址和安装方法和JAVA消费者方法
kafka下载地址:http://archive.apache.org/dist/kafka/3.0.1/kafka_2.13-3.0.1.tgz zookeeper下载地址:http://archi ...
- java学习之路---java学习的方法和java学习路线
转载于: http://blog.csdn.net/zhangerqing 前段时间逛论坛,总会有很多新手很迷茫,问到:到底该怎么学好Java,这个问题很重要,尤其对于像我们这样大多数都是靠自学的人来 ...
- Java反射的底层原理,以及Java反射的性能分析及优化
java的反射技术,号称是编程界的九阳神功,也可以说是框架的灵魂.也正是这种反射机制使静态语言的java具备了动态语言的某些特质.就是有了反射,才让java动态,编程的时候更加灵活,能够动态获取信息以 ...
- Java集合—PriorityQueue底层原理
原文作者:汉尼博 原文地址:PriorityQueue的用法和底层实现原理 目录 先讲使用,再讲原理 实现原理 方法剖析 先讲使用,再讲原理 队列是遵循先进先出(First-In-First-Out) ...
- Java基础—序列化底层原理
原文地址:https://blog.csdn.net/xlgen157387/article/details/79840134 目录 一.基本概念 二.Java如何实现序列化和反序列化 三.相关注意事 ...
最新文章
- JDBC数据库的使用操作总结
- java struts2标签库 常用标签
- poj2362 DFS+剪枝
- Saltstack Master 配置文件详解
- No module named ‘skimage.metrics‘在Anaconda3中的解决方法
- 数据竞赛入门-金融风控(贷款违约预测)三、特征工程
- 虚拟货币公有链项目集体爆发,AE超过历史最高点
- 创业过程中一定会引进纯资金投资人
- java新开一个线程run_创建和启动一个Java线程
- 第四方支付 java代码_第三方支付平台 API聚合支付系统 云支付源码 PHP第四方pi支付...
- PX4位置估计源码分析
- 如何在页面上预览word
- oracle select into from 用法,数据库插入数据之select into from与insert into select区别详解...
- oracle 多表去重sql语句,去重语句
- 口腔菌群想要突破?这一方法潜力无限
- Windows 2000驱动程序的设计
- 射频百科:双工器是什么?双工器工作原理
- 智慧点餐系统源码 扫码点餐小程序源码
- 计算机开机后黑屏 只有鼠标,电脑开机后一直黑屏只有一个鼠标,重启也是.怎么处理...
- python测试工具--nose简介