集合框架

来源:互联网 发布:linux关闭tomcat报错 编辑:程序博客网 时间:2024/06/14 01:33

集合框架

一、集合框架概述

1、集合类的由来:

       对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。就使用集合容器进行存储。

集合容器因为内部的数据结构不同,有多种具体容器。

不断的向上抽取,就形成了集合框架。

备注:集合存储的是对象的地址,而不是对象本身

2、集合框架说明:

框架的顶层Collection接口和Map接口

其中Collection体系是:单列集合(集合中元素是一个值)

Map体系是:双列集合(集合中元素是一对值)

jdk1.0版本中

单列集合只有Vector,双列集合只有Hashtable,且这两个集合都是同步的,线程安全的。(Vector相当于Collection体系的先祖,Hashtabl相当于Map体系的先祖)

jdk1.2版本中

才出现Collection系列的集合,以及Map系列的集合

3、集合框架特点:

1,用于存储对象的容器。

2,集合的长度是可变的。

3,集合中不可以存储基本数据类型值。

二、集合和数组的区别:

1、集合:

(1)只能存储对象的容器,不能存储基本数据类型

(2)集合长度是可变的

举例:

       List list = new ArrayList();

      

       list.add(1);//实质上是:list add(new Integer(1))

       //jdk1.5版本后,执行了自动装箱操作:基本数据类型-->包装类

       //备注:jdk1.4版本前,这样写是错误的。

       //原因:集合中不能存储基本数据类型

       list.add("abc1");//字符串String是对象,没问题

2、数组:

(1)可以存放基本数据类型对象

备注:存放对象使用的是对象数组

eg:Person[] person=new Person[20];

(2)数组长度是固定的。

三、集合框架的构成及分类

1、集合框架构成及分类

2、集合体系说明

(1)集合框架的两大体系:Collection体系和Map体系

集合框架的两大体系:Collection体系和Map体系

Collection体系是:单列集合

Collection下有两大体系,一个是List,一个是Set

备注:Collection下还有很多其它接口,不仅仅包括List接口和Set接口

Map体系是:双列集合

因此这里主要说:List体系,Set体系和Map体系

(2)集合框架常用体系特点

集合框架常用体系:List体系,Set体系,Map体系

List体系:元素有序,并且可重复

Set体系:元素无序,并且不可以重复

Map体系:提供了一种映射关系,元素是以键值对(key-value)的形式存储的,能根据key快速查找value。其中:key值不能重复,value值可以重复;而且key对value是多(一)对一的关系【一一映射】

(3)List体系常用实现子类

List:特有的常见方法:有一个共性特点就是都可以操作角标。

List:

       |--Vector:内部是数组数据结构,是同步的。增删,查询都很慢!

       |--ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。

       |--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。

4Set体系常用实现子类

Set:元素不可以重复,是无序。

Set接口中的方法和Collection一致。

       |--HashSet: 内部数据结构是哈希表 ,是不同步的。

|-- LinkedHashSet:内部数据结构是哈希表和链表有序的

|--TreeSet: 内部数据结构是二叉树,可以对Set集合中的元素进行排序。是不同步的。

(5)Map体系常用实现子类

Map:一次添加一对元素。Collection一次添加一个元素。

|--Hashtable :内部结构是哈希表,是同步的。不允许null作为键,不允许null作为值。

              |--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。             

       |--HashMap : 内部结构是哈希表,不是同步的。允许null作为键,允许null作为值。

      |--LinkHashMap:内部结构是哈希表和链接列表实现,具有可预知的迭代顺序(有序的)

       |--TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序

四、集合框架学习说明

1、弄清set集合和map集合关系

备注:

学习Set集合应该注意:Set集合的底层代码是由Map集合实现的。

为什么会有set集合?

因为:Map的集合中存储的是键值对,其中键在Map集合中是唯一的,因此将Map中的键作为set中的元素进行存储,就可以保证单列集合的唯一性了,这样就出现了没有重复元素的set集合了。

因为现实世界中因为有这样的需求,所以就有了set集合的存在

推论:

因为Set集合的底层代码是由Map集合实现的,所以set的子类xxxSet的底层实现是Map的子类xxxMap。

而我查看java的源码发现,这个推论在一定程度上是成立的。因为我发现:1)HashMap是HashSet的底层实现。2)TreeMap是TreeSet的底层实现。3)LinkedHashMap是LinkedHashSet的底层实现

(1)HashMap是HashSet的底层实现

    public HashSet() {

        map = new HashMap<>();

}

 

(2)TreeMap是TreeSet的底层实现

    public TreeSet() {

        this(new TreeMap<E,Object>());

    }

 

(3)LinkedHashMap是LinkedHashSet的底层实现

    public LinkedHashSet() {

        super(16, .75f,true);

    }

    HashSet(intinitialCapacity, floatloadFactor, booleandummy) {

        map = new LinkedHashMap<>(initialCapacity,loadFactor);

    }

 

所以,学习set集合时,时刻联系map集合,注意xxxMapxxxSet的关系,可以让自己学习集合框架更加轻松。

2、集合框架三大体系学习

集合框架List体系,Set体系,Map体系学习

List体系和Set体系都是单列集合,Map体系是双列集合。

而List体系的学习相对比较简单,而Set体系和Map体系的学习相对比较难,而Set体系和Map体系又存在联系,因为Set集合的底层代码是由Map集合实现的。所以,学会一个了一个Set(Map)体系,Map(Set)体系的内容就可以举一反三了。

(1)HashSet和TreeSet集合,它们怎样保证插入集合中的元素是唯一的?

自己在学习Set体系时,碰到比较难的地方,就是当Set体系的集合要存储自定义对象时,要自己覆盖一些方法,目的是为了:保证存入set集合中的元素都是唯一的。而这里主要说set体系下的两个子类:HashSetTreeSet集合,它们怎样保证插入集合中的元素是唯一的?

HashSet集合解决方法:(保证插入集合中的元素唯一)           

是通过对象的hashCode和equals方法来完成对象唯一性的。

只要对象覆盖了这两个方法,并在方法中写入了实现逻辑,即可解决。

情况一:当这个对象是jdk中已有的对象是,并且该对象已经覆盖了Object对象的hashCode和equals方法,比如:String对象,我们在往set集合中存储该类对象(String对象)时,无需自己给对象覆盖方法,直接使用即可。

情况二:当这个对象时自定义对象(自己写的对象),这时时,我们想要保证该对象插入set集合时,插入的对象时唯一的,我们就得给这个自定义对象添加两个方法:hashCode和equals方法,并且实现里面的比较逻辑,达到保证set集合插入该对象不重复。

TreeSet集合解决方法:(保证插入集合中的元素唯一)      

TreeSet使用元素的自然顺序(字典顺序)对元素进行排序【TreeSet集合排序方式一:让元素自身具备比较功能】

或者

根据创建 set 时提供的 Comparator (比较器)进行排序,具体取决于使用的构造方法。【TreeSet集合排序方式二:让集合自身具备比较功能】

其中:

TreeSet集合排序方式一:让元素自身具备比较功能

让元素自身具备比较功能,只就需要实现Comparable接口。覆盖compareTo方法。【Comparable接口的compareTo方法】

即:自定义对象实现Comparable接口,定义排序方式,实现comparaTo方法。

TreeSet集合排序方式二:让集合自身具备比较功能

让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。将该类对象作为参数传递给TreeSet集合的构造函数。

 

当TreeSet集合有两种比较功能时,TreeSet集合排序方式二(集合自身具备比较功能优先于 TreeSet集合排序方式一(元素本身具备比较功能

 

(2)Map集合保证key(键)唯一?

Map集合保证key(键)唯一?

 

因为set集合的底层是通过map集合实现。

所以保证唯一,通过类比的方式得出:

HashMap(保证键唯一)与HashSet(保证元素唯一)方式一样

是通过对象的hashCode和equals方法来完成对象唯一性的。

 

TreeMap(保证键唯一)与TreeSet(保证元素唯一)方式一样

实现Comparable接口的compareTo方法 或者 实现 Comparator接口,覆盖compare方法

3、集合的一些技巧:

1、使用技巧

集合是存一个元素呢?还是存一对元素呢?

一个:List或者Set

一对:Map

 

集合存一个元素

需要唯一吗?

需要唯一:Set

       需要指定顺序:

                     需要: TreeSet

                     不需要:HashSet

                        但是想要一个和存储一致的顺序(有序):LinkedHashSet

不需要唯一:List

       需要频繁增删吗?

              需要:LinkedList

              不需要:ArrayList

2、如何记录每一个容器的结构和所属体系呢?

看名字!

List

       |--ArrayList

       |--LinkedList

Set

       |--HashSet

       |--TreeSet

后缀名就是该集合所属的体系。

前缀名就是该集合的数据结构。

3、集合联想

看到array:就要想到数组,就要想到查询快,有角标.      

看到link:就要想到链表,就要想到增删快,就要想要 add get remove+frist last的方法

看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法。

看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator 。

而且通常这些常用的集合容器都是不同步的。

原创粉丝点击