集合也称容器:从大的类别分成两类:Collection和Map,也即:单列和双列列表。

java编程思想中一张图说明该体系的整体结构:其中黑色着重的类是经常使用的类。

1 Collection

Collection:作为单列集合的根接口。该类集合的继承体系如下:

Collection分为两大类:List和Set


1)List:

特点:有序的 collection(也称为序列);列表通常允许重复的元素。

      List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。

常用子类实现:Vector/ArrayList/LinkedList

三者之间的区别

  ArrayList:底层结构是数组,查询快,增删慢,实现是不同步的,线程不安全,效率高。

  LinkedList:底层是链表,查询慢,增删快,实现不同步,线程不安全,效率高。

  Vector:底层数据结构是数组,查询快,增删慢,实现同步,线程安全,效率低(即使是线程安全的也不怎么使用,因为Collections集合工具类提供方法可使线程不安全的集合实现线程安全,此类经常由ArrayList集合取代)


2)Set:

特点:无序,列表中不允许重复的元素(无序:是指存储集合和从集合中取出的顺序是不一致的)

常用子类实现:HashSet和TreeSet

HashSet:

  特点

  底层实现不是同步的,线程不安全。
  通过查看源码:HashMap底层就是HashMap(即底层数据结构是哈希表),只是进行了包装。
  而哈希表结构底层依赖于hashCode()和equals()方法保证元素的唯一性。

实现唯一性:

  对于基本包装类型:基本类型对象的包装类已经实现了equals()和hashCode()方法,故可以保证元素的唯一性。

  String类:重写了equals()和hashCode()方法,也可以保证唯一性。

  自定义类:需要重写Object类中equals()方法和hashCode()方法

  其常用子类:
     LinkedHashSet:

  特点:具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现非同步。

     此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表

       此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。

       其数据结构是哈希表和链表结合,既保证唯一性同时又可以有序。(哈希表保证元素唯一性;链表保证有序)
       再次强调这里的有序是存取的顺序一致。。。。

TreeSet:

 特点:

  底层实现是非同步的,线程不安全。

  查看源码,其底层是包装了TreeMap集合,数据结构是红黑树即平衡二叉树。

  而平衡二叉树的特点:能够对元素进行排序,排序方式:自然排序和比较器排序

  此处的排序(存储元素的位置排序)是和上面讲的有序(插入和取出的顺序一致)不是一个概念。

   实现排序:

自然排序:在创建集合时,使用不带比较器的构造函数,一般使用无参构造。

       对于自定义存储元素对象,要想实现自然排序,应该实现Comparable<T>接口,实现其唯一的方法:int compareTo(T o)。

      而对于基本类型装箱对象(比如Integer/Character等),因为其本身已经实现了该接口,所以直接可以使用就能实现自然排序。

       String类:其已经实现了Comparable接口,也实现了其compareTo方法,故可以直接存取,即可实现自然排序。

  比较器排序:如果要使用比较器排序,需要使用带参构造,往构造函数中传入一个比较器Comparator子类对象。一般有两种方式:

    匿名内部类方式:在创建集合对象时,使用内部类实现一个比较器对象,后面会有实例。

    外部类方式:新建一个类,实现Comparator<T>接口,并且实现其中的方法:int compare(T  o1,T  o2),在创建集合之前创建这个类的实例,传入集合带参构造。

Colllection集合的遍历一般有三种方式:

  1)迭代器

  2)增强for(也就是迭代器使用:使用XJad反编译工具可以查看)

  3)普通for


2 Map

特点:

  存放键值对,依赖于键

  一个映射不能包含重复的键;每个键最多只能映射到一个值(键唯一,值可重复)

   其实现子类有的允许null键和null值,有的不允许null键和null值

常用子类

  HashMap  TreeMap   LinkedHashMap    ConcurrentHashMap(比较流行在多线程)    Hashtable(已经不怎么用了)

HashMap: 集数组和链表(即哈希表)的一种集合,底层实现依赖于key的hashcode()以及key的equals()方法
      插入一个键值也即一个Entry,首先计算h=h(key.hashcode())即key的hashcode的散列函数,然后根据h值在数组中找到对应的索引。
         如果该位置已经有元素,则需要和该索引处的链表的每一个元素进行比较。

LinkedHashMap:

      具有HashMap的所有特性,---即根据键索引快速查找元素,但同时还能保留进入映射数据结构的条目的顺序(也就是保证有序)。

Hashtable: 

     出现在JDK1.0,早于集合,后被修改实现Map接口正式加入集合。

       此类实现了哈希表,底层实现是同步的,故线程安全,不过效率低。

     建议在并行环境下若需要Map接口的地方使用ConcurrentHashMap

ConcurrentHashMap:

      位于java.util.concurrent包下,很明显用于多线程。

      虽然该类也是同步的,但是其锁的密度和Hashtable不同,其效率比Hashtable高,当然和HashMap相比效率有所下降,但是在高并发情况下,其保证了安全性。

      其底层同步源码实现也是其一大亮点。

HashMap和Hashtable的区别:
  HashMap用来替代Hashtable。除了下面两点不同,其余差不多
  1)Hashtable是同步的,线程安全,效率低。而HashMap线程不安全,效率高。
  2)HashMap允许null键和null值,而Hashtable不允许null键和null值

遍历方式:

  由键找值:

    1)获取键的集合:Set<T>  keySet()

    2)遍历该键的Set集合,根据键查找对应的值:V  get(Object  K)

  获取键值对集合:

    1)获取键值对Set集合:Set<Map.Entry<K,V>>  entrySet()

    2)遍历该Set集合:其元素类型是 Map.Entry<K,V> ,集合中的每一个元素类型都是Map.Entry<K,V>。

    3)根据这个类中的:K  getKey()  和  V  getValue()方法分别获取键和对应的值。


java之集合概述的更多相关文章

  1. java 之 集合概述

    一.集合概述 不管是哪一种数据结构,其实本质上都是容器来着,就是用来装对象的.因此,我们就要搞清楚两点:(1)如何存储(2)存储特点 1.集合 集合是 Java 中提供的一种容器,可以用来存储多个数据 ...

  2. Java Collection集合概述及其常用方法

    Collection集合概述 Java数组的长度是固定的,为了使程序能够方便地存储和操作数目不固定的一组数据,JDK类库提供了Java集合 与数组不同的是,集合中不能存放基本类型数据,而只能存放对象的 ...

  3. 【Java】集合概述Collection、Map

    Java集合分为Collection和Map,Collection又分为List.Set. List中有ArrayList.LinkedList和Vector:Set中又分为HashSet和TreeS ...

  4. 《java集合概述》

    JAVA集合概述: Collection: |---List有序的:通过索引就可以精确的操作集合中的元素.元素是可以重复的. List提供了增删改查的动作. 增加add(element) add(in ...

  5. Java基础知识强化之集合框架笔记38:Set集合之Set集合概述和特点

    1. Set集合概述和特点 Collection            |--List                     有序(存储顺序和取出顺序一致),可重复            |--Se ...

  6. Java集合概述、Set集合(HashSet类、LinkedHashSet类、TreeSet类、EnumSet类)

    Java集合概述.Set集合(HashSet类.LinkedHashSet类.TreeSet类.EnumSet类) 1.Java集合概述1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指 ...

  7. Java笔记:Java集合概述和Set集合

    本文主要是Java集合的概述和Set集合 1.Java集合概述 1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组 ...

  8. 1.Java集合总结系列:Java集合概述

    一.概述 集合是 Java 中非常重要的 API,在实际应用中非常广泛,在许多面试中也是必考的知识点. Java 所有集合类都位于 java.util 包下,Java 的集合只能保存对象,而无法保存保 ...

  9. 第8章-Java集合 --- 概述

    第8章-Java集合 --- 概述 (1)Java集合类是一种特别有用的工具类,可以用于存储数量不等的多个对象,并可以实现常用的数据结构,如 栈.队列等. (2)Java集合大致可分为Set.List ...

随机推荐

  1. HighCharts常用设置

    1. X轴文字斜着放,在xAxis里设置 xAxis: { labels: { rotation: -90 //竖直放 rotation: -45 //45度倾斜 } } 2. 柱形图柱形的宽度和边框 ...

  2. 18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题

    1. 造成内存泄漏的原因? threadLocal是为了解决对象不能被多线程共享访问的问题,通过threadLocal.set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中,这 ...

  3. 1-15-1 RAID磁盘阵列的原理和搭建

    大纲: 1.1-1-企业级RAID磁盘阵列 RAID磁盘阵列的原理 RAID0,1,5,10的搭建 硬件RAID卡 1.2-1-使用廉价的磁盘搭建RAID磁盘阵列 实战-配置RAID0带区卷 ==== ...

  4. torch7框架 深度学习(1)

    前面已经安装好了torch,下面就来看看如何在torch框架上搭建深度学习模型,我一直觉得源码结合原理是机器学习最好的学习途径.所以我们从分析一个简单的案例开始吧. 参考Supervised Lear ...

  5. psd-面试-dp/LCS

    链接:https://www.nowcoder.com/acm/contest/90/D来源:牛客网 掌握未来命运的女神 psd 师兄在拿了朝田诗乃的 buff 后决定去实习. 埃森哲公司注册成立于爱 ...

  6. UVA-11090 Going in Cycle!! (平均值最大回路)

    题目大意:一个n个点,m条无向边的图,求出平均权值最小的回路. 题目分析:二分枚举平均值mid,只需判断是否存在平均值小于mid的回路,即判断是否有sum(wi)<mid*k (1≤i≤k),只 ...

  7. vue 全选多选

    html: //全选按钮 <li class="choice_fme"> <div @click="checkAll" v-bind:clas ...

  8. MYSQL freedata 外联接

    主要是解决,不同生产系统里面,有不同的数据库. SQL 又不能夸系统查询表. 只能在一个系统里,可以跨不同的数据库查表. 所以会用映射 .FREEDATA 这种方式,这样A 系统 里的表更新之后,就可 ...

  9. Tree各种遍历实现

    数据结构.算法及应用 张宪超主编 科学出版社 1. 数据结构的基本概念知识 数据结构的逻辑结构由数据节点和连接两个节点的边组成. 数据节点的数据类型:整型,实数型,布尔型,字符型,指针数据类型 结构的 ...

  10. ubuntu安装amd/ati显卡驱动

    原网页: http://forum.ubuntu.org.cn/viewtopic.php?f=126&t=390372 整合了几个帖子,大概如此:用以下命令卸载所有驱动: 代码: sudo ...