美文网首页
Java集合

Java集合

作者: HamletSunS | 来源:发表于2019-07-27 11:49 被阅读0次

    首先需要明确的是接口只是定义了方法的标准与规范,父类才决定了具体的底层实现

    数组的局限性

    定长,数组索引越界(ArrayIndexOutOfBoundsException)运行时异常

    解决方案
    使用vector或ArrayList替代,可以变长,其中vector是线程安全的,ArrayList是线程不安全的 -- 相关知识:多线程

    ArrayList常见的使用方法
    增删改查:
    add()

    • 只有元素,加在最后
    • 有索引,元素。插入在指定位置
      remove() --有重载,参数为int时是索引,返回删除的对象;参数为具体对象时,返回的是bool值表示删除是否成功

    set()
    get()
    其他方法:toArray --变成数组 addAll--与其他容器合并 size()
    clear()
    contains()

    ArrayList 与 List

    List是接口,ArrayList是实现了接口List的一个实现类

    ArrayList与泛型(Generic)

    默认元素类型是Object类型,可以是任何类型的元素,但是取元素的时候需要转换,当元素类型不一致时,会造成不知道要转成什么类型(当前元素显示的类型是Object,但实际上可能指向的是其他类型),因此引入了泛型---相关知识点,泛型

    ArrayList的遍历

    1. for循环
      借助size()方法获取长度,用get()方法遍历所有
    2. Iterator迭代器遍历
      arrobj.iterator()返回迭代器

    LinkedList

    首先要明确的是,ArrayList是用数组(顺序表)这个数据结构实现的,而LinkedList是用链表这个数据结构实现的。
    同ArrayList一样,实现了List接口,大多数方法是相同的,但有一些有区别的地方。LinkedList除了实现List接口外,还实现了Deque接口(双向队列这个数据结构),可以方便的对头尾元素进行操作。另外值得一提的是Deque这个接口又继承自Queue(队列)这个接口。
    另外,底层实现是由继承的父类决定的。实现的接口只是统一了方法名。
    注意区分一下:
    数组和链表是从存储结构进行的区分。
    队列、线性表是从逻辑结构进行的区分。

    Deque接口中的方法
    addFirst
    addLast
    getFirst
    getLast
    removeFirst -- 返回元素,并在集合中删除该元素
    removeLast -- 返回元素,并在集合中删除该元素
    Queue接口中的方法
    offer --入队
    poll --出对
    peek --查看队首元素

    HashMap

    常用方法
    get --返回当前值
    put(生疏点) --插入新元素,并返回插入元素的key之前对应的值
    key不能一样,一样的话会更新key对应的值
    value可以一样

    遍历(生疏点)
    keySet()
    key集合
    valueSet()
    值集合
    entrySet()
    键值对集合

    Collection

    Collection是一个接口,List,Set,Deque(继承的是Queue接口),Queue接口都继承自它。它与Map接口没关系,Map接口定义的方法是按照键值对来的,而Collection是按照单个对象来的

    Collections

    Collections是一个工具类(注意与接口Collection区分)
    该工具类提供的方法

    • reverse()
    • shuffle()
    • sort()
    • swap(arr,1,2)
    • rotate(arr,2)
    • synchronizedList(arr) 线程安全化

    ArrayList和HashSet的区别

    有序 与 无序
    可重复 与 不可重复
    数组实现 和 哈希表实现

    ArrayList 和 LinkedList 性能对比

    最根本的不同是底层实现的数据结构的不同,一个是数组,一个是链表。
    当插入和删除时LinkdedList性能更好
    当修改和定位时ArrayList性能更好

    HashMap和HashTable的区别

    2个区别:
    前者可以把key设为null,后者不行
    前者线程不安全,后者安全

    HashSet LinkedHashSet TreeSet区别

    不同点在于顺序性,相同点在于都不可重复
    顺序性:依次是无需、按照插入顺序、按照value大小

    hashcode原理

    hashcode
    每个Java对象都有一个与之对应的hashcode(散列值),当使用哈希表的底层数据结构时,会根据当前对象的hashcode去计算其在哈希表中存储的位置,这样查找的效率就相当于是数组结构的定位操作,效率很快。缺点是空间复杂度比较高,需要专门维护一个哈希表(空间冗余)。
    HashSet判断是否重复
    先通过当前对象的hashcode值计算在散列表中的位置,若该位置没元素,则不重复。
    若有元素,再通过euqals去比较,再看是否重复

    集合比较器 Comparator和Comparable

    二者均是接口
    Comparator接口由一个单独的子类去实现,作为Collections工具类sort方法的一个参数去传入
    Comparable接口由要比较的集合元素本身去实现,此时Collections工具类sort方法可以直接对原本不可比较的集合元素进行比较
    覆写的比较方法 返回值为int,>0说明前者或者自身逻辑大
    重难点解析:
    编写比较函数的时候往往会混淆到底是哪个元素更大
    我的思路是

    1. 首先明确工具类的排序顺序是从逻辑小 排到 逻辑大的
    2. 编写接口中的比较函数的时候,若返回int值大于等于0,说明前者或者自身的元素逻辑大,否则代表前者或者自身的元素逻辑小(因为是两个接口,一个接口的比较函数是2个参数,一个接口仅有一个参数)

    相关文章

      网友评论

          本文标题:Java集合

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