java集合中List,Set以及Map等集合体系详解

分类

(1) List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口

(2) Set下有HashSet,LinkedHashSet,TreeSet

(3) List下有ArrayList,Vector,LinkedList

(4) Map下有Hashtable,LinkedHashMap,HashMap,TreeMap

(5) Collection接口下还有个Queue接口,有PriorityQueue类
在这里插入图片描述

java库中的具体集合

集合类型描述
ArrayList可以动态增长和缩减的一个索引序列
LinkedList可以在任何位置高效插入和删除的一个有序序列,底层是一个双向链表
ArrayDeque实现为循环数组的一个双端队列
HashSet没有重复元素的一个无序集合,HashSet底层是HashMap
TreeSet一个有序集,TreeSet 底层是通过 TreeMap 来实现的,因此二者的实现方式完全一样。而 TreeMap 的实现就是红黑树算法
EnumSet一个包含枚举类型值的集
LinkedHashSet一个包含枚举类型的值
PriorityQueue允许高效删除最小元素的一个集合,PriorityQueue是非线程安全的,所以Java提供了PriorityBlockingQueue(实现BlockingQueue接口)用于Java多线程环境
HashMap存储键/值关联的一个数据结构
TreeMap键有序的一个映射,底层实现是红黑树数据结构
EnumMap键属于枚举类型的一个映射
LinkedHashMap可以记住键/值项添加次序的一个映射
WeakHashMap值不会在别处使用时就可以被垃圾回收的一个映射
IdentitiyHashMap用==而不是用equals比较键的一个映射

ArrayList和LinkList区别

他们都是继承List 接口,都可以用来存储一些线性的数据. 他们的主要区别如下:
1.底层数据结构不一样:ArrayList他底层使用的是一个Object的数组,而LinkedList则是使用的一个双向链表。
2.ArrayList他支持随机访问,而LinkedList则不支持,ArrayList实现了RandomAcess这个接口,而这个接口为空接口,实现空接口的意义何在呢?这个接口的意义就是为了标记这个类是具有一个随机访问的特性,仅仅起到一个标志的作用,而LinkedList则是不支持的,根本原因就是ArrayList底层数据结构采用的是数组,天然支持根据数组下标进行访问数据。
3.插入和删除的效率不同:ArrayList采用的是数组来实现的,所以插入和删除元素受到元素的位置影响。时间复杂度O(N),LinkedList插入删除时间复杂度为O(1).
4.ArrayList会预留一定的空间,数组实际的大小,是会大于存储数据的内存大小,而LinkedList则是每添加一个元素的时候,他才会去申请这个元素所对应的内存空间。
5. ArrayList和LinkList都是线程不安全的,Vector是线程安全的。
6. ArrayList的扩容参考参考

注意:

(1)Queue接口与List、Set同一级别,都是继承了Collection接口。

LinkedList既可以实现Queue接口,也可以实现List接口.只不过呢, LinkedList实现了Queue接口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法了,而不能直接访问 LinkedList的非Queue的方法,以使得只有恰当的方法才可以使用。

(2)SortedSet是个接口,它里面的(只有TreeSet这一个实现可用)中的元素一定是有序的。

Connection接口:

1.List有序,可重复

1.1 ArrayList

优点:底层数据结构是数组,查询快,增删慢
缺点:线程不安全,效率高

这个类是大致相当于Vector,不同之处在于它是不同步的

1.2.Vector

优点:底层数据结构是数组,查询快,增删慢
缺点:线程安全,效率低

1.3LinkedList

优点:底层数据结构是链表,查询慢,增删快
缺点:线程不安全,效率高

代码演示:

public class collection {
    public static void main(String[] args) {
        //ArrayList(类似python列表)
        Scanner  in=new Scanner(System.in);
        int i= in.nextInt();
        ArrayList array=new ArrayList<Integer>();
        array.add(i);
        array.add(2);
        array.add(3);
        array.add(4);
        System.out.println(array);
        //Vector(类似python列表)
       Vector vect= new Vector<Double>();
       vect.add(1.1);
       vect.add(2.1);
       vect.add(3.1);
        System.out.println(vect);
        vect.remove(2.1);
        System.out.println(vect);
        //LinkedList
        LinkedList list=new LinkedList();
        list.add(1);
        list.add(1.1);
        list.add("a");
        System.out.println(list);
        System.out.println(list.indexOf("a"));
    }

2. Set无序,唯一

2.1HashSet

底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()

2.2.LinkedHashSet

底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
注意:
FIFO(First Input First Output):先进先出队列

2.3TreeSet

底层数据结构是红黑树。(唯一,有序)

  1. 如何保证元素排序的呢?
    自然排序
    比较器排序
    2.如何保证元素唯一性的呢?
    根据比较的返回值是否是0来决定
public class set {
    public static void main(String[] args) {
        //2.1 HashSet

        HashSet hs=new HashSet();
        hs.add(1);
        hs.add(2);
        hs.add(3);
        hs.add(3);
        System.out.println(hs);
        //结果:[1, 2, 3]
        System.out.println(hs.contains(3));
        //结果:true
        //2.2 LinkedHashSet
        LinkedHashSet linkedHashSet = new LinkedHashSet();
        linkedHashSet.add("1");
        linkedHashSet.add("2");
        linkedHashSet.add("3");
        linkedHashSet.add("4");
        linkedHashSet.add("2");
        System.out.println(linkedHashSet);

        //2.3 TreeSet
        TreeSet treeSet = new TreeSet();
        treeSet.add(1);
        treeSet.add(2);
        treeSet.add(3);
        treeSet.add(4);
        System.out.println(treeSet.hashCode());
    }
}

Map接口:

Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和Hashtable。

(1)TreeMap是有序的,HashMap和HashTable是无序的。

(2)Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。

(3) Hashtable不允许null值,HashMap允许null值(key和value都允许)。

public class map {
    public static void main(String[] args) {
        //TreeMap(类似python中字典)
        TreeMap treeMap = new TreeMap();
        treeMap.put("1","e");//添加数据
        treeMap.put("1","e");
        System.out.println(treeMap.get("1"));//按照关键字索引
        //HashMap
        HashMap hashMap = new HashMap();
        hashMap.put("1","q");
        hashMap.put("2","qq");
        hashMap.put("3","qqq");
        System.out.println(hashMap);
        System.out.println(hashMap.get("3"));
        //Hashtable
        Hashtable hashtable = new Hashtable();
        hashtable.put("1","q");
        hashtable.put("2","qq");
        hashtable.put("3","qqq");
        System.out.println(hashtable);
        System.out.println(hashtable.get("3"));
    }
}

参考:
Java集合中List,Set以及Map等集合体系详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值