集合(一)

1.链表

   有序排序的容器:LinkedList

 数组是将对象的引用放在连续的存储位子中,而链表则将每个对象存放在独立的节点中,每个节点中还存放着序列中下一个节点的引用,也存放着上一个节点的引用。

LinkedList.add()用于将对象添加到列表的尾部,但你有时候肯那个需要把元素插入到列表中的某个位置,这种依赖于位置的add()是由迭代器负责的,因为迭代器描述的是集合中的位置,使用迭代器来添加元素的方法,只对于由自然顺序的集合才由实际意义。

remove方法之前一定要调用一次next方法,不然出java.lang.IllegalStateException。

remove方法将除掉迭代器左边的那个元素,但是,如果调用的是previous方法,那么移除的是迭代器右边的元素!

2.散列集 HashSet 

      散列码是用hashCode()方法取得的任何整数。取得元素的索引的方式是,先取它的散列码,再将它减去以散列表元为模数的值。当找到其索引,当试图放入元素的时候,假如这个表元上已经有元素,这种现象称为散列冲突。 这时必须将新对象和该列表中的所有对象进行比较,查看该元素是否已存在与该列表!

      假如你大致知道散列表最终会有多少个元素,那么就可以设定散列表元的数量了,一般设置为元素数量的75%到125%之间,当元素放得太满得时候就必须再散列。加载因子将决定合适要对散列表进行再散列,假如加载因子是0.75(默认值),而散列表中超过75%,那就进行再散列,表元数量为原先的两倍。

      HashSet重写了Contains(),它只检查某个表元的所有元素!它数据结构,无法控制元素出现的顺序,迭代时候的顺序跟你插入元素的数据是不一样的!

3. 树集 TreeSet

    它是一个有序集合,不管你按照什么顺序插入,它迭代的时候的顺序是一致的。将一个元素放到树级中的速度比放入散列表中要慢,但是比那些放入数组,链表上是要快的。如果树集中有n个元素,平均要运行log2 n,假如有1000个元素,那么要运行10次比较。

4. 优先级队列 PriorityQueue

    当调用add()和remove()方法的时候,会使最小的元素移到树根,用remove()会把集合中最小的元素移除掉的。但,它不对元素的全部进行排序,而是用一种叫堆的数据结构。

5. 映射表 HashMap  TreeMap

   HashMap是散列映射表,对键进行散列,不对元素散列。

   TreeMap是树状映射表,对键进行排序,不对元素排序。

6. 试图和包装器

   试图:比如,Map的keySet()方法返回的是一个实现Set接口的类的对象,同时该类的各个方法对源映射文件进行操作,这种集合叫做试图。也比如Arrays.asList(Object[] o);

   可以调用get,set方法访问底层数组,但是调用那些改变数组大小的方法就跑出异常,例如,remove,add。

7.算法

  二分查找

      假如,这个数组是排序好的,那么检查数组中间的元素,假如比要找的元素小,则继续在下半部分数组中继续分割继续比较!这就是为什么调用sort方法之前要排序的原因了,到了今天我才名字这是为什么了 !^_^!

      采用随即访问方式才能使二分查找变得有意义,假如为了检查中间的元素而用迭代到中间元素,那就失去了二分查询法的优势!因此,对于链表的查找,BinalySerach算法变成了线性查找。

 

  

 

点赞