java集合存放引用数据类型的小问题

博主自身只是一枚刚入编程坑的菜鸟,此文记录的问题较为肤浅,仅供小小白学习

先来看一段demo代码及结果:

 1 package test;
 2
 3 import java.util.ArrayList;
 4
 5 public class Demo {
 6
 7     public static void main(String[] args) {
 8         ArrayList<Person> personList = new ArrayList<Person>();
 9         //方法一:
10         for(int i = 0; i < 5 ; i++){
11             Person person = new Person("person " + i , 20 + i);
12             personList.add(person);
13         }
14         for (Person people : personList)
15             System.out.println(people.getName() + " ... " + people.getAge());
16
17         System.out.println("-------------华丽的分割线----------");
18         personList.clear();
19
20         //方法二:
21         Person person = new Person();
22         for(int i = 0; i < 5 ; i++){
23             person.setName("person " + i);
24             person.setAge(20 + i);
25             personList.add(person);
26         }
27         for (Person people : personList)
28             System.out.println(people.getName() + " ... " + people.getAge());
29
30
31     }
32 }
33
34 class Person {
35     private String name;
36     private int age;
37
38     Person(){}
39
40     Person(String name, int age) {
41         this.name = name;
42         this.age = age;
43     }
44
45     public String getName() {
46         return name;
47     }
48
49     public void setName(String name) {
50         this.name = name;
51     }
52
53     public int getAge() {
54         return age;
55     }
56
57     public void setAge(int age) {
58         this.age = age;
59     }
60
61 }

结果:

person 0 ... 20
person 1 ... 21
person 2 ... 22
person 3 ... 23
person 4 ... 24
-------------华丽的分割线----------
person 4 ... 24
person 4 ... 24
person 4 ... 24
person 4 ... 24
person 4 ... 24

原因分析:

方法一将引用变量定义在循环内部,每次循环都会在内存中开辟一个空间用于存放该引用变量,5次循环后内存中有5个引用变量,list集合中的5个引用分别指向了这5个变量

方法二将引用变量定义在循环外部,每次循环都只是给该变量进行重新赋值,并不会重新开辟空间存放变量,5次循环后内存中仍只有1个引用变量,list集合中的5个引用均指向了这个变量

时间: 2024-11-08 21:12:15

java集合存放引用数据类型的小问题的相关文章

list集合存引用数据类型时的问题

list集合存引用数据类型时的问题 集合list的存储元素: (1)如果list中存的是基本数据类型,则存的是值 (2)如果list中存的是引用数据类型(如对象等),则存的是引用 如果对象的引用地址没变,内容变化,也会引起调用该对象时内容变化 下面举一个在集合list中存放对象的例子: //构建原始数据 ArrayList<Goods> list = new ArrayList(); Goods goods1=new Goods("plum ", 2); list.add(

java基础(4):引用数据类型、流程控制语句

1. 引用数据类型 1.1 Scanner类 我们要学的Scanner类是属于引用数据类型,我们先了解下引用数据类型. 引用数据类型的使用: 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型  变量名  =  new 数据类型(); 每种引用数据类型都有其功能,我们可以调用该类型实例的功能. 变量名.方法名(); Scanner类 Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入,获取到录入的数据. Scanner使用步骤:

java中的引用数据类型

java数据类型图: ┏数值型━┳━整数型:byte short int long ┏基本数据类型━━┫ ┗━浮点型:float double ┃ ┣字符型:char 数据类型╋ ┗布尔型:boolean ┃ ┏类(class) ┗引用数据类型━━╋接口(interface) ┗数组(array)java的数据类型分基本数据类型(原始数据类型)和引用数据类型:1.基本八大类,图中可以很清楚的看到:这种类型的数据变量在声明之后java就会立刻分配给他内存空间.如:short a; java会在可使

Java运算符和引用数据类型(Scanner、Random)

运算符 算术运算符: 运算符 运算规则 范例 结果 + 正号 +3 3 + 加 2+3 5 + 连接字符串 "中"+"国" "中国" - 负号 int a=3;-a -3 - 减 3-1 2 * 乘 2*3 6 / 除 5/2 2 % 取模 5%2 1 ++ 自增 int a=1;a++/++a 2 -- 自减 int b=3;a--/--a 2 加法运算符在连接字符串时要注意,只有直接与字符串相加才会转成字符串. 除法"/"

java中的基本数据类型和引用数据类型

java中基本数据类型有8种:byte,short,int,long,char,float,double,boolean 整型有四种:byte short,int,long byte:   1字节  -128--127 short:  2字节   -32768 -- 32767 int:  4个字节   -2147483648  -- 2147483647(超过20亿) long: 8个字节   -9223372036854775808  -- 9223372036854775807 注:jav

Java集合知识点总结——博客园:执、著

数组与集合的区别: Java中的数组是存放同一类型数据的集合.数组可以存放基本数据类型的数据,也可以存放引用数据类型的数据,但数组的长度是固定的. 集合只能存放引用数据类型的数据,不能存放基本数据类型的数据,但集合的数目是可变的. 所有的集合类都存放在java.util包中 List接口是元素有序,可重复的集合,添加自定义类时需要重写equals()方法 ArrayList集合中,插入一个元素时,列表需要将插入点后面的所有元素向后移动,而在删除(remove())一个元素时,需要将被删除元素后面

Java集合不能存放基本数据类型

Java集合不能存放基本数据类型,只能存放对象的引用. 每个集合元素都是一个引用变量,实际内容都存放在堆内或方法区里面, 但是基本数据类型是在栈内存上分配空间的,栈上的数据随时会被收回. 如何解决? 可以通过包装类,把基本数据类型转化为对象类型,存放引用. 更方便的,由于有了自动拆箱和装箱功能,基本数据类型和其对应对象 之间的转换变得很方便,把基本数据类型存入集合中可以自动存,系统 会自动将其装箱成封装类,然后将其加入到集合当中. 基本数据类型 包装类 byte Byte short Short

Java基础之路(一)下--引用数据类型之数组

上次我们说了java的基础数据类型,今天我们就来说一下引用数据类型中的数组. 什么是数组 数组:存储在一个连续的内存块中的相同数据类型(引用数据类型)的元素集合. 数组中的每一个数据称之为数组元素,数组中的元素以索引来表示其存放的位置,索引(下标)从0开始. 数组的定义 第一种方式:类型[] 数组名; 如 int[] nums;  第二种方式:类型数组名[]; 如 int nums[]; 大多数Java程序员喜欢使用第一种风格,因为它把数据类型int[],和变量名num分开了. 数组的初始化 J

JAVA中分为基本数据类型及引用数据类型

一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0 int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0 long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数