集合和数组的区别
- 数组明确了它容纳的数据类型,而集合不声明。
- 数组是静态的,具有固定的大小,一旦创建就不可以再改变大小;集合是动态的,可以根据需求动态改变大小。
- 数组是java的内置数据类型,它的静态定长以及数据类型的事先声明特性,决定了它的执行效率或者类型检查都是最快的。
再明确几个概念collection、Collection、Collections
- collection 集合,用来表示任何一种数据结构
- Collection 集合接口,指java.util.Collection,是集合的超类接口
- Collections 集合的工具类,指java.util.Collections。Collections是一个包装类,包含了操作集合的各种静态方法,此类不可以实例化,当做工具类用就可以了。
Collection接口
Collection接口是Set、List、Queue接口的父接口,提供了集合比较常用的一些方法。
add(E e) 将指定对象添加到集合中
remove(Object o) 将指定的对象从集合中移除,移除成功返回true,不成功返回false
contains(Object o) 查看该集合中是否包含指定的对象,包含返回true,不包含返回flase
size() 返回集合中存放的对象的个数。返回值为int
clear() 移除该集合中的所有对象,清空该集合。
iterator() 返回在此集合元素上进行迭代的迭代器 Iterator<E>,用来循环遍历集合
toArray() 返回一个包含所有对象的数组,类型是Object
toArray(T[] t) 返回一个包含所有对象的指定类型的数组
toArray(),toArray(T[] t)算是比较重要的一个方法,下面是集合转换为数组的一个示例代码
public static void main(String[] args) {
String a = "a",b="b",c="c";
List<String> list = new ArrayList<String>();
list.add(a);
list.add(b);
list.add(c);
String[] s = list.toArray(new String[0]);
for(String str : s){
System.out.println(str);
}
}
再来一个数组转集合的
public static void main(String[] args) {
String[] str = {"hello","world","hi","java"};
List list = Arrays.asList(str);
System.out.println(list);
System.out.println(list.size());
}
collection集合的四种基本形态
- List 关注数据的索引列表
- Set 关注数据的唯一性
- Queue 关注数据被处理的执行顺序
- Map 关注数据的映射关系
集合的关系图示
图片来自 http://www.cnblogs.com/xiaoqv/archive/2011/11/24/2262142.html
List
List关注点在索引,与其它集合类型相比,List特有的就是一些和索引相关的方法:get(int index) 、 add(int index,Object o) 、 indexOf(Object o) 。
- ArrayList 可理解为一个可动态增长的数组,提供快速迭代和快速随机访问的能力。
- LinkedList 其中的数据结构为双向链表结构,当需要快速插入和删除时LinkedList成为List中的不二选择。
ArrayList和LinkedList差异性
- 随机访问如get和set,ArrayList较优,因为LinkedList要移动指针;对于remove和add,LinkedList比较占优势,因为ArrayList需要移动数据。
- ArrayList本身是无序的,可通过Collections.sort(new ArrayList())排序;LinkedList本身有序
Set
Set集合关心唯一性,它不允许重复
- HashSet 当不希望元素重复,但是不关心元素之间的顺序时使用此类
- TreeSet 当不希望元素重复,但是希望按照元素的自然顺序进行排序时可以使用此类。
Queue(队列,先进先出)
用于保存将要执行的任务列表
- LinkedList 实现了Queue接口,可以实现先进先出的队列。
- PriorityQueue 用来创建自然排序的优先级队列。
Map
Map以Key-Value的键值对存放数据,关注键值对的映射关系
- HashMap 需要以键值对存储,又不关心顺序时使用
- TreeMap 需要以键值对存储,关心元素的自然顺序
- LinkedHashMap 需要以键值对存储,关心元素的插入顺序时使用