黑马程序员——Java基础——集合类

第一讲    集合框架

 

 

 

这就是集合框架的构成。由于数据结构的不同,有不同的集合,也叫做容器。下面是集合类的简单介绍:

一、为什么出现集合类

面向对象的语言对事物的体现都是以对象的形式(万物皆对象?),所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式

二、数组和集合类同时容器,不同点?

数组虽然也可以存储对象,但长度固定;集合类长度可变。数组只可以存储基本数据,集合只要是对象都能存储(其实更方便)。

三、集合类的特点

集合只用于存储对象,长度可变,可以存储不同类型的对象

第二讲    Collection

         Collection是集合框架常见接口。他的两个字接口:List(列表),Set(集)

         所属关系:

                   List:元素师有序的,元素可以重复。因为该集合体系有索引

                   Set:元素师无序的,元素不可以重复

一、Collection接口中的常见操作

1、添加元素                           add(Object obj);add方法参数类型是Object。以便于接受任意类型

2、删除元素                           remove(Object  obj);           removerAll(另一个集合):调用者只保留另一个集合没有的元素                                   clear():清空集合

3、判断元素                           contains(Object obj);判断是否存在obj                 isEmpty()判断是否为空

4、获取个数,集合长度          size():判断个数(有点想length())                                

5、取交集                          retainAll(另一个集合):调用者只保留两种公用的元素

注意:集合中存储的都是对象的引用(地址)

二、迭代

1、概述

         迭代是取出集合中元素的一种方式。

         对于集合的元素取出的这个动作:

         是不足以用一个函数来描述,需要用多个功能来体现,所以就将取出这个动作封装成一个对象来描述。就把取出方式定义在集合的内部(即定义在内部类中),这样取出时就可以直接访问集合内部的元素

那么取出方式就被定义成两个内部类

         而每一个容器的数据结构不同,所以取出的动作细节也不一样。但都是具有共性内容:即判断和取出。那么就可以将这些共性抽取。

         那么遮羞内部类都符合一个规则:就是Iterator。通过一个对外的方法:Iterator iterater(集合类);来获取集合的取出对象。

2、迭代的常见操作

         Iterator   iterator()

         hasNext()判断是否有下一个元素,返回boolean

         next():取出下一个元素

         remover():移除

老外的写法:

  for(Iterator it=al.iterator();it.hasNext();){

         System.out.println(it.next());

  }//变成局部变量了,节约空间,但观看时不爽,不习惯

注意事项:

*迭代器在Collection接口中是通用的,它替代了Vector类中的Enumeration(枚举)

*迭代器在next方法是自动向下取元素的,要避免出现NosuchElementException

*迭代器在next方法放回类型是Object,所以记得转变类型;

第三讲       List

一、List

|——Collection

  |——List:元素师有序的,元素可以重复。因为是有序的,所以带有角标的方法就是他的特殊方法

          |———ArrayList:底层数据结构使用的是数组结构。特点:查询速度快,但插入增删慢。线程不同步

          |———LinkedList:底层使用的是链表数据结构。特点:增删速度快,查询慢

     |———Vector:底层是数组数据结。线程同步。被ArrayList替代了。|——Set:元素师无序的,所以 元素不可以重复

   |——Set:元素师无序的,元素不可以重复 

      |——HashSet:底层数据结构式哈希表。线程不同步。保证元素唯一性的原理:判断元素的hashCode值是否相同。如果相同,还会继续判断元素的equals方法是否为ture

      |——TreeSet:可以对Set集合中的元素进行排序。默认安装字母的自然排序。底层数据结构式二叉树。保证元素唯一性的依据:compareTo

以下是集合的框架:

二、List的特有方法:因为是有序的且带有角标的方法就是他的特殊方法

1、增

        add(int index,element)//在角标index后添加元素

        addAll(int index,Collection//在角标index后添加指定集合Collection的元素

1、 删

   Remover(index)//指定角标index的元素

2、 改

    set(index,element)//改动角标index的元素改为element

3、 查

  get(index)

  subList(start,end);//有头无尾

5、其他

         ListIterator();//List特有的迭代器,唯一能增删改查的迭代器

         Int IndexOf(obj);//获取元素的第一次出现的位置,输出角标位置,如果没有则放回-1//获取

四、LinkeList(链表列表)

LinkedList:底层使用的是链表数据结构。特点:增删速度快,查询慢

特有方法:

1、 增:  addFirst();

      addLast( );

2、获取//获取元素,但不删除元素。如果没有该元素,则NosuchElementException

      getFirst()

      getLast()

3、 删//获取元素并删除元素。如果没有则NoSuchElementException

      removefirst()

      removeLast()

在Jdk1.6以后,出现了替代方法

1、 增    offFirst()offLast()

2、 获取

//获取元素担保删除。如果没有就返回null

    peekFirst();                                                                      

    peekLast()

3、 删

获取元素,并删除元素。若果没有,放回null

    pollFirst();

    pollLast()

举个栗子

盏:先进后出:一个门的仓库

队列:先进先出:两个门的仓库

举个栗子去除重复项:

思路:1、创建一个新容器;

         2、创建一份迭代去除

         3、在存在的循环下,判断是新容器是否存在元素,不存在是则输入(注意:it.Next()需要使用两次,所以把他赋予新的Object类中)

         4、返回新的容器就是了

List集合添加对象,注意自定义的Person()类中的自定义的equals()方法

 

第四讲    Set

|——Collection

|——List:元素师有序的,元素可以重复。因为是有序的,所以带有角标的方法就是他的特殊方法

           |———ArrayList:底层数据结构使用的是数组结构。特点:查询速度快,但插入增删慢。线程不同步

           |———LinkedList:底层使用的是链表数据结构。特点:增删速度快,查询慢

    |———Vector:底层是数组数据结构。线程同步。被ArrayList替代了。

|——Set:元素是无序的,所以 元素不可以重复

    |——HashSet:底层数据结构式哈希表。线程不同步。

                 HashSet是如何保证元素唯一性的呢?

                      是通过元素的两个方法,hashCode和equals来完成

                      如果元素的hashCode值相同,才会判断equals是否为true

            如果元素的hashcode不同,才会调用equals

    |——TreeSet:可以对Set集合中的元素进行排序。默认安装字母的自然排序。底层数据结构式二叉树。保证元素唯一性的依据:compareTo

          Set集合的功能和Collection一致的。所以只能迭代器Iteractor

 所以自定义的类需要复写hashCode和equals,最好把compareTo复写了

举个栗子:

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。