linkedList:链表 每次查找一个元素都要从头部开始重新搜索,LinkedList对象不做任何缓存位置信息的操作.get()做了微小的优化,如果索引大于size(/2)
就从列表尾端开始搜索元素.
Java中,散列表用链表数组实现.每个列表称为桶.
查表中对象的位置,先计算它的散列码,与桶总数取余,所得结果就是保存这个元素的桶的索引.
如果这个桶被没有其他元素,就可以直接将元素插入桶中. 如果散列冲突(桶占满),这时需要用新对象与桶中的所有对象进行比较,查看这个对象是否已经存在.
如果散列码是合理且随机分布的,桶的数目也足够大,需要比较的次数就会很少.
想更多的控制散列表的运行性能,就要指定一个初始的桶数.
如果散列表太满,就需要再散列.如果对散列表再散列,就需要创建一个桶数更多的表,并将所有元素插入到这个新表中,然后丢弃原来的表.
填装因子(load factor)决定何时对散列表进行再散列.
如果填装因子为0.75(默认值),而表中超过75%的位置已经填入元素,这个表就会用双倍的桶数自动的进行再散列.
散列表可以用于实现几个重要的数据结构,如set类型.
equals与hashCode的定义必须兼容, 如果x.equals(y) 为true,x.hashCode()必须等于y.hashCode()
TreeSet类与散列集十分类似. 排序是由红黑树完成的.如果数中包含n个元素,查找新元素的位置平均需要log2n次比较.
两种方式:
1.需要排序的对象实现Comparable接口,重新compareto方法.
2.实现comparable接口有局限性. 将Comparator对象传给TreeSet构造器(可使用匿名内部类).重新compare方法.
队列可以有效的在尾部添加一个元素,头部删除一个元素.
双端队列可以有效的让人在头尾同时添加或删除元素.不支持在队列中间添加元素.
Queue接口,实现类有ArrayList和ArrayQueue类.这两个类都提供了双端队列.
优先级队列(PriorityQueue)中的元素可以按照任意顺序插入,却总是按照排序的顺序进行检索.与TreeSet一样,可以使用实现了Comparable接口的类,或者构造器中提供比较器的对象.
优先级队列使用的数据结构:堆.
堆是一个可以自我调整的二叉树,对树执行添加和删除操作,可以让最小的元素移动到根,而不必花费时间对元素进行排序.
典型示例是任务调度.每一个任务有一个优先级,任务以随机顺序添加到队列中.每当启动一个新任务时候,都将优先级最高的任务从队列中删除.(习惯将1设为最高优先级,所以会将最小的元素删除)