java中容器如何维护其内容

List:

List list = new ArrayList();
Map map = null;
map = new HashMap();
map.put("a", 1);
list.add(map);
map = new HashMap();
map.put("b", 2);
System.out.println(list);
//输出[{a=1}]
List list = new ArrayList();
Map map = null;
map = new HashMap();
map.put("a", 1);
list.add(map);
map.put("b", 2);
System.out.println(list);
//输出[{a=1, b=2}]

Map:

Map map = new HashMap();
Dog dog = new Dog("dog1");
map.put("dog", dog);
dog.setName("dog2");
System.out.println(map);
//输出{dog=dog2}
Map map = new HashMap();
Dog dog = new Dog("dog1");
map.put("dog", dog);
dog = new Dog("dog2");
System.out.println(m);
//输出{dog=dog1}

也就是说,往容器中添加对象A,容器内部会有引用指向被添加的对象A本身,而不依赖容器外的A的引用。但是容器并不会创建A对象的副本,对A对象的任何修改都会影响容器内引用所指向的内容(也就是A)。

另外对获取的容器的Collection内容进行操作会影响容器内容:

public static void main(String[] args) {
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("A", "aaa");
    map.put("B", "bbb");
    System.out.println(map); //{A=aaa, B=bbb}

    Collection<String> values = map.values();
    values.remove("aaa");
    System.out.println(map); //{B=bbb}
}

map.keySet();map.entrySet();map.values(); 这些操作返回的容器内容都指向map的内容对象,所以不要改变这些方法返回的容器的内容引用所指向的对象。

在遍历容器的时候,改变容器的长度会抛出java.util.ConcurrentModificationException

public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    list.add("AAA");
    for(String s : list){
        list.add("BBB");
    }
}
posted @ 2018-12-07 09:16  xuejianbest  阅读(214)  评论(0编辑  收藏  举报