(JAVA):“值拷贝”和“引用赋值”易错易混的地方。

简介: (JAVA):“值拷贝”和“引用赋值”易错易混的地方。

目录

前言:

1、什么是值拷贝?

2、什么是引用赋值?

3、例子:

(1)代码1:值拷贝

(2)代码2:引用赋值

4、代码纠正:



前言:

打卡!打卡!

今天看到这个容易混淆的地方,在这之前我都不知道、没注意,今天补上,当个笔记。


1、什么是值拷贝?

       简单来说就是复制,把第一个变量的值复制给第二个变量,改变第二个变量的值不会影响第一个变量的值。


2、什么是引用赋值?

       就是引用值,在堆中放有一堆数据,栈中的变量1和变量2去引用这个堆里的数据,改变任何一个变量的值,就是改变堆里的值,另一个变量的值也会随之而变。


3、例子:

(1)代码1:值拷贝

        int n1 = 10; //初始化
        int n2 = n1; //初始化
        n2 = 80; //改变n2的值
        System.out.println(n1); //结果为10
        System.out.println(n2); //结果为80

我们可以看到上面代码,值拷贝只改变一个变量,另一个变量不会改变。


(2)代码2:引用赋值

        int[] arr1 = { 1, 2, 3}; //数组初始化
        int[] arr2 = arr1;  //数组初始化
        arr2[0] = 10; //改变第二个数组的第一个元素
        System.out.println(arr1[0]); //结果为10
        System.out.println(arr2[0]); //结果为10

       为什么两个结果都改变了呢?因为数组赋值(arr2 = arr1)是赋的地址,把arr1的地址给了arr2,两个数组使用的是同一个堆中的数据,所以无论改变哪个数据,另一个也会改变。

       那怎么使两个数组数据分开,互不干扰呢?前面说了,是因为使用了同一个堆,那我们再开辟一个堆出来不就解决问题了。


4、代码纠正:

        int[] arr1 = { 1, 2, 3}; //赋初值
        int[] arr2 = new int[arr1.length]; //开辟新的堆,然后再赋值
        arr2[0] = 10; //改变其中一个值
        System.out.println(arr1[0]); //结果为1
        System.out.println(arr2[0]); //结果为10

       在开辟一个新的堆后,两个数组各自使用各自的堆,会不干扰,所以改变其中一个,另一个不会变了。


相关文章
|
11天前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
24天前
|
安全 Java
java BigDecimal 的赋值一个常量
在 Java 中,`BigDecimal` 是一个用于精确计算的类,特别适合处理需要高精度和小数点运算的场景。如果你需要给 `BigDecimal` 赋值一个常量,可以使用其静态方法 `valueOf` 或者直接通过字符串构造函数。 以下是几种常见的方法来给 `BigDecimal` 赋值一个常量: ### 使用 `BigDecimal.valueOf` 这是推荐的方式,因为它可以避免潜在的精度问题。 ```java import java.math.BigDecimal; public class BigDecimalExample { public static void
|
1月前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
21 5
|
1月前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
48 4
|
1月前
|
Java
java构造方法时对象初始化,实例化,参数赋值
java构造方法时对象初始化,实例化,参数赋值
48 1
|
21天前
|
存储 Java 编译器
[Java]基本数据类型与引用类型赋值的底层分析
本文详细分析了Java中不同类型引用的存储方式,包括int、Integer、int[]、Integer[]等,并探讨了byte与其他类型间的转换及String的相关特性。文章通过多个示例解释了引用和对象的存储位置,以及字符串常量池的使用。此外,还对比了String和StringBuilder的性能差异,帮助读者深入理解Java内存管理机制。
18 0
|
2月前
|
Java
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
这篇文章介绍了Java中FileInputStream和FileOutputStream的使用,包括如何读取和写入txt文件以及如何拷贝图片文件。
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
|
2月前
|
Java 测试技术 程序员
Java零基础(23) - Java赋值运算符,了解一下!
【9月更文挑战第2天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
58 11
|
3月前
|
Java 索引
Java系列 之 Java复制(拷贝)数组的4种方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan
这篇文章介绍了Java中数组复制的四种方法:`Arrays.copyOf()`、`Arrays.copyOfRange()`、`System.arraycopy()`和`clone()`方法,以及它们的使用场景和示例代码。
|
3月前
|
XML Java 数据格式
基于Java+freemarker实现动态赋值以及生成Word文档
使用Java和Freemarker技术实现动态数据填充到Word文档模板并生成新的Word文档。
248 0
基于Java+freemarker实现动态赋值以及生成Word文档