假设我们有三个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( 有人能解释一下上面这段话的意思吗?
如文档所述,java中浅指针的含义是什么?
ArrayList中到底存储了什么。在显示结构的图像中,显示了ArrayList中每个元素都有两个指针。
据我所知,ArrayLists只能存储对象的引用变量。但是,从ArrayList中的块内部指向的指针是什么。
存储在ArrayLists中的是什么?
Bear momma = new Bear();
此代码是的缩写
Bear momma; [1]
new Bear(); [2]
momma = that thing; [3]
第一行创建一个新变量,并将其命名为momma。在java中,所有变量都很小。想一想带标题的便利贴。所以,这个抓取一张便利贴,在上面写一个标题,然后把它留空。
第二行是一整只熊,比便利贴大得多。记住:如果你想要一只新的熊,new Bear()
需要由你或其他人的代码执行。
第三行只是在你的便利贴上写下熊居住的地址。
便利贴很小;它们有足够的空间容纳基元(int
、long
、byte
、double
、float
、short
、boolean
、character
——这些都是在语言中硬编码的基元(。。或地址。
每当你调用一个方法时,你都会对你的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。可怜的布鲁诺。