JAVA集合框架--详解

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

        }
        //
    }
}

代码执行结果:

 


小结:集合弥补了数组的缺陷,它比数组更灵活更实用,可大大提高软件的开发效率,而且不同的集合可适用于不同的场合。集合框架是为表示和操作集合而规定的一种标准体系结构。集合框架包括三大块内容:对外的接口,接口的实现和集合运算的算法~~~~

  • 20
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暇光曙墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值