在实际开发当中List用到的很多,在面试中也经常遇到,之前去CCTV大厦附近的一公司去面试,问的最多的还是集合框架。今天小白详细记录List的部分知识。其实集合框架你只要记得下面的这张图就很容易理解了。
上面的这些都是接口,其中Set接口有下面有HashSet,有接口SortedSet,SortedSet有实现类TreeSet。List下面有最常用的实现类ArrayList和LinkedList。Map下面有SortedMap这个子接口还有最常用的实现类HashMap。大概结构就是这样了。
List下面有两个实现类,ArrayList和LinkedList。
ArrayList看名字就是一个数组集合。很快就能想得到其底层就是一个Array,因为集合框架实现的是对Object 的操作,所以在Arraylist上的操作是对Object的操作这点毋庸置疑。当你看api和源码的时候你就会发现ArrayList的底层其实维护的是一个长度为10的数组,这是在new ArrayList()的时候默认生成的。当你的容量不够用的时候会进行扩容,数组有一个arraycopy的方法对数组进行复制,在添加的容量不够的时候进行扩容,扩容的规则是当前数组长度的(1.5倍+1),为什么是1.5而不是2倍啊,3倍啊,我觉得这是一个经验值,也是为了节省空间。但是当你看api的时候你会发现ArrayList的构造方法有三个其中有一个是new ArrayList(int length)也就是说我们可以自定义ArrayList的长度。
LinkedList虽然和ArrayList的用法差不多,但是其底层实现完全不一样,LinkedList的底层实现是一个双向链表,查看源码会看到其实LinkedList的实现是维护了一个Entry对象,在Entry对象内部包含一个前驱,一个后继,还有就是需要添加的对象,
表面上:
LinkedList linkedlist = new LinkedList();
linkedlist.add(“AAA”);
底层实现原理:
Entry{
Entry previous;
Object element;
Entry next;
}
Entry entry = new Entry();
entry.element=”AAA”;
list.add(entry);
上面就很清楚的看到LinkedList的实现原理。实现对于List的遍历,我们可以使用for循环,但我们可以使用迭代器实现,为什么List和Set里面都可以使用迭代器呢?原因就在
API中Collection的定义:
· public interface Collection<E> extends Iterable<E>而 List
· public interface List<E> extends Collection<E>
这就很容易理解List的迭代了。
至于List中最常用也最常被容易问道的就是上面的问题。