1·概述
所有的集合类和集合接口都在java.util包下。
在内存中申请一块空间用来存储数据,在Java中集合就是替换掉定长的数组的一种引用数据类型。
Java 集合可分为 Collection 和 Map 两种体系:
2·集合与数组的区别
长度区别
数组长度固定,定义长了造成内存空间的浪费,定义短了不够用。
集合大小可以变,用多少空间拿多少空间。
内容区别
数组可以存储基本数据类型和引用数据类型
集合中能存储引用数据类型(存储的为对象的内存地址)
元素区别
数组中只能存储同一种类型成员
集合中可以存储不同类型数据(一般情况下也只存储同一种类型的数据)
集合结构
在java当中每一个不同的集合,底层会对应不同的数据结构。在不同的集合当中
存储数据,相当于将数据放到了不同的数据结构当中。
什么是数据结构?
数据存储的结构就是数据结构。不同的数据结构,数据存储方式不同。
3·集合
Collection接口
Collection接口的使用方法
Collection 接口是 List、Set接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 集合。
Collection方法
List集合
继承Collection接口,存储一组可重复的有序对象 元素顺序以元素插入的次序来放置元素,不会重新排序 通过索引访问数组元素,索引从0开始 根据索引操作集合元素的方法
List集合特征:表示一串有序的集合,和Collection接口含义不同的是List突出有序的含义。
List方法
List集合的两个实现类:
ArrayList类
- 特点:底层是数组
- 优点:基于数组实现,读取操作效率高
- 缺点:不适合频繁进行插入和删除操作,因为每次执行该类操作都需要频繁移动其中的元素
LinkedList类
- 特点:由双向链表实现,任意一个节点都可以方便地访问它的前驱节点和后继节点
- 优点:增加、删除操作只需修改链表节点指针,不需进行频繁的移动
- 缺点:遍历效率较低
ArrayList类和LinkedList类的相同点
可以容纳所有类型的元素对象,包括null 元素值可以重复 元素按顺序存储。
Set集合
Set特点:取出顺序不一定为存入顺序,另外Set集合没有下标。
set集合的实现类
HashSet类特征
- 不允许存储重复的元素
- 没有索引,没有包含索引的方法,不能使用索引遍历
- 无序集合,存储元素和取出元素的顺序可能不一致
- 不能使用索引进行遍历
HashSet类优点
可以实现对无序不重复数据的存储,具有很好的存取和查找性能
例:
//创建一个HashSet集合和多条水果数据
Set fruits = new HashSet();
Fruit fruit1 = new Fruit("金帅苹果", 2.5);
Fruit fruit2 = new Fruit("富士苹果", 2.0);
//向集合中添加元素
fruits.add(fruit1);
fruits.add(fruit2);
System.out.println("添加重复元素,是否成功:"+fruits.add(fruit1));
//遍历集合
for(Object o:fruits) {
Fruit fruit = (Fruit)o;
fruit.show();
}
Iterator迭代器接口
Iterator对象称为迭代器,主要用于遍历 Collection 集合中的元素。
GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。迭代器模式,就为容器而生。Iterator仅用于遍历集合,并不提供储存数据的功能
使用Iterator迭代访问Collection集合时,可调用Iterator的remove()方法删除集合元素
例:
Iterator it = fruitList.iterator();
while(it.hasNext()) {
Fruit fruit = (Fruit)it.next();
if(fruit.brand.equals("苹果梨")) {
it.remove();
} else {
fruit.show();
}
}
使用Iterator对集合元素进行迭代时,是把集合元素的值传给迭代器,因此,删除迭代器中存储的值不会影响集合中保存的元素
Map接口
Map接口本身就是一个顶层接口,由一堆Map自身接口方法和一个Entry接口组成,Entry接口定义了主要是关于Key-Value自身的一些操作,Map接口定义的是一些属性和关于属性查找修改的一些接口方法。
Map方法
HashMap实现类
HashMap是Java中最常用K-V容器,采用了哈希的方式进行实现,HashMap中存储的是一个又一个Key-Value的键值对,我们将其称作Entry,HashMap对Entry进行了扩展(称作Node),使其成为链表或者树的结构使其存储在HashMap的容器里(是一个数组)。
例
import java.util.HashMap;
import java.util.Map;
//省略代码
Map provinces = new HashMap();
provinces.put("京", "北京市");
provinces.put("沪", "上海市");
provinces.put("闽", "福建省");
provinces.put("湘", "湖南省");
String province = (String) provinces.get("京");
System.out.println("“京”对应的省份或直辖市:" + province)
System.out.println("共记录了"+provinces.size()+"组数据。");
System.out.println("是否记录简称为“闽”的省份或直辖市?" +
provinces.containsKey("闽"));
provinces.remove("闽");
System.out.println("是否记录简称为“闽”的省份或直辖市?" +
provinces.containsKey("闽"));
System.out.println(provinces.keySet());
System.out.println(provinces.values());
System.out.println(provinces);
provinces.clear();
if(provinces.isEmpty())
System.out.println("已清空全部数据!");
HashTable实现类
和HashMap不同,HashTable的实现方式完全不同,这点从二者的类继承关系就可以看出端倪来,HashTable和HashMap虽然都实现了Map接口,但是HashTable继承了DIctionary抽象类,而HashMap继承了AbstractMap抽象类。
Hashtable类和HashMap类之间存在的区别
Hashtable | HashMap |
继承自Dictionary类 | Java1.2引进的Map interface的一个实现 |
比HashMap要古老 | 是Hashtable的轻量级实现 |
线程安全 | 线程不安全 |
不允许有null的键和值 | 允许有null的键和值 |
效率稍低 | 效率稍高 |
Map.Entry接口
用于保存“键-值对”元素 运用Map.Entry接口遍历集合 通过entrySet()方法获取所有“键-值”对元素的集合 遍历集合中每个元素,进行键和值的分
Map.Entry接口方法
例
Set allSet = fruitMap.entrySet(); //获取键值对集合
Iterator it = allSet.iterator();
while(it.hasNext()){
Map.Entry me = (Map.Entry)it.next();
System.out.println(me.getKey()+" "+((Fruit)me.getValue()).getPrice());
}