集合的体系
------------| Collection 单列集合的根接口
-----------------| List 实现了List接口的结合类,具备的特点:有序,可重复
---------------------- | ArrayList ArrayList底层是维护了一个Object数组来实现的,特点:查询速度快、增删慢。
---------------------- | LinkedList LinkedList底层是使用了链表数据结构实现的。特点:查询速度慢,增删快。
---------------------- | Vector Vector类可以实现可增长的对象数组,底层也是维护了一个Object数组。
-----------------| Set 实现了Set接口的集合类,具备的特点:无序,不可重复
---------------------- | HashSet 底层是使用了哈希表来支持的,特点:存取速度快。
---------------------- | TreeSet 如果元素具备自然顺序的特性,那么会按照元素自然顺序的特性进行排序存储。
Set接口特有的方法
继承了collection的方法,没有特殊的方法。
HashSet类中的方法
add()、clear()、clone()、contains()、isEmpty()、iterator()、remove()、size()
也没有特殊的方法。
HashSet的实现原理:
往HashSet添加元素的时候,HashSet会先调用元素的hashcode方法得到元素的哈希值,然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置(注:哈希表的存储位置与内存地址区分开)。
情况1:如果算出的元素存储的位置目前没有任何元素存储,那么该元素可以直接到该位置上。
情况2:如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法(比较的内存地址)与该位置上的元素在比较一次,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素运行添加。
注:hashCode()方法默认情况下表示的是内存地址,String类已经重写了Object的HashCode方法了。
TreeSet
如果元素具备自然顺序的特性,那么会按照元素自然顺序的特性自动进行排序存储。
如果添加了没有可比性的元素会报错,因为TreeSet会自动帮我们排序。
TreeSet要注意的事项:
1、往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
2、往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素的类必须要实现Comparable接口,把元素的比较规则定义在compareTo(T o)方法上。
元素与元素之间的比较规则:compareTo(T o)方法返回负整数、零或正整数,表示此对象是小于、等于还是大于指定对象。
3、如果比较元素的时候,compareTo(T o)方法返回的是0,那么该元素就被视为重复元素,不允许添加。(注意:TreeSet与HashCode、equals方法是没有任何关系的。)
4、往TreeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现omparable接口,那么必须要在创建TreeSet的时候传入一个比较器。
如何自定义一个比较器:自定义一个类实现Comparator接口即可,把元素与元素之间的规则定义在compare方法内即可。
自定义比较器的格式:
class 类名 implements Comparator{
}
推荐使用:使用比较器(Comparator)
5、往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口,再创建TreeSet对象的时候也传入了比较器,那么是以比较器的比较规则优先使用。
TreeSet的存储原理:
底层是使用红黑树数(二叉树)据结构实现的
TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口。
字符串的比较规则:
情况一:可以找到对应不同的字符,比较的就是对应位置上的字符。
情况二:找不到对应不同的字符,比较的就是字符串的长度。