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. CentOS7安装RabbitMQ

    1.先安装Erlang rpm -Uvh http://www.rabbitmq.com/releases/erlang/erlang-18.1-1.el7.centos.x86_64.rpm 2.安 ...

  2. 【iCore4 双核心板_ARM】例程三:EXTI中断输入实验——读取ARM按键状态

    实验原理: 按键的一端与STM32的GPIO(PB9)相连,且PB9外接一个1k大小的限流上接电阻. 初始化时把PB9设置成输入模式,当按键弹起时,PB9由于上拉电阻的作用呈高电平(3.3V): 当按 ...

  3. jdk和tomcat基本配置

    问题:前端采用grunt构建,后台采用java编写使用Eclipse或IntelliJ,把Tomcat嵌入到开发工具当中.问题一:在于是grunt编译之后生成的文件,每次都需要刷新项目文件夹,然后在刷 ...

  4. 基金 、 社保和QFII等机构的重仓股排名评测

    来源:基金前20大重仓股持仓股排名 基金前15大重仓股持仓股排名 基金重仓前15大个股,相较于同期沪深300的平均收益, 近1月:2.23%, 近3月:3.09%, 近6月:9.61%, 近1年:13 ...

  5. [IR] Advanced XML Compression - XBW

    思考:与ISX对比后能得出什么结论 原理解析: We proposed the XBW-transform that mimics on trees the nice structural prope ...

  6. DLL断点调试

    一般来说调试DLL是把DLL工程和exe工程放到一个解决方案里.如果不放到一个解决方案里,那两者的输出目录要一致,属性-连接器-常规-输出目录.保证dll,dll的pdb,exe,exe的pdb在一个 ...

  7. TSPL学习笔记(1)

    扩展语法(Syntactic extensions) 扩展语法就是通过核心语法或已经定义的扩展语法创建一种新的语法模式. Scheme核心语法模式包括: 顶层定义 常量 变量 过程应用 '(quote ...

  8. kubernetes-PetSet

    什么是Pet?Pet是一个有状态应用程序,本质上它是一个具有确定性名称以及唯一身份的Pod,身份内容包括: DNS中可以识别的固定hostname 顺序化索引(Pet名称组成:PetSetName-O ...

  9. 字符集和编码——Unicode(UTF&UCS)深度历险

    计算机网络诞生后,大家慢慢地发现一个问题:一个字节放不下一个字符了!因为需要交流,本地化的文字需要能够被支持. 最初的字符集使用7bit来存储字符,因为那时只需要存下一些英文字母和符号.后来虽然扩展到 ...

  10. hashlib模块configparser模块logging模块

    hashlib模块 算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长 ...