集合代表了一组对象(和数组一样,但数组长度不能变,而集合能)。java中的集合框架定义了一套规范,用来表示、操作集合,使具体操作与实现细节解耦。
其实说白了,可以把集合看成一个微型数据库,操作不外乎“增删改查”四种操作,我们在学习使用一个具体的集合类时,需要把四个操作的空间复杂度弄清楚了,基本上就可以说掌握这个类了。
集合和数组的区别
1、长度限制
数组长度是固定不变的,集合的大小是可动态变化的
2、存储类型之别
一个数组存储的元素可以是基本类型,也可以是引用类型,且只能存储同一种类型的元素;一个集合存储的元素只能是引用类型,但集合可以存储不同类型的元素(但集合一般存储同一类型,可以用泛型加以控制)
Java集合框架体系
java的集合类主要由两个接口派生:Collection和Map,Collection和Map是java集合框架的父接口,这两个接口又包含了一些接口或实现类。
Collection接口
(1)是List、Set和Queue接口的父接口
(2)定义了可用于操作List、Set和Queue的方法--增删改查
1、List接口及其实现类---ArrayList
(1)List(序列),元素有序,并且可重复
(2)List可以青雀控制元素的插入位置,或删除制定位置的元素
(3)ArrayList--数组序列,是List的一个重要实现类
(4)ArrayList地城是由数组实现的
注意:泛型集合中,不能添加泛型规定的类型及其子类型意外的对象,否则会报错。泛型集合中的限定类型,不能使用基本类型,必须用基本的包装类。
2、Set接口及其实现类--HashSet
(1)Set(集),元素无序,并且不可以重复
(2)HashSet--哈希集,是Set的一个重要实现类
Collection接口定义操作集合元素的具体方法大家可以参考API文档,这里通过一个例子来说明Collection的添加元素、删除元素、返回集合中元素的个数以及清空集合元素的方法
public class TestCollection
{
public static void main(String[] args)
{
Collection c = new ArrayList();
//添加元素
c.add("孙悟空");
//虽然集合里不能放基本类型的值,但Java支持自动装箱
c.add(6);
System.out.println("c集合的元素个数为:" + c.size());
//删除指定元素
c.remove(6);
System.out.println("c集合的元素个数为:" + c.size());
//判断是否包含指定字符串
System.out.println("c集合的是否包含孙悟空字符串:" + c.contains("孙悟空"));
c.add("轻量级J2EE企业应用实战");
System.out.println("c集合的元素:" + c);
Collection books = new HashSet();
books.add("轻量级J2EE企业应用实战");
books.add("Struts2权威指南");
System.out.println("c集合是否完全包含books集合?" + c.containsAll(books));
//用c集合减去books集合里的元素
c.removeAll(books);
System.out.println("c集合的元素:" + c);
//删除c集合里所有元素
c.clear();
System.out.println("c集合的元素:" + c);
//books集合里只剩下c集合里也同时包含的元素
books.retainAll(c);
System.out.println("books集合的元素:" + books);
}
}
Map接口
(1)Map提供了一种映射关系,元素是以键值对(key-value)的形式存储的,能根据key快速查找value
(2)Map中的键值对以Entry类型的对象实例形式存在
(3)key值不能重复,value值可以重复
(4)key对value是多(一)对一的关系
(5)Map接口提供了返回key值集合、value值集合、Entry值集合,的方法
(6)Map支持返回,形式如:Map<K,V>
HashMap类
(1)HashMap是Map的一个重要实现类,也是最常用的,是基于哈希表实现
(2)HashMap中的Entry对象是无序排列的
(3)Key值和value值都可以为null,但是一个HashMap只能有一个Key值为null的映射(Key值不可重复)
// 创建HashMap集合类,其操作泛型为Sring数据类型
HashMap<string, string=""> map = new HashMap<string, string="">();
map.put("01", "关羽");
map.put("02", "关羽");
map.put("03", "关羽");
/**
* Map集合获取元素的两种方式,(原理:将map集合转换成set,再使用迭代器)
* 1、keySet:将map中所有的键存入到set(set具备迭代器)集合,在根据get方法,
* 获取每一个健对应的值 。
* 2、entrySet
*/
// 1、通过KeySet()方法获取map集合中所有键Set集合
Set<string> set = map.keySet();
Iterator<string> iter = set.iterator();
while (iter.hasNext()) {
// 获取键key
String key = iter.next();
// 通过键key获取值(value)
String value = map.get(key);
System.out.println("key:" + key + " " + "value:" + value);
}
// 2、使用for()循环获取key-value
for (String key : set) {
System.out.println("键:" + key + " " + "值:" + map.get(key));
}
// 3、使用entrySet()方法,循环获取key-value
Set<entry<string, string="">> entrySet = map.entrySet();
Iterator<entry<string, string="">> iter1 = entrySet.iterator();
// 简写: Iterator<entry<string, string="">> iter1=map.entrySet().iterator();
while (iter1.hasNext()) {
Entry<string, string=""> en = iter1.next();
String key = en.getKey();
String value = en.getValue();
System.out.println("键1:" + key + " " + "值1:" + value);
}
// 获取Map值(value)视图
Collection coll = map.values();
Iterator iter2 = map.values().iterator();
while (iter2.hasNext()) {
System.out.println("遍历获取value值:" + iter2.next());
}
Set、List和Map可以看做集合的三大类:
List集合使有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合使无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里的元素不允许重复的原因)。
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。