List、Set、Map比较

package test;

import java.util.*;

/**
 * 三大集合区别List Set Map
 */
public class Test06 {
    /**
     * Collection是单列集合的根接口,主要用于存储一系列符合某种规则的元素,它有两个重要的子接口List和Set。
     * List接口的特点是元素有序可重复
     * Set接口的特点是元素无序,不可重复
     * ArrayList和LinkedList是List接口的实现类
     * HashSet和TreeSet是Set接口的实现类
     */
    static void testCollection(){
        System.out.println("Test Collection- - - -- - -- - -- - ");
        String a ="A";
        String b ="B";

        //由于Collection是接口,所以无法实例化,而ArrayList类是Collection接口的间接实现类,所以可以通过ArrayList实例化:
        Collection<String> list1 = new ArrayList<String>();
        list1.add(a);
        list1.add(b);

        Collection<String> list2 = new ArrayList<String>();
        list2.addAll(list1);

        Iterator<String> it1 = list1.iterator();
        while(it1.hasNext()) {
            String str1 = it1.next();
            System.out.println(str1);
        }
        System.out.println("-------");

        Iterator<String> it2 = list2.iterator();
        while(it2.hasNext()) {
            String str = it2.next();
            System.out.println(str);
        }
        System.out.println("-------");

        System.out.println(list1==list2);
        //Collection底层重写了equals()方法,使得eqals()比较两个list的值,而不是地址值
        System.out.println(list1.equals(list2));
        System.out.println("-------");

        System.out.println(list1.contains(a));
    }

    /**
     * List集合的特点就是存取有序,可以存储重复的元素,可以用下标进行元素的操作
     *
     * 2.ArrayList集合
     * ArrayList支持可随需要而增长的动态数组。在Java数组中,长度是固定的,因此在数组被创建后,
     * 不能修改长度,这意味着开发者需要实现知道数组的长度。
     * 但在一般情况下,只有在运行时才知道数组长度。为了解决这个问题,ArrayList因此而生。
     *
     * 注意,list1开始为空,随着元素的加入,大小增加。当每个元素被删除时,大小会每次变小。
     *
     * 底层是使用数组实现,所以查询速度快,增删速度慢
     *
     * LinkedList:是基于链表结构实现的,所以查询速度慢,增删速度快,提供了特殊的方法,对头尾的元素操作(进行增删查)
     *
     * ArrayList与LinkedList
     * ArrayList和LinkedList顾名思义,ArrayList是Array(动态数组)的数据结构,相当于动态数组;LinkedList是Link(链表)的双向数据结构,也可当作堆栈、队列、双端队列。
     * 对于随机访问List时(get和set操作),ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
     * 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据(可以在上述ArrayList代码中体现)。
     * 两者缺点都为线性不安全
     */
    static void testList(){
        System.out.println("测试 ArrayList");
        List<Stu> list1 = new ArrayList<>();
        list1.add(new Stu("lili",001));
        list1.add(new Stu("haha",002)); //匿名对象存入集合
        list1.add(new Stu("wawa",003));
        Iterator<Stu> it=list1.iterator();
        while(it.hasNext()) {
            Stu stu = it.next();
            System.out.println(stu.getName()+stu.getId());
        }

        System.out.println("测试 LinkedList");
        List<Stu> list2 = new LinkedList<>();
        list2.add(new Stu("first",004));
        list2.add(new Stu("second",005));
        list2.add(new Stu("third",006));

        ((LinkedList<Stu>) list2).addFirst(new Stu("forth",007));

        while(!list2.isEmpty()){
            Stu stu = ((LinkedList<Stu>) list2).pop();
            System.out.println(stu.getName()+stu.getId());
        }

        System.out.println(list2.size());

    }

    static void testSet(){
        Set<Stu> set = new HashSet<>();
        Stu stu = new Stu("xioaming",2);
        set.add(stu);
        //加入相同的元素视为无效
        set.add(stu);
        set.add(new Stu("xiaogang",3));
        Iterator<Stu> iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next().getName());
        }
        Object[] stus = set.toArray();
        for(Object obj:stus){
            System.out.println(((Stu)obj).getName());
            System.out.println(((Stu)obj).getId());
        }
    }

    /**
     * HashTable出现在JDK1.0, 线程安全,因为不能存入null类型数据
     * HashMap出现在JDK1.5,线程不安全,因为能存入null
     */
    static void testMap(){
        System.out.println("测试 HashMap");
        HashMap<String, String> map = new HashMap<>();

        //存储
        System.out.println(map.put("ABC001", "Kevin"));
        System.out.println(map.put("ABC002", "Lily"));
        System.out.println(map.put("ABC001", "Clack"));  //此处Key与第一个重复!!


        System.out.println(map);

        //获取Value
        Collection<String> values=map.values();
        for(String value: values) {
            System.out.println(value);
        }

        //获取Key
        //Set<K> keySet()
        Set<String> keys = map.keySet();
        for(String key: keys) {
            String value = map.get(key);
            System.out.println("ID:"+key+"--Name: "+value);
        }

        //获取所有中间人entrys
        Set<Map.Entry<String, String>> entrys =map.entrySet();
        //遍历所有entrys用Map.Entry<String, String>类型的entry接收
        for(Map.Entry<String, String> entry:entrys) {
            String key = entry.getKey();
            String value = entry.getValue();

            System.out.println("ID:"+key+"--Name: "+value);
        }

        Iterator<Map.Entry<String,String>> entries = map.entrySet().iterator();
        while (entries.hasNext()){
            Map.Entry<String,String> entry = entries.next();
            String key = entry.getKey();
            String value = entry.getValue();

            System.out.println("ID:"+key+"--Name: "+value);
        }

        System.out.println(map.size());
    }


    public static void main(String[] args) {
        testCollection();
        testList();
        testSet();
        testMap();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值