内存中集合存放元素引用详解

前言

最近在学习java集合的学习过程中遇到了集合元素引用在内存里存储原理,即java中变量和引用变量在内存中的存储原理,这里简单的整理了一下,希望能对大家对java内内存存储有一个直观的认识,如果有讲的不对的地方也请大家在多多包涵并指出,废话不多说,下面我们围绕以下代码来进行讨论,问输出的四个变量的值是什么?。

package collection;
import java.util.ArrayList;
import java.util.Collection;

/**

  • 集合只能存放引用类型元素,并且存放的是元素的引用(地址)
  • @author 杨柯

*/
public class CollectionDemo2 {

public static void main(String[] args) {
	int a= 1;
	String b = "hello";
	Point p = new Point(1,2);
	Collection c = new ArrayList();
	c.add(p);
	test(a,b,p,c);
	
	System.out.println("a:"+a);
	System.out.println("b:"+b);
	System.out.println("p:"+p);
	System.out.println("c:"+c);
}
public static void test(int a,String b,Point p,Collection c) {
	a=2;
	b=b+"world";
	p.setX(3);
	p = new Point(5,6);
	c.clear();
	c.add(p);
	p.setY(7);
	c = new ArrayList();
	c.add(p);
}

}

类Point的代码如下
public class Point {
private int x;
private int y;

public Point(int x, int y) {
	super();
	this.x = x;
	this.y = y;
}

public int getX() {
	return x;
}

public void setX(int x) {
	this.x = x;
}

public int getY() {
	return y;
}

public void setY(int y) {
	this.y = y;
}

@Override
public String toString() {
	return "Point [x=" + x + ", y=" + y + "]";
}

public boolean equals(Object obj) {
	if(obj==null) {
		return false;
	}
	if(obj==this) {    //自己本身
		return true;
	}
	if(obj instanceof Point) {
		Point p = (Point)obj;
		return this.x ==p.x&&this.y ==p.y;
	}
	return false;
	
}

}
首先,我们要知道jvm内存分为4段,栈区,堆区,代码区,全局变量区。
堆(heap): 堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上。
栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量。这里我们主要讲这两部分。
一开始程序从main方法进入先将下列变量a,b,p,c这些局部变量存入到栈中,所创建的对象存入到堆中(1是基本类型,存入堆中,其他引用类型直接存到堆中,该引用类型的地址放到所对应的栈中)
效果如下下图。
在这里插入图片描述
在这里插入图片描述
当调用到test方法时,传入a,b,p,c这四个局部变量,即和上面的变量都指向同一对象,有一点要注意的地方是,拼接字符串会产生新的对象,变量b会指向新对象,(虚线代表删除)p也睡指向新对象,而c.clear()把集合里的引用删除(即黑色虚线),c.add§向集合中添加p对象()红色曲线,c也指向新的集合。如下图。
在这里插入图片描述
然后,当test方法执行完,这方法的局部变量都被清掉,然后GC开始回收对象,把不需要的对象释放掉,画绿线的地方都要被清除(没有被引用的)。如下图。
在这里插入图片描述
最后内存中的效果图如下图。
在这里插入图片描述
此时再输出a,b,p,c的值就很好看了。
a为1
b为 “hello”
p为所指向的这个对象的toString方法 即(3,2)
c为集合中所指向的那个对象 即[(5,7)]。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 的 collection 标签用于处理查询语句返回多条记录时,将多条记录封装到一个集合。collection 标签只能用于 resultMap 元素。 在 resultMap 元素使用 collection 标签,需要指定以下属性: - property:指定集合类型属性的名称。 - ofType:指定集合类型属性的数据类型。 - resultMap:指定为集合元素的映射关系。 - select:指定查询语句的 id。 下面是 collection 标签的一个示例: ```xml <resultMap id="userMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> <collection property="orders" ofType="Order" resultMap="orderMap"> <id property="id" column="id"/> <result property="userId" column="user_id"/> <result property="orderNo" column="order_no"/> <result property="amount" column="amount"/> </collection> </resultMap> <resultMap id="orderMap" type="Order"> <id property="id" column="id"/> <result property="userId" column="user_id"/> <result property="orderNo" column="order_no"/> <result property="amount" column="amount"/> </resultMap> ``` 在上述示例,我们定义了两个 resultMap,一个是 userMap,另一个是 orderMap。userMap 使用了 collection 标签,将订单封装到了 User 对象的 orders 属性。 注意,使用 collection 标签需要指定 ofType 属性,指定集合元素的数据类型。在上述示例,orders 是一个 List<Order> 类型的属性,因此我们指定了 ofType 属性为 Order。 同时,在 collection 标签还可以使用 select 属性,指定查询语句的 id。这个查询语句的返回结果将作为集合元素。 ```xml <collection property="orders" ofType="Order" select="findOrdersByUserId"/> ``` 在上述示例,我们使用了 select 属性,指定了一个查询语句的 id,这个查询语句的返回结果将作为 orders 集合元素

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值