1. int size = list.size();
  2. Integer existIndex = -1;
  3. for (int index = 0; index < size; index++) {
  4. Photo photo = list.get(index);
  5. // 确保不会出现多个主图:如果已经找到了主图,把后面的都设置为“非主图”,防止前端验证失败,出现多个主图的情况
  6. if (existIndex != -1) {
  7. photo.setCover(0);
  8. // list.set(index,photo);
  9. }
  10. Integer c = photo.getCover();
  11. // 找到了主图
  12. if (c != null && c.equals(1)) {
  13. existIndex = index;
  14. }
  15. }

上周五的时候,修改集合中的1个元素,获得第N对象,修改对象的属性,这个时候list中的对象属性就更改了,但是,在循环结束之后,发现list中的元素没有修改,又恢复原状了。必须通过list.set(index,photo); 才保证符合预期。

很奇怪,难道list.get,再修改不可行?

周末写了几个集合list的例子,发现都可以正常修改。

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. //测试,修改Java集合中的元素的属性
  5. public class ListTest {
  6.  
  7. public static void main(String[] args) {
  8. List<User> list1 = buildList();
  9. list1.get(0).setName("name1");
  10. list1.get(0).setAge(1);
  11. System.out.println(list1.get(0));
  12.  
  13. List<User> list2 = buildList();
  14. User user2 = list2.get(0);
  15. user2.setName("name2");
  16. user2.setAge(2);
  17. System.out.println(list2.get(0));
  18.  
  19. for (User user : list2) {
  20. user.setName("name3");
  21. user.setAge(3);
  22. }
  23. System.out.println(list2.get(0));
  24.  
  25. updateList(list2);
  26. System.out.println(list2.get(0));
  27. }
  28.  
  29. private static void updateList(List<User> list2) {
  30. System.out.println(list2.get(0));
  31. if (true) {
  32. for (User user : list2) {
  33. user.setName("name4");
  34. user.setAge(4);
  35. }
  36. System.out.println(list2.get(0));
  37. }
  38. System.out.println(list2.get(0));
  39. }
  40.  
  41. public static List<User> buildList() {
  42. List<User> list = new ArrayList<User>();
  43. User user = new User();
  44. user.setName("name");
  45. list.add(user);
  46. return list;
  47. }
  48.  
  49. }
  50.  
  51. class User {
  52. private String name;
  53. private Integer age;
  54.  
  55. public String getName() {
  56. return name;
  57. }
  58.  
  59. public void setName(String name) {
  60. this.name = name;
  61. }
  62.  
  63. public Integer getAge() {
  64. return age;
  65. }
  66.  
  67. public void setAge(Integer age) {
  68. this.age = age;
  69. }
  70.  
  71. @Override
  72. public String toString() {
  73. return "User [name=" + name + ", age=" + age + "]";
  74. }
  75.  
  76. }

通过例子可以看出,list修改方式没有问题。但是,为什么项目中的代码有问题呢?

今天是周一,再次debug,发现去掉list.set(index,photo); 结果是正确的。

这样我就搞不明白,上周五的代码问题呢。

无法复现问题,就只能“到此为止”了~

一个奇怪的Java集合问题的更多相关文章

  1. 一个简单的Java集合范围过滤的多个方式对比

    在一个项目里面有这么一个技术需求: 1.集合中元素个数,10M 2.根据上限和下限从一个Set中过滤出满足要求的元素集合. 实际这个是个很典型的技术要求, 之前的项目也遇见过,但是因为当时的类库不多, ...

  2. 另外几种Java集合框架具体解释续

    另外几种Java集合框架具体解释续 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs fastutil库优于Trove库的 ...

  3. 【新手向】如何学习Java集合

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 如果认识我的同学可能就知道,我已经写过很多系列级 ...

  4. 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射

    从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...

  5. 黑马基础阶段测试题:创建一个存储字符串的集合list,向list中添加以下字符串:”C++”、”Java”、” Python”、”大数据与云计算”。遍历集合,将长度小于5的字符串从集合中删除,删除成功后,打印集合中的所有元素

    package com.swift; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; ...

  6. 一个java集合使用bug

    在使用java集合的时候有的时候集合是来自于一些第三方工具提供的从字符串或json 转出集合的对象有时是抽象类,这时的对象部分功能是未实现的,在使用相应操作的时侯 会引发bug. Exception  ...

  7. Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  8. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  9. Java 集合深入理解(12):古老的 Vector

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天刮台风,躲屋里看看 Vector ! 都说 Vector 是线程安全的 ArrayList,今天来根据源码看看是不是这 ...

随机推荐

  1. jQuery插件开发初探

    最简单的插件 $.fn.changeStyle = function (colorStr) { $(this).css('color',colorStr); } 应用如下: <!DOCTYPE ...

  2. oracle job有定时执行功能

    oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务.   oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的 ...

  3. 【Linux】JDK+Eclipse 搭建C/C++开发环境

    注:本文所提供的参考示例是在CentOS Linux环境下的安装,不保证适用于其他版本的Linux系统. ·    安装前的注意事项 编译源代码是需要对应的代码编译工具的,本文中安装的Eclipse只 ...

  4. Long和long判断

    Long需要equals 判断. long可以==

  5. iRedMail邮件系统配置简易视频安装教程

    iRedMail邮件系统配置简易视频安装教程        iRedMail邮件系统配置简易视频安装教程 iRedMail中文名为“艾瑞得邮件系统”, 属于开源的企业邮件解决方案,但其性能不逊于任何商 ...

  6. Ionic2集成ngx-datatable,ng2-tree第三方控件.md

    1. 基本环境配置 1.1. 命令安装相应的依赖 1.2. 在Module定义中引入对应Module 1.3. 引入对应的CSS 2. 简单使用示例验证是否集成成功 2.1. ngx-datatabl ...

  7. Important Abstractions and Data Structures

    For Developers‎ > ‎Coding Style‎ > ‎ Important Abstractions and Data Structures 目录 1 TaskRunne ...

  8. gitlab-ce-11.0.1 安装及汉化

    1.添加gitlab源(我这里使用了清华大学的源)cat <<EOF> /etc/yum.repos.d/gitlab-ce.repo[gitlab-ce]name=gitlab-c ...

  9. Eclipse+PyDev解决中文输入和注释问题

    Eclipse的设置 window->preferences->general->editors->text editors->spelling->encoding ...

  10. Unityclient通信測试问题处理(一)

    Unityclient通信測试问题处理(一) 近期在測试程序的通信模块时.遇到了一个问题:Unity的API函数仅仅能在主线程中调用.而作为client程序,我单独启用了一个监听线程来接收服务端发送的 ...