您的位置:首页 > 编程语言 > Java开发

JavaSE基础之集合大家庭

2017-10-27 11:01 225 查看
一、Collection 接口继承体系。



二、ArrayList、Vector和LinkedList的区别。

1)ArrayList和Vector

1.索引数据速度快。两者都是基于object[ ] array来实现的,他们会在内存中开辟一段连续的空间,因此,支持用序号(下标,索引)访问元素。

2.插入操作速度慢。插入元素的时候需要移动容器中的元素,所以执行速度比较慢。ArrayList和Vector都有一个初始容量大小(大小为10),里面的元素超过容量的时候,就会自动扩容。为了提高效率,每次扩充容量的时候不是简单的扩充一个存储单元,而是扩充多个。Vector默认扩充为原来的两倍(每次扩充大小可以设置),而ArrayList会扩充为原来的1.5倍(没有提供设置空间的方法)。注意:public ArrayList():在Java7之前,和Java7开始不一样.在Java7之前,默认创建的是一个容量为10的数组. 底层: this(10);而从Java7开始,默认创建的是一个没有元素的空数组. 底层: new Object[]{};虽然,此时创建的是一个没有元素的空数组,当第一次使用add方法的时候,此时才设定初始容量为10。

3.线程安全问题。两者最大的区别就是(synchronization 同步)的使用,ArrayList没有一个方法是同步的,而Vector的绝大多数方法(add,insert,remove,set,equals,hashcode)都是直接或者间接同步的。所以,Vector是线程安全的,但是效率低;ArrayList不是线程安全的,效率高。

2)LinkedList

LinkedList是采用的双向列表来实现的,对数据的索引需要从头来遍历,因此随机访问的效率低,但是插入的时候不需要移动元素,所以插入效率比较高。同时,LInkedList不是线程安全的。

—-> Iterator 接口(补充)

List<String> list=new ArrayList<>();
Iterator<String>  it= list.iteratro();


1)iterator(); 方法是Iterator接口的抽象方法,这句话到底为什么能这么用呢?

在继承体系中的Collection的实现类中 (这里拿ArrayList类举例)有一个内部类 class itr实现了 Iterator接口 而 ArrayList类中的iterator() 方法内部返回 itr 类的对象,也就是Iterator接口的实现类对象,所以可以用Iterator接口来接收;

(查看源码如下)

public Iterator<E> iterator() {
return new ArrayList.Itr();
}
private class Itr implements Iterator<E> {
...
}


三、Map 接口继承体系



1)Map概述:

1.数学中的定义:有A和B两个集合,A集合中的一个元素,总能在B集合中找到唯一的一个映射值。B集合中的一个元素,可以被A集合中的多个元素映射。



四、HashSet 和 HashMap

1)通过观察Set和Map的体系,会发现很多实现类的名字相似(底层算法是相同的).

拿HashSet和HashMap来举例. —>HashSet底层就是使用HashMap.

public HashSet(){
map=new HashMap<>();
}


把元素放在Set中时底层是放在了Map中;Map中的key就是Set的元素,所有key就是Set集合。

2.)Map



五、HashMap和HashTable

1)概述。Map有三个实现类HashMap、HashTable和 TreeMap。Map中用来索引的对象叫key,其对应的对象叫value。

2)HashMap是一个常用的Map。它根据键的HashCode 值来存储数据,根据键的值可以直接获取他的值,具有很快的访问速度。由于HashMap与HashTable都采用了Hash方法进行索引,所以有很多相似之处。主要的区别有:

-1.键值能否为空。HashMap是HashTable的轻量级实现(非线程安全的实现),他们实现了Map接口,主要区别在于HashMap允许空键值NULL,但是最多允许空一条记录,而HashTable不允许空键值。

-2.方法的区别。HashMap把HashTable的contains方法去掉了,改成了containsValue和containsKey。

-3.继承的父类。HashTable继承自Dictionary,HashMap是在java2引进的Map接口的实现。

-4.线程安全问题。HashTable是线程同步的,HashMap不支持线程同步,所以他的效率高,需要开发人员提供额外同步。

-5.遍历。HashTable通过Enumeration进行遍历,而HashMap用iterator来进行遍历。

-6.扩容问题。HashTable中的Hash数组默认大小是11,增加方式是old*2+1.在HashMap中,Hash数组的默认大小是16,而且一定是2的指数。

3)选择集合使用问题。

使用最多的是HashMap。在HashMap里面存入的键-值 在取出的时候没有固定顺序,是随机的。一般而言,Map中插入、删除、和定位元素,HashMap是最好的选择。由于TreeMap实现了SortMap接口,能够把保存的元素根据键进行排序,所以,取出来是排好序的键-值 ,如果需要按自然顺序或者自定义顺序来遍历键,那么TreeMap是更好的选择。LinkedHashMap是HashMap的子类,如果需要输出的顺序和输入的顺序一致,那么LInkedHashMap是更好的选择,它能按读取顺序来排列。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: