一、集合类

    定义:一种为了对多个对象进行操作而进行存储的方式。

    1、与数组的区别:
      数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,数组长度固定。

      集合:只能存储对象,长度可变,可以存储不同类型的对象。

    集合众多的原因:每一种容器对数据的存储方式都有所不同,这个存储方式为:数据结构。

二、Collection

      1.增加对象:boolean add(Object object) 如果集合中没有object,那么添加它并返回true;
       如果集合中存在object(且该集合不能包含重复元素),则返回false。
       另外:集合中存储的都是对象的引用(地址)。(Object可以放入任何对象)

      2.获取长度:int size(): 返回此集合中的元素个数。

      3.删除元素:
        void clear(): 清楚集合中的所有元素(除非该集合不支持clear方法)。
        boolean remove(Object o): 删除集合中所有e.equals(e)==true的元素,并返回true。否则返回false。

                        (Arraylist中改写为:移除相等的首个元素)
        Boolean removeAll(Cellection c): 移除和集合c 的交集中的元素。

      4.判断元素:
        Boolean contains(Object o):判断集合中是否包含元素(对象)o。
        boolean containsAll(Collection c):判断集合c是否是调用集合的子集。

     5.交集: boolean retainAll(Cellection c): 仅保留和集合c的交集。

三、元素的取出(迭代器)

      迭代器: 就是一个Iterator接口的子类对象,封装了取出其绑定集合的元素的方式。

        步骤: 1、通过调用集合的 Iterator iterator()方法返回该集合的迭代器,
            2、将此迭代器赋值给 一个 Iterator 型对象引用。 
            3、通过此引用,调用迭代器的方法操作集合:
              1)、boolean hasNext():如果集合中任有元素可以迭代,则返回true。
              2)、Object next():返回迭代的下一个元素(列表中还在)。
              3)、void remove():从迭代器指向的集合中 移除 迭代器返回的最后一个元素。

        注意:你不能同时用迭代器和集合同时去操作同一组元素, 有可能会抛出并发异常。
        原因:迭代器已经创建, 之后通过集合方法操作的元素过程(比如说增加),迭代器并不知道集合做了什么操作,还是只能
           按照原来的元素列表操作,就会发生错误。

四、List 接口

      Collection 接口的子接口

      特点:元素是有序的, 而且元素可以重复。 该类集合中有索引(角标)。

      其特有的常见方法:

        1、凡是可以操作角标(索引的)的方法都是该体系特有的方法。

          增:
            void add(int index ,Object object);
            Boolean add(int index, Collection c);

          删:
            remove(index):返回了移除的元素。
          改:
            set(index, element):在指定角标放入指定元素,返回原来的元素。
          查:
            get(index):返回index上的元素
            subList(start,end):返回一个自己列表(依赖于原集合)

      注:List集合特有的迭代器: listIterator(); 列表迭代器 (注意与iterator区别)

      listIterator:
        1、定义、解释。

            是iteretor的子接口。

            在进行迭代操作的时候,不能使用集合方法对同组元素进行操作(原因在iterator讲解处)。
          而iterator的操作方法又比较少(只有判断、查找、删除,没有添加),局限了对元素组的课操作性。
          所以在list集合中就定义了新的迭代器: listIterator。

        2、listIterator中新增的方法:
          1)、void add(): 在返回的元素后面的加入一个新元素
          2)、void set(object): 使用新元素替换返回的最后一个元素。
          3)、Boolean hasPrevious(): 逆向遍历列表(相对应: hasNext())

    list 集合在涉及到需要判断元素是否相同时,底层调用的都是equals方法。(contains、 remove方法等)

      list集合下,常见三大集合

            1、ArrayList:底层数据结构使用数组结构: 查询速度快。但是增删稍慢。(线程不同步,数组0.5倍延长)
            2、Linkedlist:底层使用链表数据结构: 增删块, 但是查询慢。
            3、Vector:底层是数组数据结构:查询赠删慢(线程同步,数组百分百延长)已经被ArrayList取代。

      Vector: 在1.2版本过后,便几乎被ArrayList取代,同步的。

        不过其有两个特有之处:

  
            1)、 在去方法中带有Element的方法是在1.1还没有Collection框架的时候特有的方法,与从list实现来的方法几乎一样。

            2)、 Vector除了有迭代器(iteretor、listIteretor )外,还有一个枚举(与iteretor类似)
                Enumeration en = v.elements(); 通过Vector对象创建一个枚举
                en.hasMornElements(); (类似迭代的hasNext())
                en.nextElement(); (类似迭代的Next())

      注意:枚举的所有功能都被迭代包含了,而且枚举方法名太长,不利于书写,所以,新的开发应当优先使用迭代而不是枚举。

      linkedList:

      底层使用链表数据结构。

      特有方法:
          1)、addFirst()从集合列表开头插入元素
          2)、addLast()从集合列表结尾插入元素(等效于add())
          3)、getFirst()拿到第一个元素,返回这个元素
          4)、getLast()拿到最后一个元素,返回这个元素
          5)、removeFirst()移除第一个元素,返回这个元素
          6)、removeLast()移除最后一个元素,返回这个元素

        (如果列表中没有元素,那么:3到6方法抛 空元素异常)

      注: 在1.6版本以后,新添加了获取和移除方法, 在空列表的时候,会返回null,不会发生异常。
          1)、peekFirst()获取 但 不移除 列表第一个元素,列表为空返回null

          2)、peekLast()获取 但 不移除 列表最后一个元素,列表为空返回null
          3)、pollFirst()获取 并 移除 列表第一个元素,列表为空返回null
          4)、pollLast()获取 并 移除 列表第最后一个元素,列表为空返回null
      

 五、Set 接口

      Collection 接口的子接口

      特点:元素是无序(存入和取出的顺序不一定一致)的,而且元素不能重复。 该类集合中没有索引。

      Set集合的功能和Collection是一致的。

      Set集合下常见的子类集合:
                    HashSet:底层数据结构式: 哈希表。

                    TreeSet:

      HashSet:
          特点:元素无序(存入和取出的顺序一定不一样),而且元素唯一,没有索引。

          底层数据: 底层使用哈希表作为数据结构。

          元素唯一性: 是通过元素的两个方法: hashCode 和 equals 来完成的。
              如果两个元素的HashCode值相同,就会判断equals是否为true。
              如果两个元素的HashCode值不同,就不会调用equals方法。

      注意:对于判断元素是否存在、删除等操作,都依赖于元素的hashCode、equals等方法。

      哈希表:给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,
        则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

      (哈希值与内存地址值之间的关系:默认的哈希值是内存地址值计算的哈希值,但是只是为了给人看的,真正在
      内存中还是依靠内存地址值来进行运算的,而不是哈希值)

TreeSet:

  底层数据结构: 二叉树 (保证元素唯一性的方法是保证compareTo 方法return 0)

      比较方式: 方式一、就是让元素自己具有比较性,元素需要实现comparable接口,重写其中得compareTo方法,这个排序叫做自然排序(默认排序)

              1、 无序性(按照输入元素类中自定义的compareTo方法来排定存储对象。)

              2、 单一性(通过判断元素类中自定义的compareTo方法放回值是否为0来判断元素是否相等。)

              3、 让需要存入到TreeSet中的元素,实现comparable接口,该接口中定义了一个public int compareTo方法

              4、 compareTo 方法:我们需要在类定义中重写该方法, public int compareTo,
            使得: 当有e.compareTo(e1)时,
              如果e大于e1则返回正数,当e小于e1则返回负数, 等于则返回0.
                而且当有e等于e1时, 可以定义附属判断条件来判断 两个对象的大小。

    注意:TreeSet 本情况的所有的底层比较原理只是调用了元素的compareTo方法,与 equals等方法都无关。
              (add、contains、remove等需要用到比较的方法)
      所以我们定义所有的比较都返回正数,那么靠遍历迭代器取出的元素顺序和存入顺序一样。
      如果定义所有的比较都返回负数,那么靠遍历迭代器去除的元素顺序和存入的顺序相反。
      如果定义所有比较都返回0 ,那么就只能存入一个元素,最后也只能取出一个元素。

    方式二、当元素自身没有比较性或者具有的比较性不是自身所需要的,那么就要让集合自身具有比较性。
          那么就要在集合一初始化时定义比较方式(也就是调用集合的构造方法)

        1、 无序性(按照集合实例化的时候的比较器来排布元素的存储顺序。)

        2、 单一性(通过集合的比较器的compare方法返回值是否为0 来判断元素是否相等。)

        3、 定义一个比价器的类,使其实现comparator接口, 重写覆盖其中的 int compare(T o1, T o2) 方法。

        4、 compare 方法:我们需要在比较器类定义中重写该方法,int compare(Object o1, Object o2),
      使得: 我们在该方法中比较两个对象,或者比较其对象的方法,或者直接定义一个数值返回。
          当返回值为正时代表o1大于o2,当返回值为负时代表o1小于o2,返回值为0 则代表两个对象相等。

         而且当初步判断有o1等于o1时, 可以定义附属判断条件来判断 两个对象的大小。

      注意:TreeSet 本情况的所有的底层比较原理只是调用了集合比较器的compare方法,与 元素equals等方法都无关。
          (add、contains、remove等需要用到比较的方法)
        所以我们定义所有的比较都返回正数,那么靠遍历迭代器取出的元素顺序和存入顺序一样。
        如果定义所有的比较都返回负数,那么靠遍历迭代器去除的元素顺序和存入的顺序相反。
          如果定义所有比较都返回0 ,那么就只能存入一个元素,最后也只能取出一个元素。

集合类(常见的集合类:Collection、List、Set、ArrayList、linkedList、Vector、HashSet、TreeSet)的更多相关文章

  1. List集合与Set集合(ArrayList,LinkedList,Vector,HashSet,LinkedHashSet,可变参数)

    List集合介绍及常用方法 import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* java. ...

  2. ArrayList,LinkedList,Vector集合的认识

    最近在温习Java集合部分,花了三天时间读完了ArrayList与LinkedList以及Vector部分的源码.之前都是停留在简单使用ArrayList的API,读完源码看完不少文章后总算是对原理方 ...

  3. ArrayList LinkedList Vector

    ArrayList是基于数组实现的,没有容量的限制. 在删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量. ArrayList, Lin ...

  4. ArrayList, LinkedList, Vector - dudu:史上最详解

    ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ...

  5. 集合类源码(二)Collection之List(ArrayList, LinkedList, Vector)

    ArrayList 功能 完全命名 public class ArrayList<E> extends AbstractList<E> implements List<E ...

  6. java 中 ArrayList LinkedList Vector 三者的异同点

    1.ArrayList和Vector都是基于数组实现的,所以查询速度很快,增加和删除(非最后一个节点)速度慢: Vector是线程安全的,ArrayList不是. 2.LinkedList 是一个双向 ...

  7. ArrayList,LinkedList,vector的区别

    1,Vector.ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储. 2.List中的元素有序.允许有重复的元素,Set中的元素无序.不允许有重复元素. ...

  8. ArrayList LinkedList Vector之间的区别

    List主要有ArrayList,LinkedList和vector三种实现.这三种都实现了List接口,使用方式也很相似,主要区别在于其实现方式的不同! 这三种数据结构中,ArrayList和Vec ...

  9. 比较Java数组,ArrayList,LinkedList,Vector 性能比较

    public class PerformanceTester { public static final int TIMES=100000; public static abstract class ...

  10. java类集框架(ArrayList,LinkedList,Vector区别)

    主要分两个接口:collection和Map 主要分三类:集合(set).列表(List).映射(Map)1.集合:没有重复对象,没有特定排序方式2.列表:对象按索引位置排序,可以有重复对象3.映射: ...

随机推荐

  1. Jmeter(GUI模式)教程

    前些天,领导让我做接口的压力测试.What??我从未接触过这方面,什么都不知道,一脸蒙.于是我从学习jmeter开始入手. 现在记录下来jmeter的使用步骤,希望能对大家有所帮助. 一.安装Jmet ...

  2. HAOI2016 找相同字符 后缀自动机

    两个串,考虑一建一跑.枚举模式串的位置\(i\),考虑每次统计以\(i\)结尾的所有符合要求的串.在后缀自动机上走时记录当前匹配长度\(curlen\),则当前节点的贡献是\((curlen-len[ ...

  3. Beta项目展示

    Team C# 一.团队成员简介 杜正远,队长. 博客地址:http://www.cnblogs.com/kevindu/ 崔强,全职PM. 博客地址:http://www.cnblogs.com/m ...

  4. [转载]Memory Limits for Windows and Windows Server Releases

    Memory Limits for Windows and Windows Server Releases This topic describes the memory limits for sup ...

  5. Windows 安装 docker 以及1709的简单使用

    PS C:\> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force PS C:\> Install-P ...

  6. RabbitMQ基础知识详解

    什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中 ...

  7. 监控系统 & monitoring & DevOps

    监控系统 & monitoring & DevOps https://github.com/topics/monitoring https://github.com/marketpla ...

  8. ssh 将22端口换为其它 防火墙设置

    废话不多说,先通过当前的SSH端口(默认为:22)登陆. 1.修改配置文件:/etc/ssh/sshd_config ,找到 #port 22 2.先将Port 22 前面的 # 号去掉,并另起一行. ...

  9. Bootstrap图像

    前面的话 图像在网页制作中也是常要用到的元素,本文将详细介绍Bootstrap图像 响应式图片 通过为图片添加 .img-responsive 类可以让图片支持响应式布局.其实质是为图片设置了 max ...

  10. 洛谷P2397 yyy loves Maths VI (mode)

    P2397 yyy loves Maths VI (mode) 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居 ...