首页 > 编程语言 >[新手向]Java的一个新手天坑

[新手向]Java的一个新手天坑

时间:2022-12-20 15:57:44浏览次数:40  
标签:Java 天坑 arr2 arr1 新手 内存

Java新手天坑!

想写一篇新手避坑向的文章很久了,最近来到园子,终于有机会发表这篇文章了(文笔和技术都不咋地,大佬见谅,适用于刚入坑没多久的新手群体)

在java中,经过一段学习的人对数组操作应该是了如指掌了,但是刚刚入门的小白来说,数组却存在着一个隐藏的大坑,我们先用Python示例一下:

#list.py
arr1 = [5418,114514,666]
arr2 = arr1
arr1[0] = 1
arr2[0] = 2
print(arr1[0])
print(arr2[0])

程序输出结果为:

2

2

哎?

这,这不对吧?arr1 和 arr2 明明是两个不一样的列表,怎么arr2 改到arr1里了呢?

这是新手很容易遇到的问题,我们添加一行代码,来验证一下猜想。

#依旧是list.py
print(arr1 is arr2)

啥意思呢,is不太常用,给大家解释一下,就是判断两个变量、列表(我通常称其为实体,更精确一些)在内存中的地址是否相同,如果相同的话,我们就知道问题发生的原因了。

程序输出如下:

2

2

True

果然,正是因为内存中的地址一样,所以更改arr2时,arr1也一同更改了,这俩货本质上一毛一样!

可以这么理解,数据是内存中的文件,arr1和arr2只是快捷方式。

我们把代码在java里实现:

public class ListTest {
    public static void main(String[] args) {
        int[] a = {1,2,3};
        int[] b = a;
        a[0] = 10;
        b[0] = 11;
        System.out.println(a[0]);
        System.out.println(b[0]);
    }
}

一开始的内存如图所示:

后来arr1把114514位置的值修改为了10

最后arr1把114514位置的值修改为了11

最后二者的[0]都为11

你,学废了吗?

 

标签:Java,天坑,arr2,arr1,新手,内存
From: https://www.cnblogs.com/cyzyyds/p/16994221.html

相关文章

  • JAVA Thread.sleep(0)深入理解
    JAVA并发-Thread.sleep(0)深入理解Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。通过调用Thread.sleep(0)的目的是为了让GC线程有机会被操作......
  • java -贪心
     给定一个字符串,一个K 可以交换相邻字符,最多K次。问可以得到的最大值如 Strings="01326";intk=7;  01326-->60132-->63012-->63102importjava.util......
  • java.sql.Connection 线程安全吗?
    首先看一段代码:try(Connectionconnection=DriverManager.getConnection("jdbc:mysql://remote01:3306/test");){ ExecutorServiceexecutor=ThreadUtil.newExecut......
  • Java IO
    JavaIO原理:作者:哟哟的小豆豆链接:https://juejin.cn/post/6844903839439519758来源:稀土掘金类结构及继承关系图常见面试题什么是流?字符串分解---------------......
  • java中的抽象类
    本文主要讲述java中的抽象类,以及具体的细节老韩的抽象类介绍 ......
  • open for java 创建圆弧
    //徐华进2022/12/20///*==================================================================================================Copyright(c)2004UGS......
  • Java序列化与反序列化三连问:是什么?为什么要?如何做?
    Java序列化与反序列化是什么?Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程:序列化:对象序列化的最主要的用处就是在......
  • 为什么Java线程没有Running状态?
    Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的Java线程状态均来自于Thread类下的State这一内部枚举类中所定义的......
  • 解析Java框架中entity层,mapper层,service层,controller各层作用
    转载自:https://blog.csdn.net/u011095110/article/details/86088976一、entity层别名:model层,domain层用途:实体层,用于存放我们的实体类,与数据库中的属性值基本......
  • 4.Java程序初识
    4.Java程序初识4.1HelloWorld程序以Hello.java为例,java应用程序的执行入口是main()方法,其有固定格式:/***类文件,一个源文件最多只能有一个public类,且与文件名称一......