Java集合继承体系详解

Java的集合类是一种特别有用的工具,它可以用于存储数量不等的多个对象,并可以实现常用的数据结构,如栈、队列等。Java集合还可以用于板寸具有映射关系的关联数组。

java集合就像是一个容器,我们可以把多个对象(实际上是对象的引用,习惯上叫对象,)保存到集合容器中。在JDK1.5以前java集合会丢失容器中所有对象的数据类型,JDK1.5以后增加了泛型,java集合可以记住容器中对象的数据类型。

Java集合大致可以分为三个体系:Set List Map.所有的集合类都位于java.util包下面。

Collection接口

Collection接口是List、 Set、和Queue接口的父接口。
Collection所代表的是一种规则,它所包含的元素都必须遵循一条或者多条规则。如有些允许重复而有些则不能重复、有些必须要按照顺序插入而有些则是散列,有些支持排序有些不支持排序。

一、List接口

List接口是Collection接口的直接接口。List代表的是有序的Collection,集合中的每个元素都有其对应的索引。List中允许有重复的元素,可以通过索引来访问指定位置的集合元素。因为List集合默认按元素的添加顺序设置元素的索引。

(1)ArrayList、Vector、Stack

ArrayList和Vector作为List的两个典型实现类,完全支持List的全部功能。

ArrayList和Vector类的底层都是基于数组来储存集合元素,封装了一个动态的Object[]数组,是一种顺序存储的线性表。

ArrayList和Vector在用法上几乎完全相同,只是Vector在JDK1.0时就存在,它的方法名比较冗长、比ArrayList包含的方法多,源码比ArrayList包含的源码也多,ArrayList的序列化实现比Vector现在Vector基本上被ArrayList所取代了。

主要区别:ArrayList是线程不安全的,Vector是线程安全的。

如果需要在多线程环境下使用List集合,而且需要保证线程安全,依然可以避免使用Vector,而是考虑将ArrayList包装成线程安全的集合类。Java提供的Collections工具类,通过该工具类synchronizeList方法即可以把ArrayList包装成线程安全的ArrayList.

Stack

Vector提供了一个子类,它用于模拟“栈”这种数据结构,栈通常是先进后出的容器。Stack提供了额外的5个方法,使得Vector可以当做栈来使用。出栈pop,入栈push,访问栈顶元素peek(),判断栈是否为空empty(),检测一个元素在堆栈中的位置serch().

(2)LinkedList

LinkedList是一个链式存储的线性变,本质上是一个双向链表,它不仅实现了List接口还实现了Dueue接口(双端队列,既具有队列的特征,也具有栈的特征),所以LinkedList不仅可以做双向链表来使用,还可以当栈和队列来使用。

LinkedList对元素的插入、删除元素时速度非常快。

LinkdedList也是非同步的。若要实现同步访问,可以采取
List list = Collections.synchronizeList(new LinkedList(.....));

(3)异同点对比

(1)ArrayList和LinkedList

1)ArrayList是基于动态数组实现的,LinkedList是基于双向链表实现的。
2)ArrayList比较适用于随机存取,(可直接通过索引,LinkedList需要通过指针遍历);LinkedList比较适用于增加删除操作(对于单条的插入和删除操作ArrayList比LinkedList速度快,对于插入好人删除操作,ArrayList需要移动后面的所有元素。)

二、Set接口

Set是一种不允许包含相同元素的Collection。它维持自己的内部排序,随机访问没有任何意义。

(1)HashSet

HashSet是Set接口的典型实现,HashSet按Hash算法来储存集合中的元素,具有很好的存取和查找功能。
具有以下特点:

1)不保证元素的排列顺序,有可能变化;
2)HashSet不是同步的;
3)集合元素可以为空。

(2)TreeSet

TreeSet是SortedSet接口的唯一实现,TreeSet可以确保元素处于排序状态,TreeSet并不是根据元素的插入顺序进行排序的,而是根据实际值进行排序。支持两种排序方式:自然排序和定制排序。

(3)EnumSet

是为枚举类设计的集合类,EnumSet不允许加入null元素。如果试图插入null,会抛出空指针异常。
Set的三个实现类都是现成不安全的。

三、Map接口

Map保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用来保存Map里的key,一组用来保存Map里的value,key和value可以是任何引用类型的数据。

Map里的key不允许重复,value可以重复。key和value之间存在单向的一对一的关系,通过指定的key,总能找到唯一的、确定的value。

(1)HashMap与HashTable

HashMap与HashTable都是Map的典型实现类,他们之间的关系类似于ArrayList和Vector:HashTable是一个古老的Map实现类,在JDK1.0时就出现了。

主要区别:

1)HashTable是一个线程安全的Map实现,但是HashMap是线程不安全的实现,HashMap的性能要比HashTable高一些,尽量避免使用HashTable,多个线程访问一个Map对象又要保证线程安全时,可以使用Collections中的方法把HashMap变成线程安全的。
2)HashTable不允许使用null作为key和value,如果试图把null加入HashTable中,将会引发空指针异常。

(2)TreeMap

TreeMap是Map的子接口SortedMap的的实现类,与TreeSet类似的是TreeMap也是基于红黑树对TreeMap中所有的key进行排序,从而保证key-value处于有序状态,TreeMap也有两种排序方式:

1)自然排序:TreeMap的所有key必须实现Comparable接口,而且所有key应该是同一类的对象,否则会抛出ClassCastException.

2)定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中所有的key进行排序。
由于TreeMap支持内部排序,所以通常要比HashMap和HashTable慢。

四、Queue接口

Queue模拟了队列这种数据结构,队列通常是“先进先出”的数据结构,通常不允许随机访问队列中的元素。
Queue常用的实现类:LinkedList和PriorityQueue

(1)LinkedList

LinkedList它不仅实现了List接口还实现了Dueue接口(双端队列,既具有队列的特征,也具有栈的特征),Dueue接口是Queue的子接口。

(2)PriorityQueue

PriorityQueue保存队列元素的的顺序并不是按照加入队列的顺序,而是按照队列元素大小进行重新排序。所以当调用peek和poll方法来取队列中的元素的时候,并不是先取出来队列中最小的元素。从这个意义上来看,PriorityQueue已经违反了队列的基本规则。PriorityQueue不允许插入null元素。

总结:

线程安全的有Vector Stack HashTable

不允许插入空元素的有HashTable PriorityQueue EnumSet

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java集合类的组织结构和继承、实现关系详解

    Collection继承.实现关系如下(说明(I)表示接口, (C)表示Java类,<--表示继承,<<--表示实现): (I)Iterable |<-- (I)Collection |<-- (I)List |<<-- (C)ArrayList |<<-- (C)LinkedList |<<-- (C)Vector |<-- (I)Set |<<-- (C)HashSet |<-- (I)Queue [kju] M

  • java集合继承关系图分享

    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象. 集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象. 上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,A

  • Java Collections集合继承结构图_动力节点Java学院整理

    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象. 集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象. 集合框架图 Collection (集合的最大接口)继承关系 --List 可以存放重复的内容 --Set 不能存放重复的内容,所以的重复内容靠hashCode()和equals()两个

  • Java集合继承体系详解

    Java的集合类是一种特别有用的工具,它可以用于存储数量不等的多个对象,并可以实现常用的数据结构,如栈.队列等.Java集合还可以用于板寸具有映射关系的关联数组. java集合就像是一个容器,我们可以把多个对象(实际上是对象的引用,习惯上叫对象,)保存到集合容器中.在JDK1.5以前java集合会丢失容器中所有对象的数据类型,JDK1.5以后增加了泛型,java集合可以记住容器中对象的数据类型. Java集合大致可以分为三个体系:Set List Map.所有的集合类都位于java.util包下

  • Java集合TreeSet用法详解

    第1部分 TreeSet介绍 TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet<E>, Cloneable, java.io.Serializable接口. TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法. TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法.比如查找与指定目标最匹配项. TreeSet 实现了Cl

  • Java集合框架LinkedList详解及实例

    Java集合框架LinkedList详解 LinkedList定义 package java.util; public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ transient int size = 0; transient Node<E> first;

  • Java输入/输出流体系详解

    在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流:按字符读取. 字符流读取方便,字节流功能强大,当不能用字符流时,可以用字节流. 字节流基类:InputStream.OutputStream InputStream方法: OutputStream方法: 字符流基类:Reader.Writer Reader方法: Writer方法: 2.输入输出流体

  • 基于java中集合的概念(详解)

    1.集合是储存对象的,长度可变,可以封装不同的对象 2.迭代器: 其实就是取出元素的方式(只能判断,取出,移除,无法增加) 就是把取出方式定义在集合内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类. 二每一个容器的数据结构不同,所以取出的动作细节也不一样.但是都有共性内容判断和取出,那么可以将共性提取,这些内部类都符合一个规则Iterator Iterator it = list.iterator(); while(it.hasNext()){ System.out

  • Java类的继承实例详解(动力节点Java学院整理)

    一.你了解类吗? 在Java中,类文件是以.java为后缀的代码文件,在每个类文件中最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在public,则类文件的名称可以为任意的名称(当然以数字开头的名称是不允许的). 在类内部,对于成员变量,如果在定义的时候没有进行显示的赋值初始化,则Java会保证类的每个成员变量都得到恰当的初始化: 1)对于  char.short.byte.int.long.float.double等基本数据类型的

  • Java Iterator接口遍历单列集合迭代器原理详解

    这篇文章主要介绍了Java Iterator接口遍历单列集合迭代器原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Iterator接口概述 在程序开发中,经常需要遍历集合中的所有元素.针对这种需求,JDK专门提供了一个接口java.util.Iterator . Iterator 接口也是Java集合中的一员,但它与 Collection . Map 接口有所不同,Collection 接口与 Map 接口主要用于存储元素,而 Iter

  • Java 面向对象之继承篇详解原理与特点

    目录 一.前言 二.继承 什么是继承呢? 继承的好处与弊端 继承的使用场景? 继承的格式: 继承的特点: 重写的概念: super关键字 super和this的比较 一.前言 前面我也们讲述了相关封装的,现在我们先认识的继承的概念和使用. 二.继承 什么是继承呢? 继承在显示生活中也不少见,比如继承财产之类的,在我们java学习中也有类似的使用, 继承者称作子类也叫派生类,被继承者称作父类.基类或超类,objec类是所有类的父类 (后期介绍) 继承的好处与弊端 好处:就是提高了代码的维护性(多个

  • java HttpServletRequest和HttpServletResponse详解

    java  HttpServletRequest和HttpServletResponse详解 最近由于CAS相关的JAR包的重新封装,所以想尽量做到0配置,而这个过程中大量使 用HttpServletRequest,现在整理如下,以便以后查阅.(表格为从别的地方复制的,排版渣了点,酬和看吧.) 请求与响应相关的类和接口非常多,下表是主要的与请求和接口相关的类以及接口. 主要的与请求和接口相关的类及接口 方    法 说    明 ServletInputStream Servlet的输入流 Se

  • java 抽象类的实例详解

    java 抽象类的实例详解 前言: 什么是抽象类?这名字听着就挺抽象的,第一次听到这个名字还真有可能被唬住.但是,就像老人家所说的,一切反动派都是纸老虎,一切有着装x名字的概念也是纸老虎.好吧,我们已经从战略上做到了藐视它,现在就要战术上重视它,如同要解决纸老虎,就要一个牙齿一个牙齿地敲,一个爪子一个爪子地拔:解决这种抽象概念也一样,先要把它具体化,细分化,然后一个一个地来. 我一般遇到新的概念都会问三个问题: 1.这个东西有什么用?用来干什么的?它的意义在哪里?(显然,如果是没用的东西,就没必

随机推荐