java集合框架为我们提供了一套性能优良、使用方便的接口和类,它们都位于java.util包中。集合框架是一种为表示和操作而规定的一种统一的彼岸准体系结构。
集合框架包含的主要内容及彼此之间的关系如图所示:
集合框架被设计成要满足以下几个目标。
- 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
- 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
- 对一个集合的扩展和适应必须是简单的。
通常说java集合框架共有三大类接口:
- Collection接口存储一组不唯一(允许重复),无序的对象。
- Set接口继承Collection接口,存储一组唯一(不允许重复),无序的对象
- List接口继承Collection接口,存储一组不唯一(允许重复),有序(以元素插入次序来放置元素,不会重新排列)的对象
- Map接口存储一组成对的键-值对象,提供key(键)到values(值)的映射,Map中的Key不要求有序,不允许重复。values同样不要求有序,但是允许重复
List接口(ArraryList集合类):
实现List接口的常用类有ArraryList和LinkList。他们都可以通过容纳所有类型的对象,包括null,允许重复,并且都保证元素的存储顺序;ArrayList对数组进行了封装,实现了长度可变的数组。
问题:集合存储多个狗狗的信息,获取存储狗狗的总数,按照存储顺序获取各个狗狗信息并逐条输出相关内容;
分析:元素个数不确定,要求获得存储元素的实际个数,按照存储的顺序获取并输出元素的信息,可以通过List接口的实现
上述问题实现步骤:
- 创建多个狗狗的对象
- 创建ArraryList集合对象,并把多个狗狗的对象放入其中
- 输出集合中狗狗的数量
- 通过遍历集合显示各个狗狗的信息
实现代码:
Dog类:对狗狗属性进行定义声明、封装
* Created by WuHuaSen .
* Created Date: 2022/3/15 9:08
* Version: V1.0
*/
class Dog {
private String Name;//名字
private String Variety;//品种
public Dog() {
}
public Dog(String Name, String Variety) {
this.Name = Name;
this.Variety = Variety;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getVariety() {
return Variety;
}
public void setVariety(String variety) {
Variety = variety;
}
}
ListInterFace类:问题中通过实现List接口,对问题要求进行实现:
public class ListInterFace {
public static void main(String[] args) {
//创建多个狗狗对象
Dog ououDog = new Dog("欧欧", "雪纳瑞");
Dog yayaDog = new Dog("亚亚", "拉布拉多");
Dog meimeiDog = new Dog("美美", "雪瑞纳");
Dog feifeiDog = new Dog("菲菲", "拉布拉多");
//创建ArrayLIst集合对象并把4个狗狗对象放入其中
List dogs = new ArrayList();
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(2, feifeiDog);//菲菲添加到指定的位置
//输出集合中狗狗的数量
System.out.println("共计有:" + dogs.size() + "条狗狗");
//通过遍历集合显示各条狗狗的信息
System.out.println("姓名\t\t品种");
for (int i = 0; i < dogs.size(); i++) {
Dog dog = (Dog) dogs.get(i);//ArraryList存储数据类型是Object,所以使用get()方法时需要强制类型转换
System.out.println(dog.getName() + "\t\t" + dog.getVariety());
}
}
}
执行结果:
注!!List接口的add(Object o)方法的参数类型是Object类型,及时在调用时实参是Dog类型,但是系统认为里面是Object类型,所以在通过get(int i)方法获取元素必须进行强制类型转换,如 Dog dog = (Dog) dogs.get(i),否则会编译错误
LinkedList集合类:
由于ArraryList采用了和数组相同得到存储方式,在内存中分配连续的空间,在添加和删除非尾部元素时会导后面所有元素的移动,性能低下。所以在插入、删除操作比较频繁时,可以考虑使用LinkesList来提高效率。
问题:在集合的头部或尾部添加或者删除狗狗对象的实现
上述问题实现步骤:
- 创建多个狗狗的对象
- 创建LinkedList集合对象并把狗狗对象放入其中
- 查看集合第一条狗狗的昵称、查看最后一条狗狗的昵称
- 删除集合中第一条狗狗和最后一条狗狗
- 显示删除部分狗狗后集合中的各条狗狗的信息
实现代码:
test2类:对问题需求进行实现
import java.util.LinkedList;
/**
* Description: JiHeKuangJIA
* Created by WuHuaSen .
* Created Date: 2022/3/15 15:10
* Version: V1.0
*/
public class test02 {
public static void main(String[] args) {
//创建多个狗狗对象
Dog ououDog = new Dog("欧欧", "雪纳瑞");
Dog yayaDog = new Dog("亚亚", "拉布拉多");
Dog meimeiDog = new Dog("美美", "雪瑞纳");
Dog feifeiDog = new Dog("菲菲", "拉布拉多");
//创建LinkedList集合对象并把狗狗对象放入其中
LinkedList dogs = new LinkedList();
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.addLast(meimeiDog);
dogs.addFirst(feifeiDog);
//3、查看集合第一条狗狗的昵称
Dog dogFirst = (Dog) dogs.getFirst();
System.out.println("第一条狗狗的昵称是" + dogFirst.getName());
//4、查看最后一条狗狗的昵称
Dog dogLast = (Dog) dogs.getLast();
System.out.println("第一条狗狗的昵称是" + dogLast.getName());
//5\删除集合中第一条狗狗和最后一条狗狗
dogs.removeFirst();
dogs.removeLast();
//6、显示删除部分狗狗后集合中的各条狗狗的信息
System.out.println("删除部分狗狗后还有"+dogs.size()+"狗狗");
for (int i = 0;i<dogs.size();i++){
Dog dog = (Dog) dogs.get(i);
System.out.println(dog.getName()+"\t"+dog.getVariety());
}
}
}
代码执行结果如下:
Map接口(HashMap集合类):
Map接口存储一组成对的键-值对象,提供key(键)到values(值)的映射。Map中的key不要求有序,不允许重复。values同样不要求有序,但是值可以重复。最常用的Map实现类是HashMap,存储方式是哈希表,哈希表也称散列表,是根据关键码值而直接进行访问的数据结构。
问题: 建立国家英文简称和中文全名之间的键-值映射,如CN-中华人民共和国,根据“CN”可以查到“妆花人民共和国”,通过删除键实现对应值的删除
分析:Java集合框架中提供了Map接口,专门用来处理键-值映射数据的存储。Map中可以存储多个元素,每个对象都是由两个对象组成,即一个键对象对用一个值对象,可以根据键的实际对应值进行映射
上述问题实现步骤:
- 根据HashMap存储多组国家英文简称和中文全称的“键-值对”
- 显示“CN”对应国家的中文简称
- 显示集合中元素的个数
- 判断两次Map中是否存在"FR"键
- 分别显示键集、值集和键-值集
实现代码:
test2类:对问题需求进行实现
import java.util.HashMap;
import java.util.Map;
/**
* Description: JiHeKuangJIA
* Created by WuHuaSen .
* Created Date: 2022/3/15 15:42
* Version: V1.0
*/
public class test03 {
public static void main(String[] args) {
//1、根据HashMap存储多组国家英文简称和中文全称的“键-值对”
Map countries = new HashMap();
countries.put("CN", "中华人民共和国");
countries.put("RU", "俄罗斯联邦");
countries.put("FR", "法兰西共和国");
countries.put("US", "美利坚共和国");
//2、显示“CN”对应国家的中文简称
String Country = (String) countries.get("CN");
System.out.println("CN对应的国家是:" + Country);
System.out.println("----------------------------");
//3、显示集合中元素的个数
System.out.println("Map集合中共有" + countries.size() + "个国家");
System.out.println("----------------------------");
//4、判断两次Map中是否存在"FR"键
System.out.println("Map中包含FR的key吗?" + countries.containsKey("FR"));
countries.remove("FR");
System.out.println("Map中包含FR的key吗?" + countries.containsKey("FR"));
System.out.println("----------------------------");
//5、分别显示键集、值集和键-值集
System.out.println(countries.keySet());
System.out.println(countries.values());
System.out.println(countries);
System.out.println("----------------------------");
//6、清空HashMap并判断
countries.clear();
if (countries.isEmpty()){
System.out.println("已经清空Map中的数据");
}
}
}
代码执行结果如下:
Iterator迭代器
所有集合的接口和类都没有提供相应的遍历方法,而是把遍历交给了迭代器Iterator完成。Iterator为集合而生,专门实现集合的遍历。他隐藏了各种集合实现类的内部细节,提供了遍历集合的统一编程接口;
Collection接口的iterator()方法返回一个Iterator,然后通过Iterator接口的两个方法即可方便地实现遍历。
boolean hasNext():判断是否存在另一个可访问的元素。
Object next():返回要访问的下一个元素。
示例需求说明:
根据宠物昵称查找对应的宠物,如果找到,则显示宠物信息;否则给出错误提示,使用Iterator迭代器
实现步骤:
- 创建多个狗狗对象
- 创建Map集合对象并把多个狗狗对象放入其中
- 通过迭代器一次输出集合中所有狗狗的信息
实现代码 :
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* Description: JiHeKuangJIA
* Created by WuHuaSen .
* Created Date: 2022/3/15 18:49
* Version: V1.0
*/
public class test04 {
public static void main(String[] args) {
//创建多个狗狗对象
Dog ououDog = new Dog("欧欧", "雪纳瑞");
Dog yayaDog = new Dog("亚亚", "拉布拉多");
Dog meimeiDog = new Dog("美美", "雪瑞纳");
Dog feifeiDog = new Dog("菲菲", "拉布拉多");
//2、创建Map集合对象并把多个狗狗对象放入其中
Map dogMap = new HashMap();
dogMap.put(ououDog.getName(), ououDog);
dogMap.put(yayaDog.getName(), yayaDog);
dogMap.put(meimeiDog.getName(), meimeiDog);
dogMap.put(feifeiDog.getName(), feifeiDog);
//3、通过迭代器一次输出集合中所有狗狗的信息
System.out.println("使用Iterator遍历,所有狗狗的昵称是:\t所有狗狗的品种是:");
Set keys = dogMap.keySet();//取出所有key的集合
Iterator iterator = keys.iterator();//获取Iterator对象
while (iterator.hasNext()) {
String key = (String) iterator.next();//取出key
Dog dog = (Dog) dogMap.get(key);//根据key取出对应的值
System.out.println(key + "\t" + dog.getVariety());
}
//
}
}
代码执行结果:
小结:集合弥补了数组的缺陷,它比数组更灵活更实用,可大大提高软件的开发效率,而且不同的集合可适用于不同的场合。集合框架是为表示和操作集合而规定的一种标准体系结构。集合框架包括三大块内容:对外的接口,接口的实现和集合运算的算法~~~~