2014-10-10 17 views
2

员工和业余爱好是计划中的两个班级。在for循环中,Employee和Hobby对象在每次迭代中都得到初始化,它们会每次指向一个新的内存位置还是指向同一个位置?如果在我的for循环中相同的对象在所有迭代中被初始化,会发生什么?

public void addEmployees(int a, HashMap<Employee,Hobby> hMap) 
{ 
    Scanner obj = new Scanner(System.in); 
    Scanner obj1 = new Scanner(System.in); 

    for(int i =0; i<a ; i++) 
    { 
     Employee emp = new Employee(); 
     Hobby hob = new Hobby(); 
     System.out.println("Enter id of employee:"); 
     int num = obj.nextInt(); 
     emp.setEmployeeId(num); 

     System.out.println("Enter name of employee:"); 
     String str = obj1. nextLine(); 
     emp.setName(str); 

     hob.enterHobby(); 
     hMap.put(emp,hob); 
    }  
} 
+0

“每次都在堆上创建新对象,它们可能指向同一位置,也可能不指向相同的位置。”用户评论Andy – Trilarion 2014-10-10 07:03:10

回答

0

每次都在堆上创建新对象。他们可能会或可能不会指向相同的位置。

+0

实际上并不表示他们会得到新的地址。这很可能但不确定。这也是无关紧要的。 – EJP 2014-10-10 05:16:50

+0

在我上面的代码中不覆盖equals函数并将其插入哈希映射的情况下,内存位置变得相关。如果内存位置不同,那么只有这样我才能在hashmap中拥有多个条目,否则不会。 – shubh 2014-10-10 08:28:07

1

实际的内存位置是不相关的,因为它对Java程序不可见,但是在每次迭代过程中都会构造一个新对象。

+0

在我上面的代码中不重写equals函数并将其插入哈希映射的情况下,内存位置变得相关。 如果内存位置不同,那么只有这样我才能在hashmap中有多个条目,否则就不会。 – shubh 2014-10-10 08:25:10

+0

但是,它不是内存中的*位置*,它只是事实,即您有两个不同的对象,而不是两个对同一对象的引用。您可以合理地预期不同的对象存储在内存中的不同位置,但这是JVM中的实现细节。对你的程序来说重要的是JVM知道它们不是同一个对象。 – Wyzard 2014-10-10 08:30:08

+0

是和JVM(如果没有任何重写版本的equals()函数)会将两个对象视为相同,如果它们指向相同的位置。 所以这就是考虑内存位置对我来说很重要的地方。 – shubh 2014-10-10 12:39:20

相关问题