Java基础知识总结之类的集合

Java集合概述

  一、集合类也叫做容器类。它的功能至关于一个容器。能够存储数量不肯定的数据,以及保存具备映射关系的数据(也被称为关联数组)。算法

  二、Java的集合(容器),它是用来”装对象的“(其实是对象的引用,但习惯上都称为对象)。数组

  三、Java集合大体能够分为Set、List、Queue和Map四种体系。Set表明无序、不可重复的集合;List表明有序、容许重复的集合;而Map表明具备映射关系的集合,Java5又增长了Queue体系集合,表明一种队列集合实现。安全

   四、Java集合类主要由两个接口派生出来:Collection和Map,Collection和Map是Java集合框架的根接口,以下图所示是Collection接口、子接口及其实现类的继承树。数据结构

 

 

注:斜体字表明接口,正体的为实现类。多线程

  用蓝框标注的类是Collection集合框架最经常使用的实现类,分别是:HashSet、TreeSet、ArrayList、LinkedList、ArrayDeque。框架

 

Set集合

Set集合几乎等同于Collection集合。它们的行为几乎一致。工具

 遍历Set的两种方式:性能

  1.用迭代器spa

  2.用foreach循环线程

 

1.HashSet

HashSet的存储机制

  一、当有元素加进来的时,HashSet会调用该对象的hashCode()方法,获得一个int值。

  二、根据hashCode的()返回的int值,计算出它在HashSet中的存储位置(底层实际采用数组存储元素的索引,计算获得在数组中的索引值)

  三、若是加入的位置为空,则直接加入,若是该位置已经有元素,则此处会造成链表。

取元素时与此相似。

  一、当要去一个元素时,HashSet会调用该对象的hashCode()方法,获得一个int值。

  二、根据hashCode的()返回的int值,计算出它在HashSet的【底层数组】中的存储位置(数组中的索引)。

  三、若是该位置刚好是要找的元素,直接取出便可,如若是该位置由链表,则要经过”挨个“搜索链表中的元素。

HashSet存储机制示意图

 

 

HashSet的构造方法:HashSet(int initialCapacity, float loadFactor)

  initialCapacity:控制底层数组的长度,默认为16

  loadFactor:负载因子,HashSet判断是否【底层数组快满】时的依据。当判断认为数组快满时,系统会自动建立一个长度为原来2倍的数组,而且将原来数组的元素复制到新数组,原来的数组成为了垃圾。专业术语叫作”rehash(重hash)“。

  loadFactor的默认大小为0.75。

  loadFactor越小,越消耗内存,loadFactor越大,性能越低。

 

hashSet怎样判断两个对象是否相等: 

  一、两个对象的hashCode()返回值相同

  二、两个对象的equals()方法比较返回值为true

  这就要求咱们自定义类的hashCode()和equals()方法是一致的,要求重写equals()所用的关键属性与计算hashCode()的关键属性一致。  

 

2. HashSet的子类:LinkedHashSet

  它与HashSet的存储机制相同。

  但LinkedHashSet额外维护一个链表,用来记录元素的添加顺序。

 

3.TreeSet

  特征:保证Set里的元素是”有大小排序“的。

  TreeSet————它是标准的红黑树

    树—>二叉树—>排序二叉树—>平衡二叉树—>红黑树。

  TreeSet的存储机制:

    底层由一棵”红黑树“存放全部的数据。存取性能与检索性能也比较好。

    在HashSet没有出现大量的链表的状况下,HashSet的性能要比TreeSet性能好。

  TreeSet要求对象必须是能够排序的:

    一、天然排序。要求全部的集合元素实现Comparable接口。

           集合元素实现了Comparable接口后,集合元素自身就能够排序。

    二、定制排序。要求建立TreeSet对象的时候传入一个Comparator对象。

           Comparator对象负责对集合元素进行排序,集合元素无需实现Comparable接口。

  TreeSet怎样才算两个对象时相等?

    一、只有两个对象经过compareTo()方法比较的返回值为0,TreeSet才认为两个对象相等。

 

 

List集合

  List集合封装了线性表的数据结构。

   它提供大量的”根据索引“来存、取元素的方法。

  因为List根据索引来存、取元素,所以它多了一个遍历元素的方法。

 

1.ArrayList

 ArrayList与Vector的存储机制

  它们的底层是基于数组的,它们对元素的存储彻底是基于数组的。 —— 所以性能很是快。

  

 ArrayList与Vector的区别

  一、Vector是JDK1.0就有的集合,从JDK1.2之后SUN公司从新设计了ArrayList来代替Vector。

  二、Vector是线程安全的,ArrayList是线程不安全的。但ArrayList的性能要比Vector的好。

  即便在多线程的环境下,可使用Collections的方法把ArrayList变成线程安全的。

如下仅供了解  

  三、当底层数组的存储空间不足时,Vector默认扩转1倍,ArrayList默认扩展%50+1。

 

2.LinkedList

  既是线性表,又是队列,仍是栈。(栈和队列是受限的线性表)。

  LinkedList的底层是基于链表实现的。一般认为它的性能比不上ArrayList。

    ArrayList:因为根据底层数组的索引存取元素的,因此性能很是快。

          当插入、删除元素时,后面全部的元素都要跟上”总体搬家“。

    LinkedList:因为底层采用链表来存储元素,要根据遍从来存取元素,因此性能较低。

          当插入、删除元素时,后面全部的元素无需”总体搬家“,所以性能很是好。

 

Queue集合

Deque类

  双向队列:功能限制的线性表

  即便队列,又是栈。

  看成栈是使用的方法是push()和pop(),peek()只访问栈顶元素,并不弹出来。

  看成队列时使用的方法是offer()和poll()。

 

  ArrayDeque —— 基于数组实现

  LinkedList    —— 基于链表实现

 

操做集合工具类:Collections

  synchronizedXxx  —— 把原有的集合包装成线程安全的集合。

  shuffle(List<?> list) —— 把List集合元素进行随机排列

 

常见的工具类:

  Arrays       —— 操做数组。

  Objects     —— 操做对象。

  Collections ——操做集合。

 

 

Map集合

以下图为Map体系的继承树,全部的Map实现类用于保存具备映射关系的数据。Map保存的数据都是key-value对。

注:用蓝框标注的类是Map集合框架最经常使用的实现类,分别是:HashMap、TreeMap、Properties。

 

                                                 

 

对比以上两图,发现两者的结构很是相识,Map与Set一一对应。实质上Set底层的实现就是经过Map子类的方法,能够经过查看Set相关的API文档验证。当Map的value值为null,只考虑key的时候,Map就变为了Set。

  HashSet底层是由HashMap实现,HashMap经过“hash”算法控制数据在集合中的存储,相似于“一个萝卜一个坑”。

  TreeSet底层是由TreeMap实现,TreeMap就是真正的红黑树。

注:对于Map而言,value只是它的附属物,几乎没有什么要求,所以Map主要是对key由要求。

 

1.HashMap

  HashMap会经过key的hashCode()方法的返回值来计算其存、取位置。

  HashMap怎样才算两个key重复呢?

    一、经过equals()方法比较的返回值为true

    二、两个key的hashCode()返回值相同

 

判断两个对象相等能够用hashcode比较吗?

回答是不能够。你必须用equals方法!两个不一样对象可能hashcode相等,但两个不一样hashcode的对象必定不一样。另一点,若是覆写 了equals方法,必须覆写hashcode方法,缘由是默认的hashcode是将对象的存储地址进行映射。并且逻辑上,若是两个对象的equals 方法返回是相等的,那么它们的hashcode必须相等;反之不必定成立。


 

2.TreeMap

  底层的红黑树只对key进行排序

  TreeMap要求key必须是能够排序的:

    一、天然排序。要求全部的key实现Comparable接口。

    二、定制排序。要求建立TreeMap对象的时候传入一个Comparator接口的对象。

  TreeMap怎样才算两个key相等?

    一、经过compareTo()方法比较的返回值为0,这就代表两个元素相等。

 

HashMap与HashTable的区别

  一、HashTable是从JDK1.0就有的,尽可能少用。

  二、HashTable不容许null做为key、value。但HashMap容许。

  三、HashTable是线程安全的(实现的很差)

    HashMap是线程不安全的。由于它不须要进行同步检验,因此性能好。

    Map Collections.synchronizedMap(Map m)

    这个方法返回一个同步的Map,这个Map封装了底层的HashMap的全部方法,使得底层的HashMap即便是在多线程的环境中也是安全的。

如下几条仅供了解:

  四、HashTable中hash数组默认大小是11,增长的方式是 old*2+1。HashMap中hash数组的默认大小是16,并且必定是2的指数。

  五、哈希值的使用不一样,HashTable直接使用对象的hashCode, 而HashMap从新计算hash值。

  六、.HashTable使用Enumeration,HashMap使用Iterator。

  七、HashTable有一个contains(Object value),功能和containsValue(Object value)功能同样。

  八、.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;

相关文章
相关标签/搜索