JAVA集合框架

Java集合框架主要分为collection 和map两个类型的容器。

collection主要由List,Set,Queue三个接口直接继承。

一、List是有序的元素可重复的:List下面有个抽象的类 AbstractList,AbstractList抽象类实现了List这个接口。Vector,ArrayList和  LinkedList这三个类是List接口的最终实现类。

二、Set是无序元素不可重复的:Set下面有个抽象的类AbstractSet,AbstractSet抽象类实现了Set这个接口。                HashSet,LinkedHashSet,TreeSet这三个类是Set接口的最终实现类。

三、Queue。

四、Map容器

Map容器下面有个抽象类AbstractMap实现了Map这个接口。也有个SortedMap接口继承了Map这个接口。

Map接口的最终实现类有HashMap,LinkedHashMap,WeakHashMap,

Hashtable,TreeMap,IdentityHashMap。

 

Vector,ArrayList和LinkedList这三个的区别:

参考链接:

https://www.cnblogs.com/huzi007/p/5550440.html

https://www.cnblogs.com/zkk-wust/p/7250776.html

  1. Vector和ArrayList都是以基于动态数组的数据结构存储在内存中,LinkedList则是基于链表的数据结构存在内存中。
  2. Vector是线程安全的,ArrayList和LinkedList不是线程安全的。
  3. ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。
  4. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
  5. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 
public class ListTest {
    static final int N=50000;
    static long timeList(List list){
        long start=System.currentTimeMillis();
        Object o = new Object();
        for(int i=0;i<N;i++) {
            list.add(0, o);
        }
        return System.currentTimeMillis()-start;
    }
    static long readList(List list){
        long start=System.currentTimeMillis();
        int j=list.size();
        for(int i=0;i<j;i++){

        }
        return System.currentTimeMillis()-start;
    }
    static List addList(List list){
        Object o = new Object();
        for(int i=0;i<N;i++) {
            list.add(0, o);
        }
        return list;
    }
    public static void main(String[] args) {
        System.out.println("ArrayList添加"+N+"条耗时:"+timeList(new ArrayList()));
        System.out.println("LinkedList添加"+N+"条耗时:"+timeList(new LinkedList()));

        List list1=addList(new ArrayList<>());
        List list2=addList(new LinkedList<>());
        System.out.println("ArrayList查找"+N+"条耗时:"+readList(list1));
        System.out.println("LinkedList查找"+N+"条耗时:"+readList(list2));
    }
}

HashSet,LinkedHashSet和TreeSet这三个的区别:

参考链接:

https://www.cnblogs.com/wl0000-03/p/6019627.html

  1. HashSet是不可重复的,且不能保证元素的排列顺序,HashSet集合元素可以是null,但只能放入一个null,HashSet也是线程不安全的。当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。
  2. TreeSet类型是J2SE中唯一可实现自动排序的类型。TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
  3. LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
  4. LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

 

HashMap,LinkedHashMap,WeakHashMap,Hashtable,TreeMap,IdentityHashMap的区别:

参考链接:

https://blog.youkuaiyun.com/weishiwei0923/article/details/47295757

HashMap与HashTable的区别:

(1)同步性:Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的。而HashMap则是异步的,因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率。

(2)值:HashMap可以让你将空值作为一个表的条目的key或value,但是Hashtable是不能放入空值的。HashMap最多只有一个key值为null,但可以有无数多个value值为null。

LinkedHashMap: 

它的父类是HashMap,使用双向链表来维护键值对的次序,迭代顺序与键值对的插入顺序保持一致。LinkedHashMap需要维护元素的插入顺序,so性能略低于HashMap,但在迭代访问元素时有很好的性能,因为它是以链表来维护内部顺序。

TreeMap:

 Map接口派生了一个SortMap子接口,SortMap的实现类为TreeMap。TreeMap也是基于红黑树对所有的key进行排序,有两种排序方式:自然排序和定制排序。Treemap的key以TreeSet的形式存储,对key的要求与TreeSet对元素的要求基本一致。

WeakHashMap:

 WeakHashMap与HashMap的用法基本相同,区别在于:后者的key保留对象的强引用,即只要HashMap对象不被销毁,其对象所有key所引用的对象不会被垃圾回收,HashMap也不会自动删除这些key所对应的键值对对象。但WeakHashMap的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被回收。WeakHashMap中的每个key对象保存了实际对象的弱引用,当回收了该key所对应的实际对象后,WeakHashMap会自动删除该key所对应的键值对。

IdentityHashMap:

IdentityHashMap与HashMap基本相似,只是当两个key严格相等时,即key1==key2时,它才认为两个key是相等的 。IdentityHashMap也允许使用null,但不保证键值对之间的顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值