map、set、list集合操作汇总

map类型对比

HashMap:遍历时,获取数据的顺序完全随机;不支持线程同步;
LinkedHashMap:可以保存记录的插入顺序,遍历输出的顺序和插入的顺序一致;
TreeMap:遍历时,保存的记录可以根据键自动排序;
HashTable:支持线程同步;不允许记录的键或者值为空;

public class mapTest {
    public static void main(String args[]){
        System.out.println("*************************LinkedHashMap*************");
        Map<Integer,String> map = new LinkedHashMap<Integer,String>();
        map.put(7, "阿里");
        map.put(9, "腾讯");
        map.put(6,"百度");
        for (Iterator it = map.keySet().iterator(); it.hasNext();)
        {
            Object key = it.next();
            System.out.println( key+"="+ map.get(key));
        }

        System.out.println("*************************HashMap*************");
        Map<String,String> map1 = new HashMap<String, String>();
        map1.put("7", "阿里");
        map1.put("9", "腾讯");
        map1.put("6", "百度");
        for(Iterator it1 =  map1.keySet().iterator();it1.hasNext();){
            Object key = it1.next();
            System.out.println(key+"="+map1.get(key));

        }

        System.out.println("*************************TreeMap*************");
        Map<Integer,String> map2 = new TreeMap<Integer, String>();
        map2.put(7, "阿里");
        map2.put(9, "腾讯");
        map2.put(6, "百度");
        for(Iterator it2 =  map2.keySet().iterator();it2.hasNext();){
            Object key = it2.next();
            System.out.println(key+"="+map2.get(key));

        }
    }
}

运行结果如下:
在这里插入图片描述

HashMap的遍历方法

public static void main(String args[]){
        System.out.println("*************************LinkedHashMap*************");
        Map<Integer,String> map = new LinkedHashMap<Integer,String>();
        map.put(7, "阿里");
        map.put(9, "腾讯");
        map.put(6,"百度");

        //遍历map
        //方法1.1,keySet遍历,同时获取key和value:6=百度
        for (Iterator it = map.keySet().iterator(); it.hasNext();)
        {
            Object key = it.next();
            System.out.println( key+"="+ map.get(key));
        }

        //方法1.2,keySet遍历,只需要map的key或者value
//        //KeySet 获取key
//        for (Integer key : map.keySet()) {
//            System.out.println(key);
//        }
//        // values 获取value
//        for (String value : map.values()) {
//            System.out.println(value);
//        }

        //方法2,Iterator遍历,可删除元素:Key: 7;   Value: 阿里
//        Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
//        while (it.hasNext()) {
//            Map.Entry<Integer, String> e2 = it.next();
//            // e2.remove(); 删除元素
//            System.out.println("Key: " + e2.getKey() + ";   Value: " + e2.getValue());
//        }

        //方法3,entrySet遍历, 同时获取key,value,推荐使用
//        for (Map.Entry<Integer, String> entry : map.entrySet()) {
//            System.out.println(entry.getKey() + ":" + entry.getValue());
//        }

        //方法4,Lambda遍历,性能低于entrySet
//         map.forEach((key, value) -> {
//              System.out.println(key + ":" + value);
//         });
}

Set类型对比

HashSet:遍历时,获取数据的顺序完全随机;不支持线程同步;
LinkedHashSet:可以保存记录的插入顺序,遍历输出的顺序和插入的顺序一致;
TreeSet:遍历时,保存的记录可以根据键自动排序;

HastSet和TreeSet是Set的两种典型:一般我们首选HashSet,当我们需要保持一个排序的set时,才选择TreeSet。由于TreeSet需要红黑树来维护元素次序,所有HashSet比TreeSet的性能更好。
而LinkedHashSet是HashSet的一个子类,LinkedHashSet的底层实现是链表,所以可以维护元素的插入顺序,因此遍历LinkedHashSet会更快;但对于普通的插入、删除等操作,HashSet效率更高。

从三种Set集合和Map集合对比来看,Set和Map惊人的相似。其实从Java源码看,Java是先实现了Map,然后通过包装一个所有value都为Null的Map就实现了Set集合。所以Map子类和Set子类名字相似、Map里key集和Set集合里元素的存储形式也相似、且Set和Map子类功能也相似。

/**
     * Set集合
     * @param args
     */
    public static void main(String args[]){
        //LinkedHashSet:可以保存记录的插入顺序,遍历输出的顺序和插入的顺序一致;
        System.out.println("*************************LinkedHashSet*************");
        LinkedHashSet set0 = new LinkedHashSet();
        set0.add(7);
        set0.add(9);
        set0.add(6);
        set0.add(8);
        set0.add(null);
        System.out.println(set0);

        //HashSet:遍历时,获取数据的顺序完全随机;不支持线程同步;
        System.out.println("*************************HashSet*************");
        HashSet set1 = new HashSet();
        set1.add(7);
        set1.add(9);
        set1.add(6);
        set1.add(8);
        set1.add(null);
        System.out.println(set1);

        //TreeSet:遍历时,保存的记录可以根据键自动排序;
        System.out.println("*************************TreeSet*************");
        //1、自然排序,元素对象默认实现Comparator接口
        TreeSet set2 = new TreeSet();
        set2.add(7);
        set2.add(9);
        set2.add(6);
        set2.add(8);
        System.out.println(set2);
        //2、定制排序,元素对象不需要实现接口,创建set集合时提供Comparator接口与集合关联
        
    }
}

运行结果如下:
在这里插入图片描述

List集合对比

ArrayList:是基于数组的线性表,随机访问时性能好,使用随机访问法(get)遍历较好
LinkedList:是基于链表的线性表,执行删除、插入时性能比较好,使用迭代器Iterator遍历较好
PriorityQueue:队列实现类,元素顺序是按队列元素大小进行排序,所以并不是标准队列,不符合先进先出
ArrayDeque:双端队列,允许从两端来操作;还可以当栈使用(pop()/push())

  /**
     * List集合
     * @param args
     */
    public static void main(String args[]){
        //ArrayList:是基于数组的线性表,随机访问时性能好,使用随机访问法(get)遍历较好
        System.out.println("*************************LinkedHashSet*************");
        List list0 = new ArrayList();
        list0.add(7);
        list0.add(9);
        list0.add(6);
        list0.add(8);
        list0.add(null);
        //for(int i = 0;i <list0.size(); i++){
        //    System.out.println(list0.get(i));
       // }
        System.out.println(list0);

        //LinkedList:是基于链表的线性表,执行删除、插入时性能比较好,使用迭代器Iterator遍历较好
        //是Lint接口实现类,可以当list;还实现了deque接口,可以当双端队列,也可以当栈
        System.out.println("*************************LinkedList*************");
        LinkedList list1 = new LinkedList();
        //------------------------预想排在第三位
        list1.add(7);
        list1.offer(9);
        //栈顶部------------------预想排在第二位
        list1.push(6);
        //队列头部(相当于栈顶部)--预想排在第一位
        list1.offerFirst(8);
        //队列尾部
        list1.offerLast(null);
        //for (Iterator<Integer> iterator = list1.iterator(); iterator.hasNext();) {
        //      System.out.println(iterator.next());
        //}
        System.out.println(list1);

        //PriorityQueue:队列实现类,元素顺序是按队列元素大小进行排序,所以并不是标准队列,不符合先进先出
        System.out.println("*************************PriorityQueue*************");
        //1、自然排序,元素对象默认实现Comparator接口
        PriorityQueue queue = new PriorityQueue();
        queue.offer(7);
        queue.offer(9);
        queue.offer(6);
        queue.offer(8);
        System.out.println(queue);
        //2、定制排序,元素对象不需要实现接口,创建set集合时提供Comparator接口与集合关联

        //ArrayDeque:双端队列,允许从两端来操作;还可以当栈使用(pop()/push())
        //程序需要使用栈时,推荐使用ArrayDeque,尽量避免使用stack
        System.out.println("*************************ArrayDeque*************");
        //1、自然排序,元素对象默认实现Comparator接口
        ArrayDeque deque = new ArrayDeque();
        deque.offer(7);
        deque.offer(9);
        deque.offer(6);
        deque.offer(8);
        //访问第一个,但并不将第一个元素删除出栈
        System.out.println(queue.peek());
        //访问第一个,但将第一个元素删除出栈????????为什么没有pop()方法
        //System.out.println(queue.pop());
        System.out.println(queue);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子松的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值