对于给定的代码,将在ArrayList中存储什么?Java中的浅指针是什么



假设我们有三个Bear对象:momma、poppa和baby。我们创建了一个";熊;ArrayList,并将指向三只熊的指针添加到ArrayList中。

// Create three bears 
Bear momma = new Bear();
Bear poppa = new Bear(); 
Bear baby = new Bear(); 

// Create an ArrayList, add the three Bear pointers 
ArrayList bears = new ArrayList();
bears.add(momma); 
bears.add(poppa);
bears.add(baby);

上面的代码生成了文档中显示的内存结构。

请注意,带有.add(momma(的行并没有将momma-Bear对象的副本添加到ArrayList中。相反,它只是将指向momma Bear对象的指针添加到ArrayList中。在Java中;浅";指向一个对象的指针-有一个对象有许多指针分布在指向它的周围。

有关内存结构,请参阅以下文件第3页的图表:文档

我的疑虑,

1( 有人能解释一下上面这段话的意思吗?

  1. 如文档所述,java中浅指针的含义是什么?

  2. ArrayList中到底存储了什么。在显示结构的图像中,显示了ArrayList中每个元素都有两个指针。

据我所知,ArrayLists只能存储对象的引用变量。但是,从ArrayList中的块内部指向的指针是什么。

存储在ArrayLists中的是什么?

Bear momma = new Bear();

此代码是的缩写

Bear momma; [1]
new Bear(); [2]
momma = that thing; [3]

第一行创建一个新变量,并将其命名为momma。在java中,所有变量都很小。想一想带标题的便利贴。所以,这个抓取一张便利贴,在上面写一个标题,然后把它留空。

第二行是一整只熊,比便利贴大得多。记住:如果你想要一只新的熊,new Bear()需要由你或其他人的代码执行。

第三行只是在你的便利贴上写下熊居住的地址

便利贴很小;它们有足够的空间容纳基元(intlongbytedoublefloatshortbooleancharacter——这些都是在语言中硬编码的基元(。。或地址。

每当你调用一个方法时,你都会对你的postit进行复制(postit很小,你有很多(,并将副本交给该方法。当这个方法完成后,它会把那些帖子扔进垃圾桶。

让我们尝尝吧。假设熊有一个setName方法。

Bear bear1 = new Bear();
Bear bear2 = bear1;
bear1.setName("Bruno");
System.out.println(bear2.getName());

这将打印布鲁诺!-我们有两个邮差,都有相同的地址。只有一只熊。


Bear bear = new Bear();
bear.setName("Bruno");
test(bear);
System.out.println(bear.getName());
public void test(Bear bear) {
bear.setName("Brenda");
}

这将打印";Brenda";。我们做了一只新的熊,然后我们有一个贴上这只熊的地址。然后我们复制这个帖子,交给测试方法。然后,该方法跟随便利贴上的地址(.是java表示:Follow("Dereference"是官方术语(,并告诉它在那里找到的熊它的名字


private static final Bear brenda = new Bear("brenda");
...
Bear bear = new Bear();
bear1.setName("Bruno");
test(bear);
System.out.println(bear1.getName());
public void test(Bear bear) {
bear = brenda;
}

这是布鲁诺的指纹!你可能已经预料到了布伦达。记住,java中的=是:;把你的帖子擦掉,把这个帖子的地址抄下来;。

主代码将postit的副本交给测试方法。然后,这种测试方法将这个帖子擦掉,在上面写下另一只熊的地址,然后将纸条扔进垃圾桶。test方法在这里没有任何用处。


ArrayLists是职位列表。不是熊的名单——这需要一个完整的动物园,太笨重了。

Bear bear = new Bear();
List<Bear> bears = new ArrayList<Bear>();
bears.add(bear);
test(bears);
System.out.println(bears.get(0));
public void test(List<Bear> bears) {
bears.clear();
bears.add(brenda);
}

上面代码的测试方法从列表中删除了带有第一个熊地址的postit,然后添加了一个带有brenda地址的新postit。然后主代码从列表中获取第一个postit的副本。上面会有布伦达的地址。(为什么是副本?一直以来,一切都是副本。Java正在复制数百万个帖子。从CPU的角度来看,它只是复制一个数字(。


Bear bear = new Bear("bruno");
bear = new Bear("brenda");

这是一只新的熊,在你的一个帖子上写下它的地址。

然后它又生了一只熊(我们现在有两只熊(。然后它把地址划掉给布鲁诺,并把地址写在上面给布伦达

布鲁诺怎么了?布鲁诺在树林里迷路了。现在世界上没有布鲁诺地址的便利贴,所以这些信息(布鲁诺住在哪里(就丢失了。布鲁诺还在,但我们不知道在哪里。森林很大,没关系,我们永远不会碰到他。

最终,垃圾收集器将完全清除bruno。可怜的布鲁诺。

最新更新