[JavaSE基础] 集合

Java集合接口

  1.Collection接口的子类接口:一种为Set 一种为 List,一种为Queue ;

  2.Map接口

    首先介绍定义在接口里的常用方法和一些特点:

        Collection的常用方法:

                   add()

                   remove()

                   contain()

                   isEmpty()

                   size()

                   clear()

                   toArray()

                   contains()

                   Set类里有个方法:retainAll() 用来把调用方法的对象替换成和参数对象的交集

        Map类常用方法:

                  put()

                  remove()

                  containsKey()

                  containsValue()

                  get()

        Set类的常用遍历方法:

                  iterator() 使用迭代器进行遍历

                  foreach加强for遍历

        Map类的常用遍历方法:

                  keySet() 转换成一个Set集合,里面是key值

                  entrySet()  把key-value转化成 Entry集合   

        

        1.Set : 唯一,元素不可重复,TreeSet有序,HashSet无序

        2.List : 不唯一,元素可重复,全部有序

        3.Queue:不唯一,元素可重复,有序

        4.Map: 唯一,元素不可重复,TreeMap有序,HashMap无序

  List接口:  

       

List<Object> list = new ArrayList<Object>();
List<Object> list2 = new Vector<Object>();
List<Object> list3 = new LinkedList<Object>();

List:  有 ArrayList vector LinkedList

      前两个差不多,底层数据结构都是数组,唯一不同的是 vector的每个方法都有关键字synChronized声明,导致这个实现类是个线程安全的类,因此使用效率比ArrayList慢,而如果对ArrayList调用

      Collection.synChronizied()后,运行增删改查都与vector差不多,还有一个区别是每次扩容时vector都是默认扩容两倍,而ArrayList都是扩容1.5倍

      查看了源码之后发现vector的扩容是一个三元运算的 newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity) 如果声明的增长量大于0则新的长度为oldCapacity+capacityIncrement 否则就是

      oldCapacity*2 (若无声明,默认扩容值为oldCapacity)因为乘法的计算效率低于加法,所以在jdk1.8以后都是加法

      而LinkedList的底层数据结构则是链表,增删快,只用把前后节点连一起就好,但查询慢

  Set接口:

  

Set<Object> = new HashSet<Object>();

Set:  有 HashSet TreeSet LinkedHashSet

      HashSet是一个包装了HashMap的Set实现类,是一个元素不可重复的集合,比较元素值的方法和HashMap一样都需要里面的数据类型重写hashCode方法和equals方法

      TreeSet是一个包装了TreeMap的Set实现类,他和TreeMap一样,都需要里面的元素实现Comparable接口 重写CompareTo方法,以此来实现里面元素不重复以及数据排列起来的顺序性

  Map接口:

  

Map<K,V> map = new HashMap<K,V>();

Map:  有 HashMap TreeMap Hashtable ConcurrentHashMap       (其中Hashtable已经被弃用,虽然安全但是效率低下,相比而言可以使用ConcurrentHashMap来应对高并发的情况

    主要谈谈前面两种

      HashMap: 在jdk1.8之后都是使用数组+链表+红黑树的底层数据结构实现

      使用HashMap需要对equals和hashCode这两个方法来应对数据的插入和hash碰撞

      插入时先用hashCode判断应该放在数组的哪里,然后看到了之后判断这个空位是否已经存储了数据,如果是闲置的则会直接存入,若里面已经有了数值则会用equals判断是否相同,若不相同则会查询该位置的是否有链表,如果有链表则遍历,

      如果链表里未储存超过8个数据且无此数据则会在链表后方插入,如果数据大于64则会将数据结构由链表改为红黑树

      HashMap是懒加载的,初始化他的长度就是0,不到插入数据不会进行扩容判断,一般来讲会有个阈值 = HashMap的当前容量*加载因子0.75 如果数据插入后会超过这个阈值则会启动resize()方法进行扩容,在源码里,每当需要扩容是都会进行一

      次原容量*2的位运算,然后把table里原数据的索引进行判断,判断方法是用Hash值和扩增之后的二进制进行与运算,如果高位是1则会放在原索引+新增扩容空间的位置,否则就放在原位,这样table里的数据储存则会变得稀疏,也减少了重新rehash的计算量

    TreeMap:底层数据结构是个红黑树,Key值要进行CompareTo方法的比较,然后进行排序,这个集合类的效率比HashMap慢很多,如果不是需要排序等特殊要求我觉得还是不要用了

Queue 有阻塞队列,非阻塞队列   底层是数组链表乱七八糟的东西,还是个线程安全的,我现在没时间看等着我去好好看看,听说在高并发里这玩意儿蛮好用

       

原文地址:https://www.cnblogs.com/Lzzycola/p/13466096.html