Java集合框架
发布日期:2022-02-06 00:26:59 浏览次数:20 分类:技术文章

本文共 6245 字,大约阅读时间需要 20 分钟。

集合框架概述

为什么使用集合框架:
数组在处理一些问题时存在明显的缺陷,而集合完全弥补了数组的缺陷,它比数组更灵活更实用,可以大大提高软件的办事效率,并且不同的集合可适用于不同的场合。

java集合框架包含的内容

java集合框架为我们提供了一套性能优良,使用方便的接口和类,他们都位于java.util 包中。java集合框架包含的主要内容及彼此之间的得关系如图:
在这里插入图片描述
集合框架为表示和操作集合而规定的一种统一的标准体系结构。集合框架都包含三大块内容:对外的接口,接口的实现和对集合运算的算法
1.接口:表示集合的抽象数据类型,如上图一虚线框表示,如Collection,List,Set,Map,Iterator.
2.实现:集合框架中接口的具体实现,在上图中一粗线框表示,粗线框表示最常用的实现,如ArrayList, LinkedList, HashMap, HashSet
3.算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算得方法,如查找,排序等。java提供了进行集合操作的工具类Collections(注意不是Collection, 类似于Arrays类),它提供了对集合进行排序等多种算法实现。在使用Collections的时候可以查阅JDK帮助文档。

java集和框架中的两大类接口,Collection和Map,其中,Collection又有两个子接口:List和Set。所以通常说,java集和框架共有三大类接口:==List和Map,Set。他们的=共同点:都是集和接口,都可以用来存储很多对象。==它们的区别如下。

1.Collection接口存储一组不唯一(允许重复),无序的对象
2.Set接口继承Collection接口,存储一组唯一(不允许重复),无序的对象。
3.List接口继承Collection接口,存储一组不唯一(允许重复),有序的(以元素插入的次序来放置元素,不会重新排列的对象)。
4.Map接口存储一组成对的键值对,提供key(键)到value(值)的映射,Map中的key不要求有序,不允许重复。value同样不要求有序,但允许重复。
5.Iterator接口是负责定义访问和遍历元素的接口。
在这里插入图片描述

List接口

实现List接口常用类有ArrayList和LinkedList,他们都可以容纳所有类型的对象,包括null,允许重复,并且都保证元素的存储顺序。
1.ArrayList对数组进行了封装,实现了长度可变的数组。ArrayList存储数据的方式和数组相同,都是在内存分配在连续的空间。优点在于遍历元素和随机访问元素的效率比较高。
在这里插入图片描述
2.LinkedList采用链表存储方式,优点在于插入,删除元素时效率比较高。它提供了额外的addFirst().addList().removeFirst()和removeLast()等方法,可以在LinkedList的首部或尾部进行插入或删除操作。这些方法使得LInkedList可备用作堆栈(Stact)或者队列(queue)。
在这里插入图片描述

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());
}
}}

List接口中定义的各种常用方法(也是ArrayList的各种方法)

|方法名称| 说明 |
boolean add()-在列表末尾顺序添加元素,起始索引位置从0开始
==void add(int index,object o)==在指定的索引位置添加元素,原索引位置及其后面的元素依次后移 。 注意 新添加元素列表位置必须介于0和列表中元素个数之间
int Size() 返回列表中的元素个数
==object get(int index) == 返回指定索引位置处的元素(注意:取出的元素是object类型,使用前需要进行强制类型转换)
==boolean Contains(Object o)==判断列表中是否存在指定元素
==boolean remove(object o)==从列表中删除元素
==object remove(int index)==从列表删除指定的位置元素,起始索引位置从0开始

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的一些特列方法

方法名称| 说明
void addFirst(object o) 在列表的首部添加元素
void addLast(object o) 在列表的末尾添加元素
object getFirst() 返回列表中的第一个元素
object getLast() 返回列表中的最后一个元素
object removeFirst() 删除并返回列表中的第一个元素
object removeLast() 删除并返回列表中的最后一个元素

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的常用方法

方法名称| 说明
object put(object key,value)
以键值对的方式进行存储(注意:键必须是唯一的,值可以重复)
object get(object key)
根据键返回相关联的值,若不存在,则返回null.
object remove(object key)
删除指定的键映射的“键-值对”
int size() 返回元素个数
set keySet() 返回键的集合
Collection values() 返回值得集合
boolean Containkey(object key)若存在指定的键映射的“键-值对”,则返回true
boolean isEmpty() 若不存在键值映射关系,则返回true
void clear()从此映射中移除所有映射关系

迭代器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  dogs = new ArrayList ();//标记元素类型
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.
在这里插入图片描述

转载地址:https://blog.csdn.net/weixin_46175284/article/details/105344819 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:JAVA的异常和日志
下一篇:Java泛型集合

发表评论

最新留言

第一次来,支持一个
[***.67.50.8]2022年09月30日 06时24分02秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章