java集合
一. Collection接口
小编新手,java才开始学,各路大神多多指正,感激不尽。
首先上一张图吧,这张图截自一位博主大神,这张图可以将java集合框架及其内部元素间的关系清晰地呈现出来。
这里需要注意的是,Collection提供一个接口,List和set两个接口都继承它,但是Map并不直接继承Collection。
其实Collection接口也是继承自另一个接口,叫迭代接口Iterable。
我们可以在eclipse中产看Collection向上继承和向下扩展的一些信息,截图如下:
1. Collection向上继承自Iterale
2. Colletion向下扩展的类和接口,截图如下:
由上面的图我们可以看到左边一列是Collection的子接口或实现它的子类,可以看到划红线的List,Set均继承自Collection;右边一列是Collection中定义的一些方法。
二. List接口(继承自Collection)
同样的先上图后解释:
同样,我们看左边一列,是List下的子类以及子接口,其中包括ArrayList,LinkedList以及Vector;再看右边一列是List接口中定义的一些方法。
下面我们讨论一下List下三个实现类的特性:
ArrayList:
类似于数组般线性存储,只不过该数组可以动态改变大小,且每次扩容算法为:原长度*3/2 + 1,也即扩大原来的50%。因为类似数组,所以随机访问效率高,但是删除插入操作效率低,所以不适用与频繁删除插入操作。
细节知识:
1. ArrayList是线程不安全的,所以多线程情况下不要选用该列表,可以选用vector.2. ArrayList有多种遍历方式,如下代码实例:package ColletionTest; import java.util.ArrayList; import java.util.Iterator; public class MainTest { public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<String> names = new ArrayList<String>(); System.out.println(names.size()); names.add("chenfang"); names.add("sjj"); names.add("xiaoming"); names.add("xiaohua"); /*下面是几种主要的遍历方式*/ /*方法一*/ for(int i=0;i<names.size();i++){ System.out.println(names.get(i)); } /*方法二*/ for(String tmp : names){ System.out.println(tmp); } /*方法三*/ String[] tmps = new String[names.size()]; names.toArray(tmps); for(int i=0;i<tmps.length;i++){ System.out.println(tmps[i]); } /*方法四*/ Iterator<String> it = names.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
LinkedList:
LinkedList也是一个线性表,其实现用的是双向循环链表,所以删除插入效率高,而随机访问效率低,频繁使用删除插入操作时可选用该链表。
细节知识:
1. 主要是LinkedList和ArrayList的区别,各自的内部实现机理,各自使用的情况等,参见上面表述。
2. LinkedList不是线程安全的,所以多线程环境下需要用synchronized关键字实现同步。
3. 遍历方法可以是for(Object tmp : variable),也可以是先转换为数组后按数组方式遍历,还可以是迭代器方式,和ArrayList差不多。
Vector
和ArrayList差不多,可以说是ArrayList的线程安全替代版。
三. Set接口
![]()
Set和List接口不同的一点是,不允许元素重复出现,最多出现一个null类型元素,这和集合的定义是一样的。那么实现Set接口的类中,常见的有HashSet,LinkedHashSet,TreeSet。细节知识:
1. HashSet用HashMap实现。2. LinkedHashSet用LinkedHashMap实现。3. TreeSet底层使用红黑树实现,插入的元素会按大小插入相应的位置;另外,他是用HashMap实现的。
四. Map接口
![]()
Map接口没有继承Collection接口,但是Collection中的Set接口下的一些集合类实现时,底层使用到了Map接口下的一些类的,在Set接口那一小节已经说过了。