IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 踩坑记录:List中的add方法,添加多个对象时出现重复的问题 -> 正文阅读

[开发工具]踩坑记录:List中的add方法,添加多个对象时出现重复的问题

用list存储User对象信息,当存储多个对象时,发现存储的数据都是一样的

之前代码:

    User user = new User();
    List<User> list = new ArrayList<>();

    for (int i = 0; i < 5; i++) {
        user.setName("Tom"+i);
        user.setAge("18"+i);
        user.setLocation("China"+i);
        list.add(user);
    }
    
    try {
        userDao.insert(list);
    } catch (Exception e) {
        e.printStackTrace();
    }

通过调用insert方法,发现添加的数据都是一样的,添加的都是同一个数据

简单来讲:

在JVM栈中创建了一个User类型的地址(地址通常为十六进制的数字,这里假设为0x12345678)
然后使用new关键字在JVM堆中开辟了一个新空间,将User对象存储到这个堆中

当i=0时,执行user.setName("Tom"+0).....通过地址值找到堆中的User对象,将对象中的属性分别赋值,然后执行list.add方法,就是将User的地址存储到List集合中

通过ArrayList源码可知,它的底层数据结构就是Object类型的数组,所以这里的add方法就是将地址存到一个数组中,我们访问集合中的数据,其实就是读取这个数组中地址所指向的值

当i=1时,执行user.setName("Tom"+1),此时因为并没有使用new关键字去创建新的对象,所以地址指还是指向原来的。将原来的属性值进行重新赋值。然后执行list.add方法,又将User的地址存储到List集合中,此时ArrayList的数组中就存储了两个相同的User对象,并且我们去访问,得到的属性值都是一样的。

当i=2,i=3,i=4以此类推,Object数组中就有五个相同地址的对象,而且属性值均为最新的赋值

了解清楚底层原理后,问题很快得到解决

我们只需要在外部声明对象,每进行一次循环的时候,都new一个新的对象,这样就可以保证每次添加集合的地址均不相同,也不会被覆盖

    User user;
    List<User> list = new ArrayList<>();

    for (int i = 0; i < 5; i++) {
        user = new User();
        user.setName("Tom"+i);
        user.setAge("18"+i);
        user.setLocation("China"+i);
        list.add(user);
    }

    try {
        userDao.insert(list);
    } catch (Exception e) {
        e.printStackTrace();
    }

问题得到完美解决!

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:31:11  更:2022-04-04 12:34:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:27:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码