美文网首页
java(二)集合框架

java(二)集合框架

作者: 啊耀 | 来源:发表于2018-06-12 20:54 被阅读17次

    1.集合框架示意图:

    关系图

    2.集合和数组的比较:

     数组是固定长度,而集合的长度是可变的,有时候我们不能确定对象的多少,所以往往选择集合用来存储对象。

     数组只能存一种数据类型,而集合可以存储任意类型对象。

     个人理解,集合的出现是专门为了存储对象的。

    3.共性方法:

    集合存储的是对象的引用,而不是对象实体;

    Collection是一个接口,是集合框架的根接口,没有构造函数,所以只有集合的共性方法;

    4.List结合接口:

    概述:有序(元素的存入顺序和取出顺序一致)元素都有索引,元素可以重复,即角标1存A元素,角标2也可以存A元素。

    三个子类:

    ArrayList:底层的数据结构是数组,线程不同步,ArrayList代替了Vector,查询元素非常快,增删元素稍慢。

    LinkedList:底层的数据结构是链表,增删元素非常快。查询元素稍慢。

    Vector:底层的数据结构是数组,线程是同步的,无论查询还是增删都很慢。

    可变长度原理:当元素超出数组长度,会产生一个新的数组,将原数组的数据复制到新数组中,再将新的元素添加到新数组中,最后让新数组取代旧数组。ArrayList:是按照原数组的50%延长。构造一个初始容量为10的空列表。Vector:是按照原数组的100%延长。两者比较ArrayList既扩大空间有节省资源。

    5.Set集合:

    概述:

    1. Set接口中的方法和Collection中方法是一致的。Set取出元素的方式只有一种,迭代器。

    2. 元素是无序的(元素的存入和取出顺序不一致),元素不能重复。

    两个子类:

    1.HashSet:底层数据结构是哈希表,线程是不同步的,无序、高效。HashSet集合保证元素的唯一性通过元素的hashCode和equals方法完成的。当元素的hashCode值相同时才判断元素的equals从而判断是否重复元素。当元素的hashCode值不同时,那么肯定是不同元素,那么不判断equals,从而提高对象的比较速度。而且判断删除等操作,根据的也是hashCode和equals方法。

    A.哈希表原理:

    1).对对象元素中的关键字(对象中的特有数据),进行哈希算法运算,并且得出一个具体的算法值,这个值称为哈希值。一般而言要重写hashCode方法。

    2).哈希值就是这个元素存入集合的位置。

    3).如果哈希值出现冲突,再判断这个关键字对应的对象是否相同,如果对象相同就不存储,因为元素重复。如果对象不同,就存储在原来对象的哈希值+1顺延。

    4).存储哈希值的结构,我们称为哈希表。

    5).既然哈希表是根据哈希值存储的,为了提高效率,最好设计好计算哈希值的条件。如下:

    public  int  hashCode(){

    //乘以17是为了防止偶然的重复

    return  name.hashCode()+age*17;

    }

    对于ArrayList集合,判断元素是否存在或者删除元素底层都是根据equals方法。

    对于HashSet集合,判断元素是否存在或者删除元素底层根据的是先hashCode然后再equals方法。

    2.TreeSet:对集合中的元素进行指定顺序的排序。不同步。底层的数据结构式二叉树或者红黑树。

    A.二叉树结构:根据compareTo的返回值,大于返回正数,等于返回0,小于返回负数,在二叉树结构中小的放左边,大的放右边。

    B.概述:对于Set集合进行指定顺序的排序,排序需要元素自身具备比较性(排序性)。如果元素不具备比较性,在运行时会报ClassCastException异常。所以需要元素实现Comparable接口,强制让元素具备比较性,复写compareTo方法。依据compareTo返回的值,确定元素在TreeSet数据结构中的位置。TreeSet方法保证元素唯一性的方式:就是参考比较方法的结果是否为0,如果为0,则视为两个元素重复,不存储。注意:在进行比较时候,如果判断元素不唯一,比如,同姓名、同年龄,才视为同一个人。在判断时需要分主要条件和次要条件,当主要条件相同时,再判断次要条件,然后按照次要条件排序。

    C.TreeSet集合排序有两种方式,Comparable和Comparator区别:

    1.让元素自身具有比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。

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

    3.个人认为,TreeSet有排序的功能,这种功能可以理解有点类似抽象方法。第一种是让元素去实现这个抽象方法。第二种是让集合实现这个抽象方法。第二种方式较为灵活。且当两种方式都存在时,以comparator为主。

    相关文章

      网友评论

          本文标题:java(二)集合框架

          本文链接:https://www.haomeiwen.com/subject/sbbreftx.html