Java中数组、集合、链表、队列的数据结构和优缺点和他们之间的区别数组
集合与数组的区别
我的分类: Java基础
相同点:数组和集合类同是容器。
不一样点 :1.数组的长度是固定的,集合的长度是可变的。
2.数组只能存储同类型的对象,集合能够存储不一样类型的对象。
3.集合只能存储对象不能存储基本类型安全
数组:
.长度固定
.能够存储基本类型,也能够存储引用类型
.存储元素类型一致
数组能够在内存中连续存储多个元素的构造,在内存中的分配也是连续的
数组中的元素经过数组的下标进行访问的,下标从0开始的
优势 :
按照索引查询元素速度快
按照索引遍历数组方便
缺点:
数组的大小固定后就不能扩容了
数组只能存储一种类型的数据
添加,删除的操做慢,由于要移动其余的元素
适用场景:
频繁查询,对存储空间要求不大,不多增长和删除的状况数据结构
集合:
特色
长度可变
只能够存储引用类型
能够存储多种类型函数
List:有序、能够有重复的集合
List 接口的三个典型实现:
①、List list1 = new ArrayList();
底层数据结构是数组,查询快,增删慢;线程不安全,效率高
②、List list2 = new Vector();
底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合
③、List list3 = new LinkedList();
底层数据结构是链表,查询慢,增删快;线程不安全,效率高
Set
HashSet:要保证元素惟一性,须要覆盖掉Object中的equals和hashCode方法(由于底层是经过这两个方法来判断两个元素是不是同一个)。线程
**TreeSet:**以二叉树的结构对元素进行存储,能够对元素进行排序。
排序的两种方式:
一、元素自身具有比较功能,元素实现Comparable接口,覆盖compareTo方法。
二、创建一个比较器对象,该对象实现Comparator接口,覆盖compare方法,并将该对象做为参数传给TreeSet的构造函数(能够用匿名内部类)。
Map接口其特色是:元素是成对出现的,以键和值的形式体现出来,键要保证惟一性:经常使用类有:HashMap,Hashtable ,TreeMap。
HashMap:线程不安全等的,容许存放null键null值。
Hashtable:线程安全的,不容许存放null键null值。
TreeMap:能够对键进行排序(要实现排序方法同TreeSet)。指针
链表:
经过一个链子把多个结点(元素)链接起来,由数据和地址组成的一个元素,
节点自己必须有一个地址值(就是下一个元素的地址值)
优势:
链表是很经常使用的一种数据结构,不须要初始化容量,
能够任意加减元素;
添加或者删除元素时只须要改变先后两个元素结点的指针域指向地址便可,
因此添加,删除很快;
缺点:
由于含有大量的指针域,占用空间较大;
查找元素须要遍历链表来查找,
很是耗时。
适用场景:
数据量较小,须要频繁增长,删除操做的场景对象
队列:
是一种先进先出的数据构造,也是运算受限制的线性表,只能够在对头删除元素,在队尾插入元素
线性表是同一类型数据的一个有限序列
元素之间的前后排列次序蕴涵着其线性关系。线性表中的第一个元素a1称为表头元素,an称为表尾元素
队列能够分为顺序队列和链式队列,根据不一样的存储方式,定义的结构也不一样。
顺序队列包含一个数组成员,有二端包含一个数组成员 咱们把删除一端叫头
插入一端叫尾
连接存储的有序线性表类须要继承连接线性表类LinkList和实现有序线性表接口SortedList排序
区别:
1.占用的内存空间
链表存放的内存空间能够是连续的,也能够是不连续的,数组则是连续的一段内存空间。通常状况下存放相同多的数据数组占用较小的内存,而链表还须要存放其前驱和后继的空间。
2.长度的可变性
链表的长度是按实际须要能够伸缩的,而数组的长度是在定义时要给定的,若是存放的数据个数超过了数组的初始大小,则会出现溢出现象。
3.对数据的访问
链表方便数据的移动而访问数据比较麻烦;数组访问数据很快捷而移动数据比较麻烦。
链表和数组的差别决定了它们的不一样使用场景,若是须要不少对数据的访问,则适合使用数组;若是须要对数据进行不少移位操做,则设和使用链表。继承