集合框架概述
为什么使用集合框架:
数组在处理一些问题时存在明显的缺陷,而集合完全弥补了数组的缺陷,它比数组更灵活更实用,可以大大提高软件的办事效率,并且不同的集合可适用于不同的场合。
Java集合框架包含的内容
Java集合框架为我们提供了一套性能优良,实用方便的接口和类,他们都位于java.util包中。
Java集合框架包含的主要内容及彼此之间的关系如图:
Java集合框架共有三大类接口:List,Set和Map
共同点:都是接口,都可以存储很多对象
区别如下:
Collection:接口存储一组不唯一(允许重复),无序的对象。
Set接口继承Collection接口,存储一组唯一(不允许重复),无序的对象
List接口继承Collection接口,存储一组不唯一(允许重复),有序(以元素插入的次序来防止元素,不会重新排列)的对象。
Map接口存储一组成对的键—值对象,提供key(键)到value(值)的映射,Map中的key不要求有序,不允许重复。value同样不要求有序,但允许重复。
Iterator接口是负责定义访问和遍历元素的接口。
List接口
实现List接口的常用类有ArrayList和LinkedList,它们都可以容纳所有的类型和对象,包括null,允许重复,并且都保证元素的存储顺序。
ArrayList集合类
问题:使用集合存储多个狗狗信息,获取存储的狗狗的总数,如何按照存储顺序获取各个狗狗的信息并逐条输出相关内容?
代码如下:
public class Test1 {
public static void main(String[] args) {
// 1、创建四个狗狗对象
Dog ououDog = new Dog("欧欧", "雪娜瑞");
Dog yayaDog = new Dog("亚亚", "拉布拉多");
Dog meimeiDog = new Dog("美美", "雪娜瑞");
Dog feifeiDog = new Dog("菲菲", "拉布拉多");
// 2、创建ArrayList集合对象并把四个狗狗对象放入其中
List dogs = new ArrayList();
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(2, feifeiDog); // 添加feifeiDog到指定位置
// 3、输出集合中狗狗的数量
System.out.println("共计有" + dogs.size() + "条狗狗。");
// 4、通过遍历集合显示各条狗狗信息
System.out.println("分别是:");
for (int i = 0; i < dogs.size(); i++) {
Dog dog = (Dog) dogs.get(i);
System.out.println(dog.getName() + "\t"
+ dog.getStrain());
}
}
}
运行结果
ArraList接口中定义的各种常用方法:
LinkedList集合类
问题:如何在集合的头部和尾部添加,获取和删除狗狗对象呢?
代码如下:
/**
* 测试LinkedList的多个特殊方法。
*/
public class Test3 {
public static void main(String[] args) {
// 1、创建多个狗狗对象
Dog ououDog = new Dog("欧欧", "雪娜瑞");
Dog yayaDog = new Dog("亚亚", "拉布拉多");
Dog meimeiDog = new Dog("美美", "雪娜瑞");
Dog feifeiDog = new Dog("菲菲", "拉布拉多");
// 2、创建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("\n删除部分狗狗后还有" + dogs.size() + "条狗狗。");
System.out.println("分别是:");
for (int i = 0; i < dogs.size(); i++) {
Dog dog = (Dog) dogs.get(i);
System.out.println(dog.getName() + "\t" + dog.getStrain());
}
}
}
运行结果如下:
LinkedList的一些特殊方法:
Map接口
HashMap集合类
问题:建立国中文家英文简称和中文全名之间的键—值关系,通过删除键实现对应值的删除,应该如何实现?
代码如下:
/**
* 测试HashMap的多个方法。
*/
public class Test4 {
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);
// 3、显示集合中元素个数
System.out.println("Map中共有"+countries.size()+"组数据");
/*4、两次判断Map中是否存在"FR"键*/
System.out.println("Map中包含FR的key吗?" +
countries.containsKey("FR"));
countries.remove("FR");
System.out.println("Map中包含FR的key吗?" +
countries.containsKey("FR"));
/* 5、分别显示键集、值集和键值对集*/
System.out.println(countries.keySet());
System.out.println(countries.values());
System.out.println(countries);
/* 3、清空 HashMap并判断*/
countries.clear();
if(countries.isEmpty())
System.out.println("已清空Map中数据!");
}
}
运行结果:
Map的常用方法:
迭代器Iterator
所有集合借口和类都没有提供相应的遍历方法,而是把遍历交给迭代器Iterator完成。Iterator为集合而生,专门实现集合的遍历。它隐藏了各种集合实现类的内部细节,提供了遍历集合的统一编程接口。
Collection接口的iterator()方法返回一盒iterator,然后通过iterator接口的两个方法即可方便地实现遍历:
1.boolean hasNext():判断是否存在另一个可访问的元素
2.Object next():返回要访问的下一个元素
泛型集合
泛型集合的应用
使用泛型集合在创建集合对象时指定集合中的元素的类型,从集合中取出元素时无需进行类型强制转换,并且如果把非指定类型对象放入集合,会出现编译错误。这是为了避免出现ClassCastException异常。
对List和ArrayList应用泛型
代码如下:
/**
* 测试对List应用泛型。
*/
public class Test6 {
public static void main(String[] args) {
/* 1、创建多个狗狗对象*/
Dog ououDog = new Dog("欧欧", "雪娜瑞");
Dog yayaDog = new Dog("亚亚", "拉布拉多");
Dog meimeiDog = new Dog("美美", "雪娜瑞");
Dog feifeiDog = new Dog("菲菲", "拉布拉多");
/* 2、创建ArrayList集合对象并把多个狗狗对象放入其中*/
List<Dog> dogs = new ArrayList<Dog>();//标记元素类型
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(2, feifeiDog); // 添加feifeiDog到指定位置
//dogs.add("hello"); //出现编译错误,元素类型不是Dog。
/* 3、 显示第三个元素的信息*/
Dog dog3 = dogs.get(2); //无需类型强制转换
System.out.println("第三个狗狗的信息如下:");
System.out.println(dog3.getName() + "\t" + dog3.getStrain());
/*4、使用foreach语句遍历dogs对象*/
System.out.println("\n所有狗狗的信息如下:");
for(Dog dog:dogs){//无需类型强制转换
System.out.println(dog.getName() + "\t" + dog.getStrain());
}
}
}
结果如下:
Java中共有八个包装类
Byte,Short,Intager,Long,Flost,Double,Boolean,Character.