ychptz

什么是集合

集合框架:用于存储数据的容器。

集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。 任何集合框架都包含三大块内容:
对外的接口、接口的实现和对集合运算的算 法。

接口:表示集合的抽象数据类型。接口允许我们操作集合时不必关注具体实现, 从而达到“多态”。在面
向对象编程语言中,接口通常用来形成规范。

实现:集合接口的具体实现,是重用性很高的数据结构。

算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方 法,例如查找、排序
等。这些算法通常是多态的,因为相同的方法可以在同一个 接口被多个类实现时有不同的表现。事实
上,算法是可复用的函数。 它减少了程序设计的辛劳。
集合框架通过提供有用的数据结构和算法使你能集中注意力于你的程序的重要部 分上,而不是为了让程
序能正常运转而将注意力于底层设计上。
通过这些在无关API之间的简易的互用性,使你免除了为改编对象或转换代码以 便联合这些API而去写大量的代码。 它提高了程序速度和质量。

常用的集合类

Map接口和Collection接口是所有集合框架的父接口:

  1. Collection接口的子接口包括:Set接口和List接口
  2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、 ConcurrentHashMap以及Properties等
  3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
  4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等

集合的特点

对象封装数据,对象多了也需要存储。集合用于存储对象。
对象的个数确定可以使用数组,对象的个数不确定的可以用集合。因 为集合是可变长度的。

集合的作用

  1. 容量自增长;
  2. 提供了高性能的数据结构和算法,使编码更轻松,提高了程序速度和质量;
  3. 允许不同 API 之间的互操作,API之间可以来回传递集合;
  4. 可以方便地扩展或改写集合,提高代码复用性和可操作性。
  5. 通过使用JDK自带的集合类,可以降低代码维护和学习新API成本。

集合与数组的区别

数组是固定长度的;集合可变长度的。
数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存 储引用数据类型。

数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同 数据类型。

数据结构:就是容器中存储数据的方式。

对于集合容器,有很多种。因为每一个容器的自身特点不同,其实原理在于每个 容器的内部数据结构不
同。

集合容器在不断向上抽取过程中,出现了集合体系。在使用一个体系的原则:参 阅顶层内容。建立底层
对象。

集合框架底层数据结构

Collection:

List:

Arraylist: Object数组
Vector: Object数组
LinkedList: 双向循环链表

Set:

HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素
LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现
的。有点类似于我们之前说的LinkedHashMap 其内部是基 于 Hashmap 实现一样,不过还是有一点点区别的。
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树。)

Map

HashMap: JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主 体,链表则是主要
为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8以后
在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转 化为红黑树,
以减少搜索时间

LinkedHashMap:LinkedHashMap 继承自 HashMap,所以它的底层仍然是 基于拉链式散列结
构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面 结构的基础上,增加了一条双向
链表,使得上面的结构可以保持键值对的插入顺序。 同时通过对链表进行相应的操作,实现了访问
顺序相关逻辑。

HashTable: 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为 了解决哈希冲突而存在的
TreeMap: 红黑树(自平衡的排序二叉树)

LinkedHashSet:在添加数据的同时维护数据的添加顺序
效率要比HashSet略低一些。

TreeSet
排序规则:
要排序的对象的类必须实现Comparable接口

Set集合如何确保数据的不重复?
保证数据类型的类要重写hashCode和equals方法。

比较接口:
Comparable接口:自然排序,排序规则是固定。
Comparator接口:临时排序

Map接口:
1.存储对值K-V key-value
2.key不能重复,value是可以重复的
3.没有顺序(添加的先后顺序)

HashMap内部存储结构:
jdk1.7之前:链表 + 数组
jdk1.7及之后:链表 + 数组 + 红黑树

Properties:属性
Properties是Hashtable的子类,更多地是用来操作属性文件。

面试题: * HashMap基本上面试90%问原理!!!

  • 1.Collection和Map接口的区别

  • 2.ArrayList和LinkedList的区别

  • 3.ArrayList和Vector的区别

  • 4.List和Set的区别

  • 5.HashSet和LinkedHashSet的区别和联系

  • Hashtable和HashMap的区别

  • 1.HashMap是线程异步,线程不安全的,Hashtable是线程同步,线程安全

  • 2.HashMap的key是可以为null的,Hashtable是不可以为null

  • 线程安全问题:

  • 迭代器是依赖于集合而存在,在判断成功以后,集合中新增了元素,

  • 迭代器不知道,所以就报错

相关文章: