java链表和队列的区别 21. 集合

java链表和队列的区别 21. 集合

1、概述

List , Set, Map都是接口,前两个继承至接口,Map为独立接口

Set下有,,

List下有java链表和队列的区别,,

Map下有,,,

接口下还有个Queue接口,有类

Java中集合类是放在java.util中,是一个用来存放对象的容器。 1、只能存放对象,不能存放int等类型,存的是对应的是等对象 2、存的是对象的引用,对象本身是放在堆内存中 3、可以存放不同类型的对象(因为实现的时候使用了泛型),不建议使用。

注意:

Queue接口与List、Set同一级别,都是继承了接口。

看图你会发现,既可以实现Queue接口,也可以实现List接口.只不过呢, 实现了Queue接口。Queue接口窄化了对的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 的非Queue的方法),以使得只有恰当的方法才可以使用。

是个接口,它里面的(只有这一个实现可用)中的元素一定是有序的。

2、接口(所有集合类的根接口)

image.png

2.1 List集合

特点: 有序,可重复

2.2 Queue队列2.3 Set 集合

特点:不可重复,无序

(1)

特点:底层数据结构是哈希表。(无序,唯一)

如何来保证元素唯一性?

依赖两个方法:()和()

(2)(实现数据存储,双向链表记录顺序 )

特点:底层数据结构是链表和哈希表。(FIFO插入有序,唯一)

1.由链表保证元素有序

2.由哈希表保证元素唯一

(3)

特点:底层数据结构是红黑树。基于二叉树的原理对新添加的对象按照指定的顺序排序(升序或降序),每添加一个对象都会进行排序,并将对象插入二叉树的指定位置。(唯一,有序)

1).如何保证元素唯一性的呢?

根据比较的返回值是否是0来决定

2). 如何保证元素排序的呢?

① 自然排序

代码演示:

把用户类按照名字长度排序,长度相等的按照名字的hash值,如果hash值相等则名字相等,按照年龄排序。

User类:

public class User implements Comparable {
    private String name;
    private int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    @Override
    public int compareTo(User o) {
        // return -1; //-1表示放在红黑树的左边,即逆序输出
        // return 1; //1表示放在红黑树的右边,即顺序输出
        // return 0; //表示元素相同,仅存放第一个元素
        // 主要条件 姓名的长度,如果姓名长度小的就放在左子树,否则放在右子树
        int num = this.name.length() - o.name.length();
        // 姓名的长度相同,不代表内容相同,如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。
        // 如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。
        // 如果这两个字符串相等,则结果为 0
        int num1 = num == 0 ? (this.name.hashCode() - o.name.hashCode()) : num;
        // 姓名的长度和内容相同,不代表年龄相同,所以还要判断年龄
        int num2 = num1 == 0 ? this.age - o.age : num1;
        return num2;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
}

测试类:

import java.util.TreeSet;
public class Demo {
    public static void main(String[] args) {
        User user1 = new User("zhanggengying", 18);
        User user2 = new User("zhoufan", 21);
        User user3 = new User("zhoufan", 20);
        TreeSet ts = new TreeSet();
        ts.add(user1);
        ts.add(user2);
        ts.add(user3);
        for (User user : ts) {
            System.out.println(user);
        }
    }
}

结果:

User [name=zhoufan, age=20]
User [name=zhoufan, age=21]
User [name=zhanggengying, age=18]

② 比较器排序

比较器排序步骤:

代码案例:和上述案例相同,不过是另一种实现方式

//用户类

package com.company.project.test09;
public class User {
    private String name;
    private int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
}

//自己写的比较器

package com.company.project.test09;
import java.util.Comparator;
public class MyComparator implements Comparator {
    @Override
    public int compare(User s1, User s2) {
        // 姓名长度
        int num = s1.getName().length() - s2.getName().length();
        // 姓名内容
        int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
        // 年龄
        int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
        return num3;
    }
}

//测试类

package com.company.project.test09;
import java.util.TreeSet;
//TreeSet的自然排序
//实现Comparable接口,重写compareTo方法
public class Demo {
    public static void main(String[] args) {
        User user1 = new User("zhanggengying", 18);
        User user2 = new User("zhoufan", 21);
        User user3 = new User("zhoufan", 20);
        TreeSet ts = new TreeSet(new MyComparator());
        ts.add(user1);
        ts.add(user2);
        ts.add(user3);
        for (User user : ts) {
            System.out.println(user);
        }
    }
}

(4), and 的区别

1)介绍:

2)相同点

3)不同点

代码:

package com.company.project.test07;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
//TreeSet, LinkedHashSet and HashSet的区别
public class Demo {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        LinkedHashSet linkedHashSet = new LinkedHashSet();
        TreeSet treeSet = new TreeSet();
        for (Integer data : Arrays.asList(5, 4, 3, 6, 8, 9, 10, 50, 30, 90, 111)) {
            // hashSet.add(data);
            hashSet.add(data);
            linkedHashSet.add(data);
            treeSet.add(data);
        }
        // 不保证有序
        System.out.println("Ordering in HashSet :" + hashSet);
        // FIFO保证安装插入顺序排序
        System.out.println("Order of element in LinkedHashSet :" + linkedHashSet);
        // 内部实现排序
        System.out.println("Order of objects in TreeSet :" + treeSet);
    }
}

结果:

Ordering in HashSet :[50, 3, 4, 5, 6, 8, 9, 10, 90, 30, 111]
Order of element in LinkedHashSet :[5, 4, 3, 6, 8, 9, 10, 50, 30, 90, 111]
Order of objects in TreeSet :[3, 4, 5, 6, 8, 9, 10, 30, 50, 90, 111]

2.4 总结

针对集合我们到底使用谁呢?(掌握)

3. Map接口(映射接口,存放键值对)

image.png

特点:

以键值对的形式存放对象。key-value。一般是key为类型,value为的类型。

Map接口有四个比较重要的实现类,分别是、、和。

3.1 Map集合(数组+链表/红黑树,线程不安全)

的数据结构,内部为数组java链表和队列的区别,数组的每个元素又是一个单向链表,如果单链表的元素超过8个java链表和队列的区别,又会将链式结构变为红黑树来提高查找效率。

如果想要线程安全,可以用的方法使具有线程安全,或者使用。

image.png

数组+链表结构

数组+红黑树结构

2.(分段锁实现,线程安全)

采用分段锁的思想实现并发操作,因此线程安全。

由多个组成(的数量是锁的并发度),每个都是继承并单独加锁,所有每次加锁操作是锁住的都是一个java链表和队列的区别 21. 集合,这样只要保证每个都是线程安全的,也就实现了全局的线程安全。

image.png

数组+单向链表结构

image.png

数组+红黑树结构

3.(线程安全,哈希表)

继承类,同一时刻只有一个线程能写,并发性不如

4.(二叉树数据结构,有序)

实现了接口保证元素顺序存储,默认按键值升序存储,也可自定义比较器(实现接口或者自定义比较器)

5.(基于数据结构,使用链表保存插入顺序)

是的子类,内部使用链表保存元素的插入顺序,通过遍历时,会按照元素的插入顺序访问元素。

(1)、、的区别:

image.png

(2)和的区别:

(3)如何选择和?

如果对同步性或与遗留代码的兼容性没有任何要求,建议使用。 查看的源代码就可以发现,除构造函数外,的所有 方法声明中都有 关键字,而的源码中则没有。

(4)所有带hash的前缀的Map集合的存储原理:

3.2 Map集合的遍历:

1、通过内部类Entry进行遍历

2、通过迭代器进行遍历,先获得Entry的Set集合

3、通过方法获得键的Set集合,通过遍历键取值

4、通过map.()获得所有值,但是不能获得键

代码演示:

package com.company.project.test1001;
import java.util.HashMap;
import java.util.Map;
//Map集合的遍历
public class Demo {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("A", "北京");
        map.put("D", "上海");
        map.put("C", "广东");
        for (Map.Entry entry : map.entrySet()) {
            System.out.println(entry);
        }
    }
}

结果:

A=北京
C=广东
D=上海

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限java链表和队列的区别 21. 集合,仅展示部分资料,需要点击文章最下方名片即可前往获

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » java链表和队列的区别 21. 集合

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们