zoukankan      html  css  js  c++  java
  • Collection集合框架详解

    Java的集合框架】

    接口:

      collection             map

    list        set

    实现类:

    ArryList    HashSet     HashMap

    LinkList    LinkHashSet   LinkHashMap

                 TreeSet        TreeMap

                            HashTable

    【四个接口的区别】

    1collection:存储不唯一、无序的数据;

    2list:存储有序的、不唯一的数据;

    3set:存储无序的、唯一的数据;

    4Map:以键值对的形式存储数据,以键取值。键不能重复、值可以重复。

    List接口】

    1、常用方法:

    ① add():在列表的最后添加元素;

    ② add(int index,E element):在列表的指定位置插入元素;

    ③ size():返回当前列表的元素个数;

    ④ get(int index):返回下标为index的元素。

    如果没有泛型约束,返回Object类型,需要强转;如果有泛型约束,直接返回泛型类型,无需强转。

    ⑤ clear():清除列表中的所有数据

         isEmpty():检测列表是否为空

    ⑥ contains():传入一个对象,检测列表中是否包含该对象。

        如果传入的是String和基本数据类型,可以直接比对

        如果传入的是实体类,则默认只比对两个对象的地址。因此,需要在实体类重写equals()方法;

    Tips

    String s = "123";

    "123".equals(s);//这个顺序可以防止空指针

    ⑦ indexOf():传入一个对象,返回该对象在列表中首次出现的地址。

        lastIdexOf():传入一个对象,返回该对象在列表中最后一次出现的地址。

    ⑧remove():传入一个下标,或者一个对象,删除指定元素;

        如果传入下标,返回被删除的对象,如果下标大于size(),会报下标越界异常;

        如果传入对象,则要求重写equals方法,返回truefalse表示删除是否成功

    ⑨set(index, obj):用新传入的对象,将指定位置的元素替换掉;

        返回被替换掉的元素对象。

    ⑩subList(1,3):截取一个子列表,返回List类型;

       toArray():将列表转为数组。返回一个Object[]类型的数据

    2ArrayList

         实现了一个长度可变的数组,在内存空间中开辟一串连续的空间,与数组的区别在于长度可以随意修改。这种存储结构在循环遍历和随机访问元素的速度比较快。

    3LinkedList

    使用链表结构存储数据,在插入和删除元素时速度非常快。

    LinkedList的特有方法:

    ① addFirst():开头插入元素。

         addLast():结尾插入元素。

    ② removeFirst():删除第一个元素,并返回被删除的元素。

        removeLast():删除最后一个元素,并返回被删除的元素。

    ③getFirst():返回列表的第一个元素,不删除。

       getLast():返回列表的最后一个元素,不删除。


    Set接口】

    1、常用方法:与List接口基本相同。

    但是,由于Set接口中的元素是无序的,因此没有与下标相关的方法。

    例如:get() remove() add()

    2Set接口的特点:唯一、无序;

    3HashSet 底层是调用HashMap的相关方法,传入数据后,根据数据的HashCode进行散列运算,得到一个散列值后再进行运算,确定元素在列表中的位置。

    HashSet如何确定一个对象是否相等?

    先判断对象的hashCode(),如果hashCode不同,那肯定不是一个对象。

         如果hashCode相同,那继续判断equals()方法;

    重写equals()方法。

    所以,使用HashSet存储实体对象时,必须重写对象的hashCode() equals()两个方法!!

    4LinkedHashSet:在HashSet的基础上,新增了一个链表。

    用链表来记录HashSet中元素放入的顺序,因此使用迭代器遍历时,可以按照放入的顺序依次读出元素。

    5TreeSet:将存入的元素,进行排序,然后输出。

    如果存入的是实体对象,那么实体类必须实现Comparable接口,并重写compareTo()方法。

    或者,也可以在实例化TreeSet的同时,通过构造函数传入一个比较器(一个实现了Comparator接口,并重写了compare()方法的实现类的对象。

    Set<person> set = new TreeSet<Person>(new Comparator(){

    public int compare(Person p1,Person p2){

    return p1.getId() - p2.getId();

    }

    });

    Set<Person> set = new TreeSet<Person>(new Compare());

    class Compare implements Comparator(){

    //重写compare方法

    }

    Comparable接口和Comparator接口的区别】

    1Comparable由实体类实现,重写comparTo()方法;

    实体类实现Comparable接口以后,TreeSet使用空参构造即可

    2Comparator需要单独一个比较类进行实现,重写Compare()方法。

    实例化TreeSet的时候,需要传入这个比较类的对象。


    Map接口】

    1Map接口特点:以键值对的形式存储数据,以键取值。

    键不能重复,值可以重复。

    2Map接口的常用方法:

    ① put(key,value):向map的最后追加一个键值对;

    ② get(key):通过键,取到一个值;

    ③ clear():清除Map中的所有数据;

    ④ containsValue(obj):检测是否包含指定的键

         containsKey(obj):检测是否包含指定的键

    HashMap Hashtable 的主要区别】

    1Hashtable是线程安全的(线程同步),HashMap是线程不安全的(线程不同步);

    2Hashtable的键不能为null,HashMap的键可以为null

    3HashMap继承了AbstractMapHashTable继承Dictionary抽象类,两者均实现Map接口。

    4HashMap的初始容量为16Hashtable初始容量为11,两者的填充因子默认都是0.75

    5HashMap扩容时是当前容量翻倍即:capacity*2Hashtable扩容时是容量翻倍+1:capacity*2+1

    LinkedHashMap

    可以使用链表,记录数据放入的次序,进入让读出的顺序与放入的顺序一致,与LinkedHashSet一样。

    TreeMap

    根据键的顺序,进行排序后,输出。

    如果传入的是实体对象,必须重写比较函数。详见TreeSet

  • 相关阅读:
    PLSQL配置介绍
    jquery实现无外边框table
    以太坊白皮书
    区块链技术教程,如何从零开始学习以太坊及区块链
    Python机器学习中文版
    史上最全TensorFlow学习资源汇总
    什么是人工智能?终于说明白了
    Python 语音识别
    Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1
    什么是加密经济学? 初学者终极指南
  • 原文地址:https://www.cnblogs.com/ymyBlogs/p/8849811.html
Copyright © 2011-2022 走看看