集合1

来源:互联网 发布:中国报告大厅数据库 编辑:程序博客网 时间:2024/05/02 00:42

 

上面为集合框架图,

首先看List,它有LinkedList和ArrayList,前者在它的底层是通过一个双向循环链表实现的,可以通过看它的底层代码,而ArrayList是通过数组来实现的,首先从它的构造方法去进行了解,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组 如果增加的元素个数超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新数组当中。当新数组无法容纳增加的元素时,重复该过程。 对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价比较高。集合当中只能放置对象的引用,无法放置原生数据类型,我们需要使用原生数据类型的包装类才能加入到集合当中。集合当中放置的都是Object类型,因此取出来的也是Object类型,那么必须要使用强制类型转换将其转换为真正的类型(放置进去的类型)。

遍历ArrayList的方法,一个是用它的get(i)方法,另外一个就是用toArray()将它转换为数组,然后再用数组的方式去对它进行遍历.

Linkedlist并不是有序的,它只是用链表来进行维护它里面的元素,结构类似于:

class Node{

   Node pre;

   Object data;

   Node next;

}

真正的结构是:

Entry
{
   Entry previous;
   Object element;
   Entry next;
}

其中的Object类型的元素element就是我们向LinkedList中所添加的元素,然后Entry又构造好了向前与向后的引用previous、next,最后将生成的这个Entry对象加入到了链表当中。换句话说,LinkedList中所维护的是一个个的Entry对象。

然后就是对Set中的HashSet和TreeSet进行说明

当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hash code值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。实际上hashcode就是类似于一个对象的内存地址.
如果我们重写equals方法,那么也要重写hashCode方法,反之亦然。

对于TreeSet,这是一个排序的Set,当向它插入一个引用类型的对象时,因为它的底层是排序了的,所以直接插入是会出错的,会出现ClassCastException,因为这个对象没有排序的规则,它不知道怎么插入,所以这个对象可以实现Comparelable接口,或者我们自己写一个比较器实现Comparator这个接口,在这里进行排序规则的定义,当用TreeSet时,那么就要用它的TreeSet(Comparator  comparator)这个构造方法去进行构造.

 

注意一点的是:Collection是个接口,java.util中还有一个Collections类它里面有一些很有用的方法.

原创粉丝点击