目录

  • 问题
  • 原理
  • 参考

问题

今天在写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赋值的底层原理相关推荐

  1. Java集合—ArrayList底层原理

    原文作者:0 errors 0 warnings 原文地址:用大白话告诉你ArrayList的底层原理 目录 一.数据结构 二.线程安全性 三.继承关系 四.构造方法 五.add()方法 六.扩容机制 ...

  2. java锁的底层原理

    知识整理 Synchronized 内置锁,JVM级别 使用 底层 锁升级过程.CAS操作的缺点[替换线程和copy mw] 优化 代码优化:同步代码块.减少锁粒度.读锁并发 JDK自带 偏置锁.轻量 ...

  3. Java集合框架底层原理

    Java集合框架 Java集合框架 List集合 ArrayList底层实现原理 ArrayList数组扩容技术(数组拷贝) 扩容大小 查询和删除 集合中的泛型 LinkedList Vector 线 ...

  4. Java集合—HashMap底层原理

    原文链接:最通俗易懂搞定HashMap的底层原理 HashMap的底层原理面试必考题.为什么面试官如此青睐这道题?HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好o ...

  5. kafka和zookeeper下载地址和安装方法和JAVA消费者方法

    kafka下载地址:http://archive.apache.org/dist/kafka/3.0.1/kafka_2.13-3.0.1.tgz zookeeper下载地址:http://archi ...

  6. java学习之路---java学习的方法和java学习路线

    转载于: http://blog.csdn.net/zhangerqing 前段时间逛论坛,总会有很多新手很迷茫,问到:到底该怎么学好Java,这个问题很重要,尤其对于像我们这样大多数都是靠自学的人来 ...

  7. Java反射的底层原理,以及Java反射的性能分析及优化

    java的反射技术,号称是编程界的九阳神功,也可以说是框架的灵魂.也正是这种反射机制使静态语言的java具备了动态语言的某些特质.就是有了反射,才让java动态,编程的时候更加灵活,能够动态获取信息以 ...

  8. Java集合—PriorityQueue底层原理

    原文作者:汉尼博 原文地址:PriorityQueue的用法和底层实现原理 目录 先讲使用,再讲原理 实现原理 方法剖析 先讲使用,再讲原理 队列是遵循先进先出(First-In-First-Out) ...

  9. Java基础—序列化底层原理

    原文地址:https://blog.csdn.net/xlgen157387/article/details/79840134 目录 一.基本概念 二.Java如何实现序列化和反序列化 三.相关注意事 ...

最新文章

  1. JDBC数据库的使用操作总结
  2. java struts2标签库 常用标签
  3. poj2362 DFS+剪枝
  4. Saltstack Master 配置文件详解
  5. No module named ‘skimage.metrics‘在Anaconda3中的解决方法
  6. 数据竞赛入门-金融风控(贷款违约预测)三、特征工程
  7. 虚拟货币公有链项目集体爆发,AE超过历史最高点
  8. 创业过程中一定会引进纯资金投资人
  9. java新开一个线程run_创建和启动一个Java线程
  10. 第四方支付 java代码_第三方支付平台 API聚合支付系统 云支付源码 PHP第四方pi支付...
  11. PX4位置估计源码分析
  12. 如何在页面上预览word
  13. oracle select into from 用法,数据库插入数据之select into from与insert into select区别详解...
  14. oracle 多表去重sql语句,去重语句
  15. 口腔菌群想要突破?这一方法潜力无限
  16. Windows 2000驱动程序的设计
  17. 射频百科:双工器是什么?双工器工作原理
  18. 智慧点餐系统源码 扫码点餐小程序源码
  19. 计算机开机后黑屏 只有鼠标,电脑开机后一直黑屏只有一个鼠标,重启也是.怎么处理...
  20. python测试工具--nose简介

热门文章

  1. Numba witch makes Python code fast
  2. 妹子你知道节操什么意思吗?
  3. java火纹_开学啦,来聊聊占据了你学生时代的那些游戏吧(已结束)
  4. 统信UOS操作系统安装
  5. inside c# second edition 读书笔记 2004-11-30
  6. 一个上传图片的网站!很有用
  7. 互联网早报:微信发布新版本:青少年模式上线“监护人授权”功能
  8. python matplotlib绘图:探究各省人均GDP与出生率的关系
  9. FZU - 2230 翻翻棋
  10. 首席新媒体黎想教程:线上活动推广执行手册——第一篇