你真的理解了Collection和Map集合吗?

来源:互联网 发布:淘宝儿童电动汽车 编辑:程序博客网 时间:2024/05/22 06:55

我们在学习java的集合时,都知道接口Collection下有2个子接口:

    List   是有序的集合

    Set   是无顺序的集合

问题一:怎么有序了?

那么List所谓的有序是什么意思呢?初学者可能会有这个误解,就是我每次add进List的元素,它会自动排好序。这其实是不对的。我们看一个例子:

package CollectionTest;import java.util.ArrayList;import java.util.List;/** * @author zhengchao */public class TestMap {     public static void main(String[] args){        List<Integer> list = new ArrayList();        list.add(1);        list.add(3);        list.add(5);        list.add(4);        list.add(2);        list.add(1);        for(int str:list){            System.out.println(str);        }    }}
代码很简单,输出结果:
run:135421成功构建 (总时间: 0 秒)
发现输出的并没有顺序,我们说的List有序是指它能保持你插入元素是的顺序,即先插入放在前面。其实List的ArrayList存储的结构类似于数组。它的优点是随机访问某一个index的速度很快,基本就是o(1)的速度,但是ArrayList的add和remove就比较慢了。

我们看下运行时ArrayList的结构:


可以看到ArrayList的元素存储是按照你插入的先后来的。LinkedList与之类似,只不过其内部实现是基于链表结构的,即插入删除很快,但是若是要随机访问一个元素就需要遍历。他们都允许数据重复。
再看看Set的情况:
package CollectionTest;import java.util.HashSet;import java.util.Set;/** * @author zhengchao */public class TestMap {     public static void main(String[] args){        Set<String> set = new HashSet();        set.add("av");        set.add("bv");        set.add("cv");        set.add("av");        set.add("ev");        set.add("dv");        for(String str:set){            System.out.println(str);        }            }}
运行结果:
run:dvevbvcvav成功构建 (总时间: 0 秒)
我们发现Set接口的HashSet并不能保证元素插入时的顺序,并且不能有重复的元素。

问题二:Map和List、Set同级吗?
有些童鞋刚开始时,感觉这三个就是兄弟姐妹嘛,其实不然,我们看看他们的结构体系:


其实Map自己属于一个体系,你想想他的结构:key-value,明显感觉就和Colleciton不是一个‘种群’。

问题三:Map和List可以互相转换吗
转换可能谈不上,但是可以这样用:
package CollectionTest;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Map.Entry;/** * * @author zhengchao */public class Map_sort {            public static void main(String[] args){                Map<String,String> map = new HashMap();        map.put("A","@");        map.put("W","@");        map.put("E","@");        map.put("Q","@");        map.put("R","@");        map.put("B","@");        map.put("U","@");                //这样能得到map的key和value,在某些应用中,这很有用        for(Entry<String,String> entry:map.entrySet()){            System.out.println(entry.getKey()+""+entry.getValue());        }                //如果想对Map集合的元素按照key进行排序怎么办?如下,用Collections.sort方法        List<Map.Entry<String, String>> list = new LinkedList<>(map.entrySet());                Collections.sort(list, new Comparator<Map.Entry<String, String>>() {            @Override            public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {                return (o1.getKey()).compareTo(o2.getKey());            }        });        System.out.println(list);    } }
在上面的想对Map集合按照Key来排序的做法,我们使用了Collections.sort的方法。很管用,实际项目中用的也很多。
这里并没有讲Collection和Map的内容完全列出来,我感觉全部列出来会让读者感觉不舒服,的确,掌握几个基本的类的用法,其他的稍微了解,真正需要用时可以去查询官方api文档,我们不是机器,没法记住太多的东西,比如我,2k的记忆内存,记不了几个东东的,其他的都放在硬盘里啦,想用的时候再去读取。

1 0