java Collection容器(集合类)

来源:互联网 发布:apache 重写功能 编辑:程序博客网 时间:2024/05/16 17:01

Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。


Collection 表示一组对象,他是集中收集的意思,就是把一组数据收集起来,Collection接口的两个子接口Set,List:

--------------------------------------List部分Start----------------------------------

List中的数据有顺序,可以重复。使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下 >标)来访问List中的元素,这类似于Java的数组。


ArrayList实现了长度可变的数组,在内存中分配连续的空间。

顺序表(数组) 添加有序    不唯一

优点:遍历元素和随机访问元素的效率比较高

缺点:添加和删除需要大量移动元素效率低,按照内容查询效率低。


LinkedList采用链表存储方式。不基于数组。

链表  添加有序  不 唯一

它每一个节点(Node)都包含两方面的内容: 
1.节点本身的数据(data); 
2.下一个节点的信息(nextNode)。

优点:插入、删除元素时效率比较高

缺点:遍历和随机访问元素效率低下。



Vector 和(ArrayList LinkedList)用法差不多。现在Vector很少使用,Vector基于数组。

优点:多线程的时候,线程同步。

缺点:效率相对较

-----------------------------------------List部分End---------------------------------------

-----------------------------------------Set部分Start--------------------------------------

Set中的数据没有顺序,不可以重复。

HashSet:采用Hashtable哈希表存储结构

无序、唯一、允许null元素(只能有一个)

哈希表(顺序表)

如果存储自定义对象,需要重写hashCode以及equals方法,

重写hashCode方法用来决定自定义对象的hash值(存储位置),

重写equals方法用来决定两个对象hash值相同时,内容是否完全一致。

优点:添加速度快,查询速度快,删除速度快。

缺点:无序。

TreeSet
采用二叉树(红黑树)的存储结构

有序(自然顺序):从小到大

唯一、不同步、不允许null
优点:有序(排序后的升序)查询速度比List快
            (按照内容查询)
缺点:查询速度没有HashSet

LinkedHashSet
 采用哈希表存储结构,同时使用双重链表(双向链表)维护次序
有序(添加顺序) 唯一

允许null值,不同步(线程)

添加元素、删除元素、查询元素效率都很高。



-----------------------------------------Set部分End---------------------------------

-----------------------------------------Map部分Start-------------------------------

Map
特点key-value映射

Map底层实现:数组+链表

Map接口的实现类有HashMapTreeMap等。
Map类中存储的键-值对通过键来标识,所以键值不能重复。

HashMap
Key无序 唯一(Set)
Value无序 不唯一(Collection)

效率高,线程不安全

TreeMap

红黑树(二叉树),
有序(自然顺序<key的自然顺序>) ,

是否允许null(不允许null键,但是允许null值),

key唯一,新值会覆盖旧值。

速度没有hash


LinkedHashMap

红黑树(二叉树),
有序(自然顺序<key的自然顺序>) ,

是否允许null(不允许null键,但是允许null值),

key唯一,新值会覆盖旧值。

新增双重链表(维护添加顺序)


HashTable

哈希表,

不允许null键以及null值 jdk1.0开始,

键值对中一般用(String、Integer),

 效率低,线程安全。


用作键的对象必须实现 hashCode 方法和 equals 方法。


-----------------------------------------Map部分End--------------------------------


总结:



其他:

一、几个常用类的区别 
1.ArrayList: 元素单个,效率高,多用于查询 
2.Vector: 元素单个,线程安全,多用于查询 
3.LinkedList:元素单个,多用于插入和删除 
4.HashMap: 元素成对,元素可为空 
5.HashTable: 元素成对,线程安全,元素不可为空 


二、Vector、ArrayList和LinkedList 
大多数情况下,从性能上来说ArrayList最好,但是当集合内的元素需要频繁插入、删除时LinkedList会有比较好的表现,但是它们三个性能都比不上数组,另外Vector是线程同步的。所以: 
如果能用数组的时候(元素类型固定,数组长度固定),请尽量使用数组来代替List; 
如果没有频繁的删除插入操作,又不用考虑多线程问题,优先选择ArrayList; 
如果在多线程条件下使用,可以考虑Vector; 
如果需要频繁地删除插入,LinkedList就有了用武之地; 
如果你什么都不知道,用ArrayList没错。


三、HashSet是如何保证元素的唯一性的呢?

是通过元素的两个方法,hashCode和equals方法来完成,
如果元素的HashCode值相同,才会判断equals是否为true,
如果元素的hashCode值不同,不会调用equals方法。


ArrayList实现了长度可变的数组,在内存中分配连续的空间。

优点:遍历元素和随机访问元素的效率比较高

缺点:添加和删除需要大量移动元素效率低,按照内容查询效率低。


四、集合和数组的比较
数组不是面向对象的,存在明显的缺陷,集合弥补了数组的一些缺点,比数组更灵活更实用,可大大提高软件的开发效率,而且不同的集合框架类可适用不同场合。具体如下:
1:数组能存放基本数据类型和对象,而集合类中只能存放对象。
2:数组容易固定无法动态改变,集合类容量动态改变。
3:数组无法判断其中实际存有多少元素,length只告诉了数组的容量,而集合的size()可以确切知道元素的个数
4:集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式
5:集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率。


五、Collection和Collections的区别
Collection是Java提供的集合接口,存储一组不唯 一,无序的对象。它有两个子接口List和Set。

Java还有一个Collections类,专门用来操作集合类,它提供了一系列的静态方法实现对各种集合的搜索、排序、线程安全化等操作。


六、Vector和ArrayList的联系和区别
实现原理相同,功能相同,都是长度可变的数组结构,很多时候可以互用,
两者的主要区别如下:
Vector是早期的JDK接口,ArrayList是替代Vector的新接口,
Vector线程安全,ArrayList重速度轻安全,线程非安全,
长度需要增长时,Vector默认增长一倍,ArrayList增长50% (1.5+1)。


七、HashMap和Hashtable的联系和区别

实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用
两者的主要区别如下
Hashtable是早期的JDK提供的接口,HashMap是新版的JDK提供的接口
Hashtable继承Dictionary类,HashMap实现Map接口
Hashtable是线程安全,HashMap线程非安全
Hashtable不允许null值,HashMap允许null值


八、Set与Map的关系

采用了相同的数据结构,只用于map的key存储数据。

set的不可重复就是利用了map里面键对象的不可重复。


原创粉丝点击