什么是输出以及为什么ArrayList /任何Collection的行为都是这样的?

时间:2015-03-02 10:46:04

标签: java arraylist collections

下面说的是我的bean类:

public class Employee {

    private String name = null;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

这是我的主要课程:

import java.util.ArrayList;

public class MainClass {

    public static void main(String[] args) {

        Employee employee = new Employee();
        employee.setName("First name");

        ArrayList<Employee> empList = new ArrayList<Employee>();
        empList.add(employee);

        employee.setName("Last name");

        for (Employee emp : empList) {
            System.out.println(emp.getName());
        }
    }
}

当我执行输出时:Last name

我的问题是:

  1. 据我所知,Java是pass-by-value或更确切地说 pass-by-copy-of-the-variable-value然后复制 employee对象保存在ArrayList中,或者它引用了 Employee的原始对象随着对象值的变化而变化 添加到Last name后<{1}}
  2. 每个Collection都是这样的吗?

3 个答案:

答案 0 :(得分:4)

employee引用的副本已保存在ArrayList中,但由于它引用了相同的Employee实例,因此稍后通过employee引用更改实例会影响存储在ArrayList

中的元素

是的,每个Collection的行为都是这样的,因为Collection不会创建传递给它们的实例的副本,它们只存储对这些实例的引用。

答案 1 :(得分:2)

  
      
  1. 据我所知,Java是按价值传递,或者更确切地说是变量值的副本,然后是员工的副本   对象保存在ArrayList中,或者引用原始对象   Employee作为对象值后更改为姓氏   添加到ArrayList?
  2.   

引用将是按值传递。因此,将有2个引用指向同一个Employee实例。一个引用为employee,另一个引用位于arraylist

  
      
  1. 每个Collection都是这样的吗?
  2.   

是。实际上,这是 NOT 集合的属性。这是java的设计方式。所有可变引用类型都以这种方式运行。

答案 2 :(得分:0)

本地变量employee和列表的第一个元素是对同一个对象的两个不同引用。这就是为什么修改引用的对象(例如,通过setName),其中一个将通过另一个可见。

但是,如果您通过指定其他参考来替换参考,则 >不会影响另一参考。

E.g:

employee = new Employee();
employee.setName("Vishrant");

现在employee并且列表的第一个元素引用了不同的对象,因此数组中的元素将不会被称为"Vishrant"