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接口的实现类有HashMap和TreeMap等。
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里面键对象的不可重复。