数据结构 与 Array list set map


一。数据结构分为两类: a. 逻辑结构(元素之间关系) b. 物理结构 (存储形式)
逻辑结构: 数据对象中数据元素之间的相互关系。
物理结构: 数据的逻辑结构在计算机中的存储形式。

a。逻辑结构:
1. 集合结构: 集合中的元素同属于一个集合外,没有别的不三不四的关系。
2. 线性结构: 线性结构中的元素是一对一的关系。 数组 字符串(字符的线性表)
3. 树形结构: 树形结构的元素存在一种一对多的层次关系。
4. 图形结构: 图形结构的元素存在着对多对的关系。

b。物理结构:
1.顺序存储结构:
数据元素放在地址连续的存储单元中,其数据之间的逻辑关系和物理关系是一致的。数组 ArrayList

2.链式结构:
LinkedList
通过实例了解链式结构: 现在如银行,医院都设置了排队系统。每个人去了都会领到1个号,等着叫号。叫你的时候你可以去办理业务。等待的时候,你可以去任何地方,只要叫到你的时候,你来就可以了。你这里关注的是你前面的那个号码。链式结构就是这样的,比顺序结构灵活。

链式存储结构: 将数据存放在任意的存储单元,这组存储单元可以是连续的,也可以是不连续的。链式存储结构的数据元素,存储结构不能反映其逻辑关系。可以使用指针来保存数据元素的地址,通过地址找到数据元素的位置。

二、数组和集合(Array  list  set map)

list:列表
rrayList和LinkedList都是实现了List接口的容器类,用于存储一系列的对象引用。他们都可以对元素的增删改查进行操作。

ArrayList,它在集合的末尾增删元素所用的时间是一致的,但是在列表中间的部分添加或删除时所用时间就会大大增加。但是它在根据索引查找元素的时候速度很快。即:末尾增删快,查询快

LinkedList则相反,它在插入、删除集合中任何位置的元素所花费的时间都是一样的,但是它根据索引查询一个元素的时候却比较慢。即:任意位置增删快

ArrayList和LinkedList的大致区别:

1.ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。

2.对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。

3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。

他们在性能上的有缺点:

1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对 ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。

2.在ArrayList集合中添加或者删除一个元素时,当前的列表所所有的元素都会被移动。而LinkedList集合中添加或者删除一个元素的开销是固定的。

3.LinkedList集合不支持 高效的随机随机访问(RandomAccess),因为可能产生二次项的行为。

4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间所以在我们进行对元素的增删查操作的时候,进行查操作时用ArrayList,进行增删操作的时候最好用LinkedList。

总结:增删最好LinkedList
查改最好+末尾增删 ArrayList

set:集合(元素不重复)
HashSet:底层是哈希表,线程不安全,无序,高效,元素唯一
TreeSet:底层是二叉树,有序,线程不安全
LinkedHashSet:有序

数组  list 和set使用总结:

若长度固定、元素一致,选择数组

否则:
若元素可以重复,选择list
一般选择ArrayList(通用),
若没有频繁的删除插入操作,优先选择ArrayList;
若元素需要频繁插入、删除时,选择LinkedList,
若在多线程条件下使用,考虑Vector;

若表中元素唯一,选择set
若需存取效率比较高的set,选择hashSet;
若需自动给元素排序的set,选择treeSet,
若需元素按插入的样子保持顺序,选择LinkedHashSet。

map:映射
Map特点:Map一次存一对元素
Hashtable:底层是哈希表,线程安全(synchronized),键和值均不可为null

HashMap:底层是数组+链表(key-value保存在一个Entry中,Entry为单向链表结构,通过key算出hash值,hash值即数组下标可得Entry,如果Entry这个链表不止一个则遍历这个链表),使用哈希算法,线程不安全,键值可为null;多线程可使用ConcurrentHashMap 线程安全的
性能影响因素:初始容量(即HashMap数组的初始化容量大小)和加载因子(用以判断HashMap是否扩容,当前数组大小 >= 当前容量*加载因子)。加载因子默认0.75,过大则冲突增加,链表加长,查询效率降低;过小则空间浪费
PS:Hash地址的产生用位运算,这样效率较高

TreeMap:底层是二叉树,可排序

猜你喜欢

转载自www.cnblogs.com/ynhk/p/10983427.html