当前位置:首页 > Java技术 > JAVA集合框架--详解

JAVA集合框架--详解

2022年09月16日 22:25:21Java技术12

        java集合框架为我们提供了一套性能优良、使用方便的接口和类,它们都位于java.util包中。集合框架是一种为表示和操作而规定的一种统一的彼岸准体系结构。

集合框架包含的主要内容及彼此之间的关系如图所示:

JAVA集合框架--详解 _ JavaClub全栈架构师技术笔记

集合框架被设计成要满足以下几个目标。

  • 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。

  • 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。

  • 对一个集合的扩展和适应必须是简单的。

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

    }
}

执行结果:JAVA集合框架--详解 _ JavaClub全栈架构师技术笔记

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

        }
    }
}

代码执行结果如下:

JAVA集合框架--详解 _ JavaClub全栈架构师技术笔记

 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中的数据");
        }

    }
}

代码执行结果如下:JAVA集合框架--详解 _ JavaClub全栈架构师技术笔记

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

        }
        //
    }
}

代码执行结果:JAVA集合框架--详解 _ JavaClub全栈架构师技术笔记

 


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

作者:暇光署墨
来源链接:https://blog.csdn.net/weixin_45295447/article/details/123494502

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42202.html

标签: Java集合Java
分享给朋友:

“JAVA集合框架--详解” 的相关文章

两年前写的Java基础总结书

两年前写的Java基础总结书

想法衍生 两年前的我,突发奇想,把自己学的Java基础进行规范化的整理,因为自己的文档编辑能力有限,所以写的排版不是很好,参照图书排版的形式,将书籍进行整理,可以供学习Java基础的朋友参考,由于时间有限,可能也会有问题,请指出。下载地址在最后 截图如下:...

全面了解 Java 原子变量类

📦 本文以及示例源码已归档在 javacore 一、原子变量类简介 为何需要原子变量类 保证线程安全是 Java 并发编程必须要解决的重要问题。Java 从原子性、可见性、有序性这三大特性入手,确保多线程的数据一致性。 确保线程安全最...

Java实现素数的判断

素数的定义只能被1和它本身整除,不包括1 例 2.3.5.7.11.13 实现代码 Scanner in=new Scanner(System.in); int n ; n=in.nextInt(); for(int n1=2;n1&l...

java之整数的分解可以理解为倒序输出

Scanner in=new Scanner(System.in); int number ; number=in.nextInt(); int result=0; do{ int diget=number%10;...

java计数循环及小技巧

要运行一个很大次数的循环应该选择一个小数,然后去判断 例如本例子是100可以选择10去判断 public static void main(String[] args) { // TODO Auto-generated metho...

初探设计:Java继承何时用?怎么用?

初探设计:Java继承何时用?怎么用?

Writer      :BYSocket(泥沙砖瓦浆木匠) 一、回顾继承 常见的如下: 1、依赖(”uses-a“) 2、聚合(”has-a“) 3、继承(”is-a“)类...

[Java 泥水匠] Java Components 之二:算法篇之项目实践中的位运算符(有你不懂的哦)

[Java 泥水匠] Java Components 之二:算法篇之项目实践中的位运算符(有你不懂的哦)

作者:泥沙砖瓦浆木匠 网站:http://blog.csdn.net/jeffli1993 个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。 交流QQ群:【编程之美 365234583】http://qm.qq.com/cgi-bin/qm/qr?k=...

java高级

java高级

  Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。下...

JAVA的文件操作【转】

11.3 I/O类使用          由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择。因为文件是一种常见的数据源,而且读写文件也是程...

Java 基础之详解 Java IO

Java 基础之详解 Java IO

Java IO 基本概念 Java IO:即 Java 输入 / 输出系统。 区分 Java 的输入和输出:把自己当成程序, 当你从外边读数据到自己这里就用输入(InputStream/Reader), 向外边写数据就用输出(OutputStream/Writer)。...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。