对于给出的代码将存储在 ArrayList 中的内容? Java 中的浅指针是什么?
For the code given what will be stored in ArrayList? What are shallow pointers in 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);
以上代码生成文档中所示的内存结构。
请注意,行 bears.add(momma) 没有将 momma Bear 对象的副本添加到 ArrayList。相反,它只是将指向熊妈妈对象的指针添加到 ArrayList。在 Java 中,这样的“浅”指针指向一个对象是很常见的——有一个对象有许多指向它的指针。
内存结构请参考下面给出的文档第3页的示意图:
Document
我的疑惑,
1)有人能解释一下上面这段话想表达的意思吗?
文档中说的java中的shallow pointer是什么意思?
ArrayList 中到底存储了什么。在显示结构的图像中,显示有两个指针指向 ArrayList 中的每个元素。
据我所知,ArrayLists 只能存储对象的引用变量。但是,从ArrayList中的块内部指向的指针是什么。
ArrayList 中存储的是什么?
Bear momma = new Bear();
此代码是 shorthand 为此:
Bear momma; [1]
new Bear(); [2]
momma = that thing; [3]
第一行创建了一个新变量,并将其命名为momma。在 java、 所有 变量都很小。想想 post-it 带有标题的笔记。所以,这会抓取一张 post-it 便条,在上面写上标题,然后将其留空。
第二行是一整只熊,比 post-it 纸币大得多。请记住:如果您想要一个新的熊,new Bear()
需要由您或其他人的代码执行。
第三行简单地写下熊在您post-it上的住址地址。
Post-its 很小;他们有足够的空间容纳原语(int
、long
、byte
、double
、float
、short
、boolean
character
- 这就是所有原语,用语言硬编码)..或地址。
每当你调用一个方法时,你都会复制你的post它(post它很小而你有很多)然后交给复制到方法中。方法完成后,它会将那些 post 扔进垃圾桶。
让我们尝试一些东西。假设熊有一个 setName
方法。
Bear bear1 = new Bear();
Bear bear2 = bear1;
bear1.setName("Bruno");
System.out.println(bear2.getName());
这将打印 B运行o! - 我们有 2 个 post,它们的地址相同。只有一只熊。
Bear bear = new Bear();
bear.setName("Bruno");
test(bear);
System.out.println(bear.getName());
public void test(Bear bear) {
bear.setName("Brenda");
}
这将打印“Brenda”。我们做了一个新的熊,然后我们有一个 post-it 和这个熊的地址。然后我们把这个post复制一份,交给测试方法。然后该方法跟随 post 上的地址(.
是 java 表示:跟随(“取消引用”是官方术语)并告诉熊它在那里找到它的名字是什么。
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;
}
这会打印出 B运行o!你可能已经预料到了布伦达。请记住,java 中的 =
是:“擦除你的 postit 并复制此 postit 的地址”。
主代码将 postit 的副本交给测试方法。这个测试方法然后把这张post擦掉,在上面写上另一只熊的地址,然后把纸条扔进垃圾桶。 test
方法在这里没有任何用处。
ArrayLists 是 postits 的列表。不是熊的名单 - 这需要整个动物园,太笨重了。
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 的副本。其中将包含 brenda 的地址。 (为什么是副本?一切都是副本,一直都是。Java 正在复制数百万个 post 它。从 CPU 的角度来看,它只是复制一个数字而已)。
Bear bear = new Bear("bruno");
bear = new Bear("brenda");
这是一只新熊,写在你的 post-it 上,记下它的地址。
然后它又制造了一只熊(我们现在有 2 只熊)。然后它将地址划出到 b运行o 并将地址写入 brenda。
b运行o 会怎样? B运行o 在树林里迷路了。现在世界上有零个 post-its 上面有 B运行o 的地址,所以这个信息(b运行o 住的地方)丢失了。 B运行o 还在附近,但我们不知道在哪里。林海茫茫,没关系,我们永远运行成不了他。
最终,垃圾收集器将完全摆脱 b运行o。可怜的b运行o.
假设我们有三个 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);
以上代码生成文档中所示的内存结构。
请注意,行 bears.add(momma) 没有将 momma Bear 对象的副本添加到 ArrayList。相反,它只是将指向熊妈妈对象的指针添加到 ArrayList。在 Java 中,这样的“浅”指针指向一个对象是很常见的——有一个对象有许多指向它的指针。
内存结构请参考下面给出的文档第3页的示意图: Document
我的疑惑,
1)有人能解释一下上面这段话想表达的意思吗?
文档中说的java中的shallow pointer是什么意思?
ArrayList 中到底存储了什么。在显示结构的图像中,显示有两个指针指向 ArrayList 中的每个元素。
据我所知,ArrayLists 只能存储对象的引用变量。但是,从ArrayList中的块内部指向的指针是什么。
ArrayList 中存储的是什么?
Bear momma = new Bear();
此代码是 shorthand 为此:
Bear momma; [1]
new Bear(); [2]
momma = that thing; [3]
第一行创建了一个新变量,并将其命名为momma。在 java、 所有 变量都很小。想想 post-it 带有标题的笔记。所以,这会抓取一张 post-it 便条,在上面写上标题,然后将其留空。
第二行是一整只熊,比 post-it 纸币大得多。请记住:如果您想要一个新的熊,new Bear()
需要由您或其他人的代码执行。
第三行简单地写下熊在您post-it上的住址地址。
Post-its 很小;他们有足够的空间容纳原语(int
、long
、byte
、double
、float
、short
、boolean
character
- 这就是所有原语,用语言硬编码)..或地址。
每当你调用一个方法时,你都会复制你的post它(post它很小而你有很多)然后交给复制到方法中。方法完成后,它会将那些 post 扔进垃圾桶。
让我们尝试一些东西。假设熊有一个 setName
方法。
Bear bear1 = new Bear();
Bear bear2 = bear1;
bear1.setName("Bruno");
System.out.println(bear2.getName());
这将打印 B运行o! - 我们有 2 个 post,它们的地址相同。只有一只熊。
Bear bear = new Bear();
bear.setName("Bruno");
test(bear);
System.out.println(bear.getName());
public void test(Bear bear) {
bear.setName("Brenda");
}
这将打印“Brenda”。我们做了一个新的熊,然后我们有一个 post-it 和这个熊的地址。然后我们把这个post复制一份,交给测试方法。然后该方法跟随 post 上的地址(.
是 java 表示:跟随(“取消引用”是官方术语)并告诉熊它在那里找到它的名字是什么。
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;
}
这会打印出 B运行o!你可能已经预料到了布伦达。请记住,java 中的 =
是:“擦除你的 postit 并复制此 postit 的地址”。
主代码将 postit 的副本交给测试方法。这个测试方法然后把这张post擦掉,在上面写上另一只熊的地址,然后把纸条扔进垃圾桶。 test
方法在这里没有任何用处。
ArrayLists 是 postits 的列表。不是熊的名单 - 这需要整个动物园,太笨重了。
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 的副本。其中将包含 brenda 的地址。 (为什么是副本?一切都是副本,一直都是。Java 正在复制数百万个 post 它。从 CPU 的角度来看,它只是复制一个数字而已)。
Bear bear = new Bear("bruno");
bear = new Bear("brenda");
这是一只新熊,写在你的 post-it 上,记下它的地址。
然后它又制造了一只熊(我们现在有 2 只熊)。然后它将地址划出到 b运行o 并将地址写入 brenda。
b运行o 会怎样? B运行o 在树林里迷路了。现在世界上有零个 post-its 上面有 B运行o 的地址,所以这个信息(b运行o 住的地方)丢失了。 B运行o 还在附近,但我们不知道在哪里。林海茫茫,没关系,我们永远运行成不了他。
最终,垃圾收集器将完全摆脱 b运行o。可怜的b运行o.