arraylist-结果为什么是三个102?

问题描述

结果为什么是三个102?

package com.itcast;

import java.util.ArrayList;

class Data {
int val;
}

public class HomeWork01{

public static void main(String args[]) {
Data data = new Data();

ArrayList<Data> list = new ArrayList<Data>();

for (int i = 100; i < 103; i++) {
data.val = i;

list.add(data);

}
for (Data d : list) {
System.out.println(d);
}
}}

解决方案

是这样的,你在for前面创建了一个对象data,你的第一个for循环,会将data的val值设置为100,然后将其放到list中,list中的第一个元素的val值就为100
,然后你在执行第二个循环时,将data的val值设置为101,这时因为这个data对象已经放入了list中,所以list的第一个元素也会变化,你再将data放入list
中,list的第二个元素也为这个data,所以val为101,依次类推。。。。

解决方案二:

你这里只创建了一个Data对象,也就是说你的list里面的三个元素其实都是指向同一个Date对象,所以你在for循环中data.val=i的操作在改变了val的值,list
中的三个元素会同时改变,因为这三个元素实际上是引用的同一个对象。如果你想不改变的话,就要创建三个不同的Data对象,分别放入list中

解决方案三:

这样写


ArrayList<Data> list = new ArrayList<Data>();
for (int i = 100; i < 103; i++) {
 Data data = new Data();
data.val = i;
list.add(data);
}

解决方案四:

上面的这几位博主的说法都很对,集合类创建对象,引用传递将改变还对象的值,你的代码中,在循环在创建了对象,所以在在循环中只有一个对象,这样的话集合类里的对象只有一个对象,是重复的相同的值,所以会出现3个102,所以在循环内创建对象就会解决问题

解决方案五:

i 100
i 101
add 的是什么呢?

解决方案六:

这里涉及到代码底层的相关知识,建议你去看看java的引用或者c语言指针的概念,不然这个地方确实对于你很难理解。

时间: 2024-10-31 19:13:52

arraylist-结果为什么是三个102?的相关文章

C#中数组Array,ArrayList,泛型List详细对比_C#教程

在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序集合.数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合. Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义. 数组在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也非常简单. Array数组具体用法: using System; names

Java魔法堂:注解用法详解——@SuppressWarnings

一.前言   编码时我们总会发现如下变量未被使用的警告提示:   上述代码编译通过且可以运行,但每行前面的"感叹号"就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWarnings("unused") 去除这些"感叹号".   二. @SuppressWarings注解    作用:用于抑制编译器产生警告信息.   示例1--抑制单类型的警告: @SuppressWarnings("unchecke

Java魔法堂:注解用法详解——@SuppressWarnings(转)

一.前言   编码时我们总会发现如下变量未被使用的警告提示:   上述代码编译通过且可以运行,但每行前面的"感叹号"就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWarnings("unused") 去除这些"感叹号".   二. @SuppressWarings注解    作用:用于抑制编译器产生警告信息.   示例1--抑制单类型的警告: @SuppressWarnings("unchecke

求求老师们帮帮忙,请用面向对象方法设计并实现顺序表(数组)结构。

问题描述 我刚学java,老师留的大作业是用面向对象方法设计并实现顺序表(数组)结构,包括:插入.删除.修改.访问(返回第i位置上的值).逆序.求个数.要求健壮性,针对不合理值,给出出错信息,编写测试类进行测试.我实在有些不懂,求求各位老师们帮帮忙另外在网上看的的这个http://www.jb51.net/article/48163.htm现在还要我编写一个测试类,具体怎么做,谁能帮帮我.我先谢谢大家. 解决方案 解决方案二:可以百度,或看JAVAjava.util.ArrayList源码解决方

关于对象数组的问题。。

问题描述 我今天写的时候,突然想要用用对象数组,可是怎么可以动态初始化一个对象数组的长度呢?请教了 解决方案 解决方案二:你可以看一下ArrayList的实现解决方案三:同意楼上的,用arraylist,其内部结构就是可变数组,而且你没有必要去声明数组长度解决方案四:ArrayList<Object>objects=newArrayList<Object>();解决方案五:arrayList存对象很好,上面的都说了.解决方案六:ArrayList不错学学容器以后有用的呵呵解决方案七

全面理解JavaScript中的闭包_基础知识

引子 闭包是有权访问另一个函数作用域中的变量的函数. 闭包是javascript中很难理解的部分,很多高级的应用都依靠闭包来实现的,我们先来看下面的一个例子: function outer() { var i = 100; function inner() { console.log(i); } } 上面代码,根据变量的作用域,函数outer中所有的局部变量,对函数inner都是可见的:函数inner中的局部变量,在函数inner外是不可见的,所以在函数inner外是无法读取函数inner的局部

JavaWeb基础教程之Java基础加强版_java

1.myeclipse的安装和使用 * eclipse:是一个免费的开发工具 * myeclipse:是一个收费的插件,破解myeclipse, ** 安装目录的要求: 不能有中文和空格 ** 安装完成之后,选择一个工作空间 ,这个工作空间不能有中文和空格 * 破解myeclipse ** 运行run.bat文件,但是运行之前,必须要安装jdk,通过配置环境变量 * myeclipse的使用 * 创建一个工程 - 类型 java project web project - 选择依赖的jdk,可以

struts2+hibernate整合,出现空指针错误,困扰好多天了

问题描述 XsAction:publicclassXsActionextendsActionSupport{KcDaokcDao;XsDaoxsDao;privateXsbxs;privateKcbkcb;privateFilezpFile;privateZybzyb;publicFilegetZpFile(){returnzpFile;}publicvoidsetZpFile(FilezpFile){this.zpFile=zpFile;}publicKcbgetKcb(){returnkcb

初步理解Java的泛型特性_java

在Java SE1.5中,增加了一个新的特性:泛型(日本语中的总称型).何谓泛型呢?通俗的说,就是泛泛的指定对象所操作的类型,而不像常规方式一样使用某种固定的类型去指定.泛型的本质就是将所操作的数据类型参数化,也就是说,该数据类型被指定为一个参数.这种参数类型可以使用在类.接口以及方法定义中.  一.为什么使用泛型呢?     在以往的J2SE中,没有泛型的情况下,通常是使用Object类型来进行多种类型数据的操作.这个时候操作最多的就是针对该Object进行数据的强制转换,而这种转换是基于开发