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

我们在学习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:
1
3
5
4
2
1
成功构建 (总时间: 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:
dv
ev
bv
cv
av
成功构建 (总时间: 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的记忆内存,记不了几个东东的,其他的都放在硬盘里啦,想用的时候再去读取。

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值