集合的使用场景
关注的是索引 list集合中的元素是有序 存放的。例如一个学生的成绩,成绩可以重复,就可以使用list集合来存取 。
list是一个有序,可重复的集合,有序是指集合里面存储的元素有放入顺序(即集合里面的元素可以通过下标来取出,支持使用for循环遍历),并且可以有重复元素,可以存入多个null元素。
list接口所有实现类中常用的有 ArrayList ,linkedlist。
ArrayList(底层是数组结构,元素是按照存储顺序给,0,1,2,3,4,5····下标,查询快,但是当在元素中删除或增加元素时,下标也会随之改变 例如当2元素被删除是,后面的元素会顶替上来元素3下标变为2,以此类推,牵一发二动全身,故而增删慢)。线程不安全,效率高。
linkedlist为双向链表结构,也可当作堆栈、队列、双端队列,更倾向于集合的增加和删除元素,元素的增删不会引起元素索引的改变,索引固定,故而更利于元素的增删。线程不安全,效率高。
关注的是唯一性,它的值不允许重复。例如每个班级的学生的学号,都不能重复,所以就使用Set集合来存取。
set是一个无序的,不可重复的集合。无序是指集合里所存储的元素不按存储顺序,而是以元素所对应的hashcode决定的,其位置是固定的。无法使用for循环遍历,可以使用迭代器(Iterator),增强for循环遍历。无重复元素,只能有一个null元素。
set接口的实现类中常用的有hashset linkedhashset 和 treeset。
hashset其底层其实是包装了一个HashMap去实现的。HashSet采用HashCode算法来存取集合中的元素,因此具有比较好的读取和查找性能。
不仅不能保证元素插入的顺序,而且在元素在以后的顺序中也可能变化(这是由于HashSet是按HashCode存储对象(元素)决定的,对象变化则可能导致HashCode变化)
LinkedHashSet是HashSet的一个子类,LinkedHashSet也根据HashCode的值来决定元素的存储位置,但同时它还用一个链表来维护元素的插入顺序,插入的时候即要计算hashCode又要维护链表,而遍历的时候只需要按链表来访问元素。
TreeSet实现了SortedSet接口,顾名思义这是一种排序的Set集合,查看jdk源码发现底层是用TreeMap实现的,本质上是一个红黑树原理。 正因为它是排序了的,所以相对HashSet来说,TreeSet提供了一些额外的按排序位置访问元素的方法,例如first(), last(), lower(), higher(), subSet(), headSet(), tailSet()。存储的类型必须一致,不能一下int ,一下又存String。
TreeSet的排序分两种类型,一种是自然排序(按照a,b,c,···;0,1,2,3···这样的排序),另一种是定制排序。
关注的是标识符(key)它将唯一的键映射到某个元素。例如每个班级的学生学号与姓名映射,每个学号对应一个学生,学号不能重复, 但学生的姓名有可能重复。
map集合提供了一种(key,value)映射的存储形式,每一个key对应一个value,key是唯一的,value可以重复。
主要实现类有hashmap ,linkedhashmap ,treemap。