Java集合框架体系详细梳理,含面试知识点。(一)

217 阅读5分钟

一、集合类

集合的由来:
  面向对象语言对事物都是以对象的形式来体现,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式。
集合特点:
1,用于存储对象的容器。(容器本身就是一个对象,存在于堆内存中,里面存的是对象的地址)
2,集合的长度是可变的。
3,集合中不可以存储基本数据类型值。 (只能存对象)

小问题:想用集合存基本数据类型怎么办?

装箱、拆箱。  例:al.add(5); // 相当于al.add(new Integer(5));

集合和数组的区别:
  数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。
  数组中可以存储基本数据类型,集合只能存储对象。
集合框架的构成及分类:(虚线为接口)

image
image

下面分别整理集合框架中的几个顶层接口。

二、 Collection接口

Collection子接口以及常用实现类:

Collection接口
  |--List接口:
有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。
    |--Vector:内部是 ***数****组 *数据结构,是同步的。增删,查询都很慢!100%延长(几乎不用了)
    |--ArrayList:内部是

数组
数据结构,是不同步的。替代了Vector,查询的速度快,增删速度慢。50%延长。
(查询时是从容器的第一个元素往后找,由于数组的内存空间是连续的,所以查询快;增删的话所有元素内存地址都要改变,所以增删慢。)

    |--LinkedList:内部是
链表
数据结构,是不同步的。
增删元素的速度很快。
(同理,链表的内存空间是不连续的,所以查询慢;增删时只需改变单个指针的指向,所以快;)

  |--Set接口:无序,元素不能重复。Set接口中的方法和Collection一致。
    |--HashSet: 内部数据结构是
哈希表
,是不同步的。
      |--LinkedHashSet:内部数据结构是哈希表和链表,是有顺序的HashSet。
    |--TreeSet:内部数据结构是有序的
二叉树,
它的作用是提供有序的Set集合,是不同步的。
List接口:
  有一个最大的共性特点就是都可以操作角标,所以LinkedList也是有索引的。list集合可以完成对元素的增删改查。
Set和List的区别:
  1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素 <最本质区别>
  2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 。
  3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 。
ArryList和Vector可变长度数组的原理:
  当默认长度的数组不够存储时,会建立一个新数组。将原来数组的内容拷贝到新的数组当中,并将新增加的元素追加到拷贝完的数组尾,如果仍然不够重复上述动作。其中,ArryList的增加是以原来50%长度进行增加,而Vector是按照100%延长。
ArryList是线程不安全的,Vector是安全的:
由于是否有锁的判断将影响效率,故Arrylist效率远远高于Vector。
而且只要是常用的容器就不是同步的,因为同步效率比较低。

HashSet之覆盖hashCode方法和equals方法来保证元素唯一性

如何保证HashSet的元素唯一性呢?
  是通过对象的hashCode和equals方法来完成对象唯一性的:
    ->如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
    ->如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true:
      如果为true,视为相同元素,不存;如果为false,那么视为不同元素,就进行存储。

记住:如果对象要存储到HashSet集合中,该对象必须覆盖hashCode方法和equals方法。
  一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法,以建立对象判断是否相同的依据。

TreeSet之判断元素唯一性的两种方式(如何排序)

TreeSet默认判断元素唯一性的方式:
  根据Conpare接口的比较方法conpareTo的返回结果是否是0,是0,就是相同元素,不存。

下面,我们给出两种自定义判断元素唯一性的方式:
方式一:
  让元素自身具备比较功能,即根据元素中的属性来比较。采用这种方式需要元素

实现Comparable接口
覆盖compareTo方法

方式二:
(开发用这个,掌握比较器的用法)

  让集合自身具备比较功能。自己写一个

比较器
,先定义一个类实现Comparator接口,覆盖compare方法。然后将该类对象作为参数传递给TreeSet集合的构造函数。
  不再需要元素实现Conparable接口。

思考:

如何通过这种方式实现先进先出和先进后出?

让比较器直接返回1或-1即可。

欢迎加入学习交流群569772982,大家一起学习交流。