Collection
List(列表)
特点:
1,有序(存储元素的顺序和取出元素的顺序一致)
2,该集合中的元素都有索引,所以可以通过索引(角标)来访问元素。
3,它可以存储重复元素。
常见子类对象:记住:具体的子类对象,我们要学习应该是该对象的特有的数据结构,以及相关的特点。
Vector:jdk1.0就存在了,底层是数组结构的,可变长度数组。原理:一旦原数组长度不够,会创建新数组将原数组的元素复制到新数组中,并将新元素添加到新数组中。Vector是同步的。
ArrayList:底层是数组结构,也是支持长度可变数组的,是不同步的。替代了Vector.因为效率高。 查询效率很高。 但是增删的效率很低。
LinkedList:底层是链接列表结构,简称链表结构。是不同步的。这个中结构的好处:对元素的增删非常效很高。 查询的效率很低。
Set****(集)
中的方法和Collection一致,只要重点注意它的子类对象即可。取出元素只能使用迭代器。
特点:
1,不可包含重复元素。(最大的特点)
2,这个集合存入元素的顺序和取出元素的顺序不一定一致。(具体的容器对象数据结构不同,顺序也有不同)
HashSet:底层数据结构是哈希表,不保证顺序,是不同步的。
哈希表:提供数组的查询效率而出现的。
将要存储的元素先通过哈希算法算出一个哈希值来标识存储的位置,代表着元素。要找元素时,先该元素通过哈希算法算出哈希值,在通过哈希值到哈希表中去查找。
特点:
1,不关系元素的顺序。
2,提高了查询效率。
3,不可能出现重复元素,因为哈希值都不同。即使相同,会再次判断两个元素的equals,内容是否相同。
如果内容也相同,不存,如果内容不同,存储。
所以哈希表要保证元素的唯一性,必须要依赖于两个方法。
1,hashCode
2,equals
TreeSet:可以给Set集合中的元素进行指定顺序的排序,非同步的。 默认情况下,是通过元素的自然顺序的序。它保证元素唯一性的依据是看比较方法的返回结果是否是0.是0.就视为元素相同。不存。
TreeSet排序的方式一:让元素自身具备比较性,需要实现Comparable接口,覆盖compareTo方法。
这种比较方式成为自然顺序排序。
如果元素自身不具备比较性或者具备的比较性(自然顺序)不是所需要的,这时只能用第二种方式 。
TreeSet排序的方式二:让容器自身具备比较性。容器一初始化就具备了比较功能。因为容器时在对构造时完成的。通过查阅,有一个构造方法TreeSet(Comparator),在容器初始化时可以指定一个比较 器。 需要实现Comparator接口,覆盖compare方法即可。所以这种方式成为比较器排序。
如抉择:
当存入的的对象有重复时,用List,没有重复元素时,用Set。