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

           

  • 相关阅读:
    MySQL group_concat() 函数用法
    Git error The file will have its original line endings in your working directory
    SQL exists 基本用法
    (11) 严格模式(use strict)
    (10)变量提升
    (9)调试
    (8)正则表达式
    (7)类型转换
    (6)typeof, null, 和 undefined
    (5)运算符
  • 原文地址:https://www.cnblogs.com/Lzzycola/p/13466096.html
Copyright © 2020-2023  润新知