关于java集合的内存地址引用

探讨了Java中集合引用不同类型对象时的行为差异,包括基本类型、String、自定义对象等,分析了引用地址与值变化的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合引用Integer,Double的类型时引用的是它的值,集合值改变,引用的值不变
集合引用引用数据类型时(除String和上述类型)引用的是它的地址,

引用的是地址:

 //定义一个实例化的point对象
        Point p = new Point(1, 2);

        //集合list1
        List<Point> list1 = new ArrayList<>();
        list1.add(p);
        list1.add(new Point(3, 4));

        //集合list2
        List<Point> list2 = new ArrayList<>();
        list2.add(p);
        list2.add(new Point(3, 4));

        //获取两个集合的地址信息
        System.out.println(list1);
        System.out.println(list2);

结果:
[collection.Point@3e2, collection.Point@422]
[collection.Point@3e2, collection.Point@422]

修改一个引用信息(修改的是实例化对象的可共享修改):

 //定义一个实例化的point对象
        Point p = new Point(1, 2);

        //集合list1
        List<Point> list1 = new ArrayList<>();
        list1.add(p);
        list1.add(new Point(3, 4));

        //集合list2
        List<Point> list2 = new ArrayList<>();
        list2.add(p);
        list2.add(new Point(3, 4));

        System.out.println("修改前:");
        System.out.println(list1);
        System.out.println(list2);
        
        //修改p的x值
        p.setX(11);
		//list1.get(0).setX(8);   p是实例化的对象修改集合中的p值对象p的值也会改变
        //获取两个集合的地址信息
        System.out.println("修改后:");
        System.out.println(list1);
        System.out.println(list2);

结果:
修改前:
[Point{x=1, y=2}, Point{x=3, y=4}]
[Point{x=1, y=2}, Point{x=3, y=4}]

修改后:
[Point{x=11, y=2}, Point{x=3, y=4}]
[Point{x=11, y=2}, Point{x=3, y=4}]

修改前:
[collection.Point@3e2, collection.Point@422]
[collection.Point@3e2, collection.Point@422]

修改后:
[collection.Point@4bb, collection.Point@422]
[collection.Point@4bb, collection.Point@422]

修改一个属性信息(匿名对象修改值不共享):

  //定义一个实例化的point对象
        Point p = new Point(1, 2);

        //集合list1
        List<Point> list1 = new ArrayList<>();
        list1.add(p);
        list1.add(new Point(3, 4));

        //集合list2
        List<Point> list2 = new ArrayList<>();
        list2.add(p);
        list2.add(new Point(3, 4));   //new Point(3, 4)匿名对象

        System.out.println("修改前:");
        System.out.println(list1);
        System.out.println(list2);
        //修改匿名实例化的的x值
        list1.get(1).setX(8);

        //获取两个集合的地址信息
        System.out.println("修改后:");
        System.out.println(list1);
        System.out.println(list2);

修改前:
[Point{x=1, y=2}, Point{x=3, y=4}]
[Point{x=1, y=2}, Point{x=3, y=4}]
修改后:
[Point{x=1, y=2}, Point{x=8, y=4}]
[Point{x=1, y=2}, Point{x=3, y=4}]
修改前:
[collection.Point@3e2, collection.Point@422]
[collection.Point@3e2, collection.Point@422]
修改后:
[collection.Point@3e2, collection.Point@4bd]
[collection.Point@3e2, collection.Point@422]

类似于String常量池,(String不使用new String实例化)先从池中找到是否存在该值
若存在,引用它的值,若不存在在重新创建一个值
上述代码中匿名对象无固定的堆内存,只是拥有引用地址,所以改变了第一个引用地址
无法改变第二个(如同string)
而实例化对象的有固定的引用地址,所以改变他的值,其余引用的也会改变

同样删除操作只对集合本身有关,无法影响其他集合

 Point p = new Point(1, 2);

        //集合list1
        List<Point> list1 = new ArrayList<>();
        list1.add(p);
        list1.add(new Point(3, 4));

        //集合list2
        List<Point> list2 = new ArrayList<>();
        list2.add(p);
        list2.add(new Point(3, 4));

        System.out.println("修改前:");
        System.out.println(list1);
        System.out.println(list2);
        //修改匿名实例化的的x值
        list1.get(1).setX(8);

        //获取两个集合的地址信息
        System.out.println("修改后:");
        System.out.println(list1);
        System.out.println(list2);

        list1.remove(1);
        System.out.println(list1);
        System.out.println(list2);

[Point{x=1, y=2}]
[Point{x=1, y=2}, Point{x=3, y=4}]
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值