集合引用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}]