- 数组:在内存中存放一段连续的数据,所以删除和增加数据时会移动大量的数据,增加删除会很慢,数组可以通过下标快速的找到数据,所以查询就很快(查询数据快,增加和删除数据很慢)
- 单项链表:在内存中存放的数据可以是连续的也可以是不连续的(结构就像是链条),每节点存放这两个数据,一是数据的,二是指向下一个节点的指针。如果想要查询一个数据只能从头开始遍历,(查询数据慢,增加和删除快)
- 双向链表:是单向链表的改进,它每个节点存放这2个地址指针,一个指向前一个节点,一个指向后要一个节点,所以它在查询数据的时候可以从任意位置开始查询(每个节点存放的数据多,占用内存比单项链表大)
常用的数据结构
- ArrayList 数组实现,查询快增删慢,线程不安全,new ArrayList时有初始容量10 ,每次添加元素的时候会判断是否需要扩容,每次扩容1.5倍
- LinkedList 双向链表实现,查询慢,增删快,线程不安全
- HashMap JDK1.8之前数组和链表,1.8之后引入了红黑树,工作原理:put()通过对key进行hash运算确定元素在数组中的位置,如果不同的key在计算之后得到的hash值相同,就会创建单项链表来存储相同索引key的数据,当这个链表元素大于8就会引入红黑树提升效率,get()获取数据时调用key的equals()查找值
- LinkHashMap 继承自HashMap,通过双向链表维护元素的顺序,可以是访问顺序也可以是插入顺序
- TreeMap 基于红黑树实现的排序Map,默认按照keys的自然排序排列
- HashSet HashSet内部是使用HashMap来实现的元素存储,特点:无序、不允许元素重复。利用了hashmap的key不会重复的特性来实现元素的唯一性
- TreeSet 使用的TreeMap来实现的元素存储。同样是以存储的元素作为TreeMap的key,所以元素也是不能重复的。另外因为TreeMap的key是有序的,所以TreeSet是一个有序的集合