java集合类总结

来源:互联网 发布:贵州广电网络网上缴费 编辑:程序博客网 时间:2024/06/07 17:46

Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:
● Collection:代表一组对象,每一个对象都是它的子元素。
● Set:不包含重复元素的Collection。
● List:有顺序的collection,并且可以包含重复元素。
● Map:可以把键(key)映射到值(value)的对象,键不能重复。
entrySet实现了Set接口,里面存放的是键值对,可以通过map.entrySet()得到
尔后可以通过Iterator遍历 Iterator iterator = filemap.entrySet().iterator();
Iterator可用来遍历Set和List集合,主要包含 hashNext(),next(),remove()三种方法。
通常无序集合实现的都是这个接口,比如HashSet,HashMap;而那些元素有序的集合,实现的一般都是 ListIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个 元素,比如ArrayList。

这里不想写图片描述
这里还是不想写图片描述
这里写图片描述

数组(Array)和列表(ArrayList) 区别:

● Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
● Array大小是固定的,ArrayList的大小是动态变化的。
● ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
● 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

ArrayList、LinkedList与Vector 区别:

|–ArrayList:基于索引的数据接口,底层数据结构是 数组结构.是线程不同步的(不安全的).查询速度很快,可以以O(1)时间复杂度对元素进行随机访问,但是增删较慢。
构造一个初始容量为 10 的空列表,当放满了10个元素后,以50%的长度加长集合容器的长度。
List 接口的大小可变数组的实现,即:可以直接指定容量大小
|–LinkedList:底层数据结构是 链表结构。对元素的增删速度很快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。但是查询速度很慢,查找某个元素的时间复杂度是O(n)。线程是不同步的。LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
|–Vector:底层数据结构也是数组结构,是线程同步的(安全的),效率低,被ArrayList替代了。1.2版本以后的集合都是不同步的
当放满了10个元素后,以100%的长度加长集合容器的长度。
当更多的元素被添加的时候,Vector和ArrayList需要更多的空间。Vector每次扩容会增加一倍的空间,而ArrayList增加50%。

HashMap

HashMap 是一个数组和链表的结合体(在数据结构中,一般称之为“链表散列“),其数组元素为entry类型。
数据结构图如下:
这里写图片描述

put元素时的操作顺序为:
1、根据key计算hashcode值 2、根据hashcode映射内存地址 3、根据内存地址取值
这里写图片描述
基于HashMap的这种实现机制,只要hashCode()和hash()方法实现的足够好,能够尽可能的减少冲突的产生,那么对HashMap的操作几乎等价于对数组的随机访问操作,具有很好的性能。但是,如果hashCode()或者hash()方法实现较差,在大量冲突产生的情况下,HashMap事实上就退化为几个链表,对HashMap的操作等价于遍历链表,此时性能很差。
当我们往hashmap中put元素【按位与运算(indexFor)】的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。从hashmap中get元素时,首先计算key的hashcode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。从这里我们可以想象得到,如果每个位置上的链表只有一个元素,那么hashmap的get效率将是最高的,但是理想总是美好的,现实总是有困难需要我们去克服,哈哈~
但如果增大size,则hashcode取余范围增大,冲突几率变小。且map的size大小一般为2的方次数,如此则按位与时为&111111……..

HashMap和Hashtable区别:
● HashMap和Hashtable都实现了Map接口
● HashMap允许键和值是null,而Hashtable不允许键或者值是null。
● Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
● HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
○ 一般认为Hashtable是一个遗留的类。

原创粉丝点击