美文网首页
Jave集合的了解

Jave集合的了解

作者: 字节码 | 来源:发表于2016-12-26 01:23 被阅读36次

    数组,是最简单的数据结构,是一种用来存储多个数据的容器.

    数据结构:
    把多个数据按照一定的存储方式,存储起来,称存储方式之为数据结构.
    数据的存储方式有很多,数组,队列,链表,栈,哈希表等等.
    不同的数据结构,性能是不一样的,比如有的插入比较快,查询比较快,但是删除比较慢.
    有的删除比较快,插入比较快,但是查询比较慢.
    根据实际操作,合理选择即可

    集合

    • 集合和数组的区别

    数组和集合类都是容器
    数组长度是固定的,集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象, 数组中存储数据类型是单一的,数组一旦初始化,长度固定,且操作复杂GURD,集合中可以存储任意类型的对象。

    集合类的特点
    用于存储对象,长度是可变的,可以存储不同类型的对象。

    数组的特点:
    1. 只能存储同一种数据类型的数据。
    2. 一旦初始化,长度固定。
    3. 数组中的元素与元素之间的内存地址是连续的
    4.Object类型的数组可以存储任意类型的数据
    注意: 集合和数组中存储都是对象的引用,而不是对象本身

    • 集合的分类
    • Collection: 单列集合
      • 1.List:

    如果是实现了List接口的集合类,具备的特点: 有序,可重复;只有List接口下面的集合类才具备索引值。其他接口下面的集合类都没有索引值

        - 1.1.ArrayList:  
    

    底层是维护了一个Object数组实现 的, 特点: 查询速度快,增删慢。
    什么时候使用ArrayList: 如果目前的数据是查询比较多,增删比较少的时候,那么就使用ArrayList存储这批数据。
    注意: 当使用无参构造函数时,Object数组默认的容量是10,当长度不够时,自动增长0.5倍。

      - 1.2.LinkedList:  
    

    底层是使用了链表数据结构实现的, 特点: 查询速度慢,增删快
    由于链表实现, 增加时只要让前一个元素记住自己就可以, 删除时让前一个元素记住后一个元素, 后一个元素记住前一个元素. 这样的增删效率较高但查询时需要一个一个的遍历, 所以效率较低
    - 1.3.Vector:

    和ArrayList原理相同,底层也是维护了一个Object的数组实现的, 但Vector是线程安全的, 效率略低, , 考虑了线程安全问题, 所以效率略低

    • 2.Set:

    如果是实现了Set接口的集合类,具备特点: 无序,不可重复。

      - 2.1HashSet
    

    底层是使用了哈希表来支持的,特点: 存取速度快.
    hashSet的实现原理:
    往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 ,然后通过元素 的哈希值经过移位等运算,就可以算出该元素在哈希表中 的存储位置。
    情况1: 如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。
    情况2: 如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法与该位置的元素再比较一次,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素运行 添加。

      - 2.2TreeSet
    

    TreeSet低城是使用红黑树(二叉树)数据结构实现的,存储规则:左小到右,
    TreeSet要注意的事项:
    (1). 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
    (2). 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素的比较规则定义在compareTo(T o)方法上。
    (3). 如果比较元素的时候,compareTo方法返回 的是0,那么该元素就被视为重复元素,不允许添加.(注意:TreeSet与HashCode、equals方法是没有任何关系。)
    (4). 往TreeSet添加元素的时候, 如果元素本身没有具备自然顺序 的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。
    (5). 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口, 在创建TreeSet对象的时候也传入了比较器那么是以比较器的比较规则优先使用。
    自定义定义比较器: 自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在compare方法内即可。
    自定义比较器的格式 :

    } ```
    注意:TreeSet可对String排序(有默认顺序), 
    字符串的比较规则:
    情况一: 对应位置有不同的字符出现, 就比较的就是对应位置不同的字符。
    情况 二:对应位置上 的字符都一样,比较的就是字符串的长度。
    推荐使用:使用比较器(Comparator)。 
          - 2.3LinkedHashSet
    
      - Map: 键值对
          - HashMap
          - TreeMap
          - HashTable
          - LinkedHashMap
    
    - Collection接口
    >Collection是单例集合的跟接口,一个Collection代表一组Object,即Collection的元素(Elements)。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。
    
    - Map接口
    
    - Iterator迭代器
    >主要用于遍历集合对象,Jdk1.5之后添加的新接口, Collection的父接口. 实现了Iterable接口的类就是可迭代的.并且支持增强for循环。该接口只有一个方法即获取迭代器的方法iterator()可以获取每个容器自身的迭代器Iterator。(Collection)集合容器都需要获取迭代器(Iterator)于是在5.0后又进行了抽取将获取容器迭代器的iterator()方法放入到了Iterable接口中。Collection接口进程了Iterable,所以Collection体系都具备获取自身迭代器的方法,只不过每个子类集合都进行了重写(因为数据结构不同)
    
       - Iterator接口定义的方法 
    >Itreator   该接口是集合的迭代器接口类
    
    定义了常见的迭代方法
    
    
    1:boolean hasNext()
    

    判断集合中是否有元素,如果有元素可以迭代,就返回true。

    2: E next()  
    

    返回迭代的下一个元素,注意:如果没有下一个元素时,调用
    next元素会抛出NoSuchElementException

    3: voidremove()
    

    从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操

    作)。

      -  List特有的迭代器ListIterator
    >Iterator在迭代时,只能对元素进行获取(next())和删除(remove())的操作。
    对于Iterator 的子接口ListIterator在迭代list集合时,还可以对元素进行添加(add(obj)),修改set(obj)的操作。
    
    定义一下特有方法
    1. add(E e)    
    将指定的元素插入列表(可选操作)。该元素直接插入到返回的下一个元素的前面(如果有)
    
    2.void set(E o) 
    用指定元素替换 next或 previous返回的最后一个元素
    
    3.hasPrevious()    
    逆向遍历列表,列表迭代器有多个元素,则返回true。
    
    4.previous()       
    返回列表中的前一个元素。
    
    - 泛型

    相关文章

      网友评论

          本文标题:Jave集合的了解

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