• Java基础知识之集合


    Collection集合

      特点:长度可变,只能存储引用类型,可以存储不同的类型的元素

    list分类

      特点:元素有序(存储和取出的顺序一致),元素可以重复。list除了可以用迭代器循环遍历之外,因为其是有序存入的所以可以用for来通过下表获取相应的值。list可以动态增长,查询元素的效率高,但是插入和删除时会引起其他元素的位置变化

    • ArrayList

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

    • LinkedList

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

    • Vector

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

      ArrayList和LinkedList的比较

        Arraylist

          优点:实现了基于动态数组的数据结构,因为元素的地址是连续的,所以一旦数据存储好了,查询的数据就会比较高(在内存中是连着放的)。

          缺点:因为地址是连续的,所以在插入或者删除数据时,要移动数据,所以效率会比较低

        LinkedList

          优点:实现了基于链表的数据结构,地址是任意的,所以开辟一个内存空间的时候不需要开辟一个连续的地址,这对增加和删除操作是比较快的。适用于插入指定位置的场景

          缺点:因为linkedList要移动指针,所以查询效率比较低

     ArrayList和Vector的比较 

          ArrayList构造函数:

    public ArrayList(int initialCapacity)//构造一个具有指定初始容量的空列表。    
    public ArrayList()//构造一个初始容量为10的空列表。    
    public ArrayList(Collection<? extends E> c)//构造一个包含指定 collection 的元素的列表  

          vector构造函数:      

    public Vector()//使用指定的初始容量和等于零的容量增量构造一个空向量。    
    public Vector(int initialCapacity)//构造一个空向量,使其内部数据数组的大小,其标准容量增量为零。    
    public Vector(Collection<? extends E> c)//构造一个包含指定 collection 中的元素的向量    
    public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量构造一个空的向量

         ArrayList和vector的区别:

          1.从源码中可以看出vector的很多方法都加了synchronized修饰符,这就使得vector是线程安全的,但是arrayList是线程不安全的,但是也正是vector使用了synchronized使得他在效率上无法和ArrayList相比

          2.vector和ArrayList都采用了线性连续空间存储元素,但是当空间不足时,两者增加的方式不同

          3.vector可以设置增长因子,但是arrayList不能

          4.vector是老的动态数组,是线程同步的,所以效率很低

    set分类

      特点:元素无序,元素唯一;虽然元素的无放入顺序,但是元素的位置是有该元素的hashcode值来决定的,其位置其实也是固定的。另外加入set的元素必须定义equals()方法,否则就无法保证其唯一性了。set只能用迭代器来遍历,因为其无序所以无法用获取下标的方式获取想要的值。查询效率低,但是插入和删除效率高,切不会引起其他元素位置的变化。

    • HashSet 

    数据结构:底层数据结构是哈希表。哈希表底层依赖两个方法:hashCode()和equals()。允许出现null值,但是只能出现一个null值。元素不能重复,但是同一对象可以放入不同的实例。
    存储数据时的判断顺序:
      1.首先判断对象的hashCode()是否相同
      2.是:继续走equals(),看其返回值是
        true:说明元素重复了,不添加
        false:就直接添加到集合
        否:就直接添加到集合 

    用的时候看到Hash结构的集合,我们就可能需要重写hashCode()和equals()。并且,我们也不用自己写,可以自动生成。

    • LinkedHashSet

      

    • TreeSet

         数据结构:是二叉树实现的,所以treeSet的数据是自动排序好的,不允许null(因为二叉树不允许空节点)。数据不能重复。

      HashSet值通过hash算法实现的,其性能要优于treeSet,是为快速查找而设计的set,所以一般我们都是使用hashSet。但是如果我们需要排序就要使用treeSet了

      treeSet详解

      treeSet源码分析

      TreeSet详解和使用示例

    Map(map不是collection的子接口或者实现类,map本身是一个接口)

       HashMap

      HashMap其实就是一个Entry数组,Entry对象中包含了键和值,其中next也是一个Entry对象,它就是用来处理hash冲突的,形成一个链表。

      从源码中可以看出没有使用Synchronize修饰,所以线程不安全。效率较高。其实HashMap是HashTable的轻量级实现。只能有一个null键可以有多个null值。无序的(没有按存储和获取顺序),但是元素的位置也是有hash值来决定的

       HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,计算出来的hash值就一样。如果存储的对象对多了,就有可能不同的对象所算出来的hash值是相同的,这就出现了所谓的hash冲突。学过数据结构的同学都知道,解决hash冲突的方法有很多,HashMap底层是通过链表来解决hash冲突的

      如何保证HashMap的线程安全:1.Collections.synchronizedMap(new hashMap()),这种方式是将整个hashMap加锁,访问效率相对较低;2.重写了hashMap,把hashMap分成如干个独立的快,并对每个块加锁,这样可以减少并发时的锁冲突。

    jdk1.8中hashMap源码解析

    JDK1.7中hashMap的源码解析

      hashTable

        源码中使用了Synchronize修饰,所以线程安全,是线程同步的,也就是每次只允许一个线程对其进行修改。效率较低,不允许null键和null值

        jdk1.8中hashTable的详解

      TreeMap

        不支持线程同步,也就是线程不安全。数据存储时默认是按键的升序储存的,也可以创建映射时提供的排序比较器Comparator,当用Iterator 遍历TreeMap时,得到的记录是排过序的。键和值都不可以为null

      LinkedHashMap

        看到这个名字就会发现LinkedHashMap除了具有hashMap的特点外,还有保留了插入时的顺序,也就是先插入的先被获取到

      ConcurrentHashMap

      1.通过锁分段技术实现线程安全,但是它实现的是每个片段的安全,也就是一个线程在访问一个片段时,不影响其他线程线程访问其他片段,这样访问的效率就比较高,但是不能保证整体的线程安全。

      2.应用场景是高并发,但是不能保证线程安全

      3.ConcurrentHashMap在调用get方法时不加锁,但是value是volidate变量;调用put时会加锁,保证每个块的线程安全;Remove时也会加锁,由于next是final类型不可改变,所以必须把删除的节点之前的节点都复制一遍

       jdk1.8中ConcurrentHashMap的实现原理

      Jdk1.8中ConcurrentHashMap的实现原理

      jdk1.8中Concurrent'Hash'Map的原理解析

      jdk1.7和Jdk1.8中concurrentHashMap的区别

      

    HashMap和TreeMap区别

    友情链接: Java中HashMap和TreeMap的区别深入理解

    HashMap冲突

    友情链接: 2种办法让HashMap线程安全

  • 相关阅读:
    Go Revel
    Go Revel
    Go Revel
    Go Revel
    deployment:声明式的升级应用
    Kubernetes架构及相关服务详解
    Docker 安装MySQL
    日志收集-Elk6
    Jenkins-Multijob plugin多任务串并行
    ansible创建vmware虚拟机
  • 原文地址:https://www.cnblogs.com/htyj/p/8331503.html
Copyright © 2020-2023  润新知