当前位置: 首页 > 知识库问答 >
问题:

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

史和泰
2023-03-14

假设我们有三个熊对象:妈妈、爸爸和宝宝。我们创建一个“bears”ArrayList,并将指向三个bears的指针添加到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);

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

请注意,行bears.add(妈妈)没有将妈妈熊对象的副本添加到ArrayList。相反,它只是向ArrayList添加了一个指向妈妈熊对象的指针。在Java中,有这样一个对象的“浅”指针是很常见的——有一个对象周围分布着许多指向它的指针。

关于内存结构,请参考下面文档第3页的图表

我的疑惑,

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

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

ArrayList中存储的确切内容。在显示结构的图像中,显示了ArrayList中每个元素都有两个指针。

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

存储在ArrayList中的是什么?

共有1个答案

尤博达
2023-03-14

熊妈妈=新熊()

此代码是以下内容的简写:

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

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

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

第三行只是在你的帖子上写下熊的住址。

贴子很小;它们有足够的空间容纳原语(intlongbytedoublefloatshortboolean字符——这些都是原语,在语言中是硬编码的)。。或者一个地址。

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

让我们试试看。假设熊有一个setName方法。

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

这将打印布鲁诺我们有两个帖子,上面都有相同的地址。只有一只熊。

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

public void test(Bear bear) {
  bear.setName("Brenda");
}

这将打印“布伦达”。我们做了一只新的熊,然后我们有一个贴着这只熊地址的帖子。然后我们复制一份这个帖子,交给测试方法。然后,该方法跟随post-it上的地址(是java for:Follow(“解除引用”是官方术语),并告诉它在那里找到的熊它的名字。

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中是:“擦除您的帖子并复制此帖子的地址”。

主代码将posit的副本交给测试方法。然后,这种测试方法将这张便条擦去,在上面写下另一只熊的地址,然后将便条扔进垃圾箱。test方法在这里没有任何用处。

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);
}

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

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

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

然后它再制造另一只熊(我们现在有2只熊)。然后,它划掉给布鲁诺的地址,并在上面写下给布伦达的地址。

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

最终,垃圾收集器将彻底清除布鲁诺。可怜的布鲁诺。

 类似资料:
  • 问题内容: 在Java对象中存储本机指针的“正确”方法是什么? 如果碰巧知道本机指针的大小为<= 32位,则可以将指针视为Java ;如果碰巧知道本机指针的大小为<= 64位,则可以将Java处理为指针。但是,有没有更好或更干净的方法呢? 编辑 :返回从JNI功能的原生指针是什么我 也不 想做。我宁愿返回代表本地资源的Java对象。但是,我返回的Java对象可能必须具有包含指针的字段,这使我回到了

  • 本文向大家介绍什么是指向指针的指针? 相关面试题,主要包含被问及什么是指向指针的指针? 时的应答技巧和注意事项,需要的朋友参考一下 指针指向的变量是一个指针,即具体内容为一个指针的值,是一个地址. 此时指针指向的变量长度也是4位.

  • 问题内容: 我有一个大约十行代码的方法。我想创建更多功能完全相同的方法,只是进行少量计算会更改一行代码。这是传入函数指针以替换该行的理想应用程序,但是Java没有函数指针。我最好的选择是什么? 问题答案: 匿名内部阶级 假设你要传入的函数返回一个参数。 首先,如果你不能重用现有的接口,则必须定义一个以该函数作为其唯一成员的接口。 使用指针的方法将只接受实例,如下所示: 就像这样: 编辑:在Java

  • 问题内容: 我是Java开发的新手,我来自C#.net,正在开发android应用程序。 我正在寻找与Java中的IDictionary相同的Java中使用的键值列表。 谢谢 http://codingdict.com/questions/14826http://codingdict.com/questions/148269 问题答案: Java具有Hashtable和HashMap 看到Hash

  • 本文向大家介绍什么是数据结构中的指针? 相关面试题,主要包含被问及什么是数据结构中的指针? 时的应答技巧和注意事项,需要的朋友参考一下 其实就是指向一块内存的地址,通过指针传递,可实现复杂的内存访问. 函数指针? 指向一块函数的入口地址. 指针作为函数的参数? 比如指向一个复杂数据结构的指针作为函数变量 这种方法避免整个复杂数据类型内存的压栈出栈操作,提高效率. 注意:指针本身不可变,但指针指向的

  • 本文向大家介绍什么是指针的释放? 相关面试题,主要包含被问及什么是指针的释放? 时的应答技巧和注意事项,需要的朋友参考一下 具体来说包括两个概念. 1 释放该指针指向的内存,只有堆上的内存才需要我们手工释放,栈上不需要. 2 将该指针重定向为NULL.