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线程安全

Java基础知识之集合的更多相关文章

  1. Java基础知识:集合框架

    *本文是最近学习到的知识的记录以及分享,算不上原创. *参考文献见链接. 目录 集合框架 Collection接口 Map接口 集合的工具类 这篇文章只大致回顾一下Java的总体框架. 集合框架 ht ...

  2. Java基础知识之集合(容器)简介

    JAVA的集合体系,主要由Collection接口,Map接口,Iterator接口和操作集合的工具类Collections组成.其中的Iterator只是一个迭代器,真正的容器则派生自Collect ...

  3. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介

    1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...

  4. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  5. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  6. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  7. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  8. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  9. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

随机推荐

  1. NodeJS + PhantomJS 抓取页面信息以及截图

    利用PhantomJS做网页截图经济适用,但其API较少,做其他功能就比较吃力了.例如,其自带的Web Server Mongoose最高只能同时支持10个请求,指望他能独立成为一个服务是不怎么实际的 ...

  2. [备份]EntityFramework

    本视频和分步演练介绍通过 Code First 开发建立新数据库.这个方案包括建立不存在的数据库(Code First 创建)或者空数据库(Code First 向它添加新表).借助 Code Fir ...

  3. Math.Round四舍六入五取偶Math.Ceiling只要有小数都加1Math.Floor总是舍去小数

    1.Math.Round:四舍六入五取偶 引用内容 Math.Round(0.0) //0Math.Round(0.1) //0Math.Round(0.2) //0Math.Round(0.3) / ...

  4. Retrieve id of record just inserted into a Java DB (Derby) database

    https://stackoverflow.com/questions/4894754/retrieve-id-of-record-just-inserted-into-a-java-db-derby ...

  5. R语言中的横向数据合并merge及纵向数据合并rbind的使用

    R语言中的横向数据合并merge及纵向数据合并rbind的使用 我们经常会遇到两个数据框拥有相同的时间或观测值,但这些列却不尽相同.处理的办法就是使用merge(x, y ,by.x = ,by.y ...

  6. Linux CentOS 6.9 Minimal 编译 OpenJDK 7

    今天学习<深入理解Java虚拟机:JVM高级特性与最佳实践>一书,并动手在Linux系统上编译OpenJDK 7,初次搞不太顺利,特记录下编译操作细节. 一.前期准备 约定:工具默认安装目 ...

  7. DOTween 使用方法

    参考链接: http://dotween.demigiant.com/documentation.php https://www.cnblogs.com/backlighting/p/5344047. ...

  8. Maven支撑下的War应用依赖另外一个WAR应用的解决方案

    最近在做项目中,用Maven管理项目间的依赖关系,遇到一个问题,快折腾死了,不过初步试出来一种解决方案.在此把问题及解决方案描述一下,以资共享.   问题描述:有两个项目A和B,Dynamic Web ...

  9. [Full-stack] 世上最好语言 - PHP

    前言 本篇是对个人PHP, Laravel系列博文的总结与思考. 目的在于理清并熟练如下过程: "需求 --> Usercase --> UI --> 框架 --> ...

  10. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V3 -- 编码解码

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- pipeline.addLast(io.netty.handler.codec.MessageToMessageCodec ...