java 中的集合:
Collection->List、Set
List->LinkedList 和ArrayList
Set->HashSet 、SortedSet->TreeSet
其中红色标注的是为接口:黑色的为实现类
Collection为集合中分的根接口,List是可以包含重复元素,有序的集合;提供按照索引的方式访问,有次序,位置不能改变;
Set 不可以包含重复元素,子接口 SortedSet是按照升序排列的Set;
实现类:
本质:ArrayList 可以看做是自动增长容量的数组,实际上是按照对象数组实现的,自动增长容量 就是当容量不够的时候,重新生成一个新的,足够长的数组;再将数组元素拷贝到新的元素中;
利用ArrayList.ToList()可以返回一个对象数组,也可以利用Arrays.AsList() 返回一个列表;返回固定尺寸的列表,就不能修改大小了,可以用set()方法修改其中的元素值,但是不能扩容;
Arrays.asList() 和ArrayList.toArray()作为数组和集合类的桥梁;
LinkedList
本质:是利用双向循环链表实现的,利用linkedList实现栈(Stack),队列(Queue)双向队列(double-end-queue);
LinkedList:
void addFirst(Object obj);
void addLast(Object obj);
Object getFirst();
Object getLast();
Object remove(int index);
boolean remove(Object obj);
Object removeFirst();
Object removeLast();
判断是否为空:
LinkedList继承了一个方法 isEmpty()如果没有包含任何元素,返回true f否则返回false;
ArrayList底层采取对象数组完成 ,而LinkedList采取双向链表实现;其中每个元素对象除了本身数据以外还有两个引用,分别指向前一个元素和后一个元素;如果我们经常在List前面或者中间插入或者删除元素,则用LinkedList比较好,否则用ArrayList较为迅速;因为删除和添加元素都要修改其后面的索引;
HashSet是一个实现了Set接口的hash table(哈希表);依靠hash map实现;应该要为存储到各个散列表的每个元素指定hashcode()和equals();
因为实现了set接口,所以不能有重复元素;
散列表介绍:散列表又叫哈希表,基本思想为以节点的关键字为自变量,通过一定的函数关系(散列函数)计算出对应的函数值,以这个值作为该节点存储在散列表中的地址。
当散列表的元素存储太满,就必须进行再散列,将产生一个新的散列表。将所有元素存到新的散列表中,原先旧的散列表将被删除;
在Java中,通过负载因子(load factor)来决定何时对散列表进行再散列。例如:如果负载因子为0.75,当散列表中75% 的的位置上已经放满,将进行再散列;
负载因子越高(越接近1.0),内存的使用率越高,元素的寻找时间越长,
负载因子越高(越接近0.0),元素的寻找时间越短,内存浪费越多。
HashSet的缺省负载因子为0.75
TreeSet 是依靠TreeMap实现的,TreeSet是一个有序集合,TreeSet中将元素按照升序排列,缺省是按照自然排序排列,意味TreeSet要实现Comparable、接口。
Map(HashMap)-> SortedMap(TreeMap)
存储的是Key-Vaulue键值对,不能包含重复的key ,但是可以包含重复的Value,TreeSet是按照Key升序排列的Map