Java集合框架【二容器[LinkedList容器类、Set接口]】

news2025/2/21 23:46:30

文章目录

  • 一 LinkedList容器类
    • 1.1 LinkedList的使用(List接口)
    • 1.2 Linked的使用(非List标准)
    • 1.4 LinkedList源码分析
  • 二 Set接口
    • 2.1 Set接口特点
    • 2.2 HashSet容器类
      • 2.2.1 Hash算法原理
      • 2.2.2 HashSet的例子
      • 2.2.3 HashSet存储特征分析
    • 2.3 TreeSet容器类
    • 2.4 通过元素自身实现比较规则
    • 2.5 通过比较器实现比较规则
  • 三 单例集合使用例子
    • List实现
    • Set实现

一 LinkedList容器类

  • LinkedList底层用双向链表实现的存储。
  • 特点:查询效率低,增删效率高,线程不安全双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。
    在这里插入图片描述
class Node<E> {
	E item;
	Node<E> next;
	Node<E> prev;
}

1.1 LinkedList的使用(List接口)

  • Linked实现了List接口,所以LinkedList是具备List的存储特征的【有序、可重复】
public class LInkedListTest {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("a");
        for(String s :list) {
            System.out.println(s);
        }
    }
}

在这里插入图片描述

1.2 Linked的使用(非List标准)

方法说明
void addFirst(E e)将指定元素插入到开头
void add Last(E e)将指定元素插入到结尾
getFirst()返回此列表的第一个元素
getLast()返回此列表的最后一个元素
removeFirst()移除此列表中的第一个元素,并返回这个元素
removeLast()移除此列表中的最后一个元素,并返回这个元素
E pop()从此列表所表示的堆栈处弹出一个元素,等效于removeFirst
voidpush(E e)将元素推入此列表所表示的堆栈这个等效于addFisrt(E e)
booleanisEmpty()判断列表是否包含元素,如果不包含元素则返回true

1.4 LinkedList源码分析

  • 节点类
private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

二 Set接口

  • Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。我们在前面通过List学习的方法,在Set中仍然适用。因此,学习Set的使用将没有任何难度。

2.1 Set接口特点

  • Set特点:无序、不可重复无序指Set中的元素没有索引,我们只能遍历查找;不可重复指不允许加入重复的元素。更确切地讲,新元素如果和Set中某个元素通过equals()方法对比为true,则只能保留一个。
  • Set常用的实现类有:HashSet、TreeSet等。

2.2 HashSet容器类

  • Hashset是一个没有重复元素的集合,不保证元素的顺序。而且HashSet允许有null元素。HashSet是采用哈希算法实现,底层实际是用HashMap实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高。

2.2.1 Hash算法原理

  • Hash算法也称之为散列算法
    在这里插入图片描述

2.2.2 HashSet的例子

/**
 * @author 缘友一世
 * date 2022/11/23-9:03
 */
public class HashSetTest {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("a");
        set.add("d");
        set.add("b");
        set.add("a");
        //获取元素,在set容器中没有索引,没有对应的get方法。
        for(String s:set) {
            System.out.println(s);
        }
        boolean flag = set.remove("d");
        System.out.println(flag);
        for(String s:set) {
            System.out.println(s);
        }
        System.out.println(set.size());
    }
}

在这里插入图片描述

2.2.3 HashSet存储特征分析

  • Hashset是一个不保证元素的顺序且没有重复元素的集合,是线程不安全的。Hashset允许有null元素
    1. 无序:
      • 在HashSet中底层是使用HashMap存储元素的。
      • HashMap底层使用的是数组与链表实现元素的存储。
      • 元素在数组中存放时,并不是有序存放的也不是随机存放的,而是对元素的哈希值进行运算决定元素在数组中的位置。
    2. 不重复:
      • 当两个元素的哈希值进行运算后得到相同的在数组中的位置时,会调用元素的equals()方法判断两个元素是否相同。如果元素相同则不会添加该元素,如果不相同则会使用单向链表保存该元素。
/**
 * @author 缘友一世
 * date 2022/11/23-9:11
 */
public class Users {
    private String userName;
    private int userAge;

    public Users() {
    }

    public Users(String userName, int userAge) {
        this.userName = userName;
        this.userAge = userAge;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getUserAge() {
        return userAge;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }

    @Override
    public int hashCode() {
        int result=userName !=null ? userName.hashCode():0;
        result=31*result+userAge;
        return result;
    }

    @Override
    public boolean equals(Object o) {
        if(this==o) return true;
        if(o==null || getClass()!=o.getClass()) return false;
        Users users = (Users) o;
        if(userAge!=users.userAge) return false;
        return userName!=null ? userName.equals(users.userName):false;
    }

    @Override
    public String toString() {
        return "Users{" +
                "userName='" + userName + '\'' +
                ", userAge=" + userAge +
                '}';
    }
}

class Test {
    public static void main(String[] args) {
        HashSet<Users> set1 = new HashSet<>();
        Users aaa = new Users("aaa", 19);
        Users bbb = new Users("aaa", 19);
        set1.add(aaa);
        set1.add(bbb);
        for(Users user:set1) {
            System.out.println(user);
        }

    }
}

在这里插入图片描述

2.3 TreeSet容器类

  • TreeSet是一个可以对元素进行排序的容器底层实际是用TreeMap实现的,***内部维持了一个简化版的TreeMap,通过key来存储Set的元素。***TreeSet内部需要对存储的元素进行排序,因此,我们需要给定排序规则。
  • 排序规则实现方式
    • 通过元素自身实现比较规则
    • 通过比较器指定比较规则
/**
 * @author 缘友一世
 * date 2022/11/23-9:30
 */
public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet<String> set = new TreeSet<>();
        set.add("c");
        set.add("a");
        set.add("b");
        set.add("1");
        for(String str:set) {
            System.out.println(str);
        }
    }
}

在这里插入图片描述
在这里插入图片描述

2.4 通过元素自身实现比较规则

  • 在元素自身实现比较规则时,需要实现Comparable接口中的compareTo方法,该方法中用素定义比较规则。TreeSet通过调用该方法来完成对元素的排序处理。
/**
 * @author 缘友一世
 * date 2022/11/23-12:53
 */
public class SortTest {
    public static void main(String[] args) {
        TreeSet<Users2> set1 = new TreeSet<>();
        Users2 aaa = new Users2("aaa", 19);
        Users2 ccc = new Users2("ccc", 17);
        Users2 bbb = new Users2("bbb", 19);
        set1.add(aaa);
        set1.add(bbb);
        set1.add(ccc);
        for(Users2 user:set1) {
            System.out.println(user);
        }
    }
}
class Users2 implements Comparable<Users2> {

    private String userName;
    private int userAge;

    public Users2() {
    }

    public Users2(String userName, int userAge) {
        this.userName = userName;
        this.userAge = userAge;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getUserAge() {
        return userAge;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }

    @Override
    public int hashCode() {
        int result=userName !=null ? userName.hashCode():0;
        result=31*result+userAge;
        return result;
    }



    @Override
    public boolean equals(Object o) {
        if(this==o) return true;
        if(o==null || getClass()!=o.getClass()) return false;
        Users2 users = (Users2) o;
        if(userAge!=users.userAge) return false;
        return userName!=null ? userName.equals(users.userName):false;
    }

    @Override
    public String toString() {
        return "Users{" +
                "userName='" + userName + '\'' +
                ", userAge=" + userAge +
                '}';
    }

    @Override
    public int compareTo(Users2 o) {
        if(this.userAge>o.getUserAge()) {
            return 1;
        }
        if(this.userAge==o.getUserAge()) {
            return this.userName.compareTo(o.getUserName());
        }
        return -1;
    }
}

在这里插入图片描述

2.5 通过比较器实现比较规则

  • 通过比较器定义比较规则时,我们需要单独创建一个比较器,比较器需要实现Comparator接口中的compare方法来定义比较规则。
  • 在实例化TreeSet时将比较器对象交给TreeSet来完成元素的排序处理。此时元素自身就不需要实现比较规则了。

/**
 * @author 缘友一世
 * date 2022/11/23-13:24
 */
class Test {
    public static void main(String[]args){
        TreeSet<student> set = new TreeSet<>(new ComparatorTest());
        student ooo = new student("ooo", 18);
        student aaa = new student("aaa", 22);
        student sss = new student("sss", 22);
        set.add(ooo);
        set.add(aaa);
        set.add(sss);
        for(student x:set) {
            System.out.println(x);
        }
    }
}
public class ComparatorTest implements Comparator<student> {
    //定义比较规则

    @Override
    public int compare(student o1, student o2) {
        if(o1.getAge()>o2.getAge()) {//升序
            return 1;
        }else if(o1.getAge()==o2.getAge()) {
            return o1.getName().compareTo(o2.getName());
        }
        return -1;
    }
}
class student {
    private  String name;
    private int age;

    public student() {
    }

    public student(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 boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        student student = (student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述

三 单例集合使用例子

  • 生成1-10之间的随机数(1-10),将不重复的10个随机数放到容器中

List实现

/**
 * @author 缘友一世
 * date 2022/11/23-13:36
 */
public class SetDemo {
  public static void main(String[] args) {
  ArrayList<Integer> list = new ArrayList<>();
        while(true) {
            int num=(int)(Math.random()*10+1);
            if(!list.contains(num)) {
                list.add(num);
            }
            if(list.size()==10) {
                break;
            }
        }
        for(Integer x:list) {
            System.out.println(x);
        }
    }
}

在这里插入图片描述

Set实现

/**
 * @author 缘友一世
 * date 2022/11/23-13:36
 */
public class SetDemo {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        while(true) {
            //set容器是不允许有重复元素的,所以不需要
            int num=(int)(Math.random()*10+1);
            set.add(num);
            if(set.size()==10) {
                break;
            }
        }
        for(Integer i:set) {
            System.out.println(i);
        }
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]java毕业设计学校失物招领系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【尚硅谷】IDEA2022快速上手开发利器

【尚硅谷】IDEA2022快速上手开发利器 【尚硅谷】IDEA2022快速上手开发利器一、详细设置1.1 如何打开详细配置界面1.2 系统设置1.3 设置整体主题1.4 设置编辑器主题样式1.5 显示行号与方法分隔符1.6 代码智能提示功能1.7 自动导包配置1.8 设置项目文件编码&#xff08;一定要改&…

uniapp小程序实现圆环效果

文章目录调用组件uniapp小程序利用 canvas2d实现根据指定时间动态画圆环效果调用 <view class"dubbing-control" :style"{width:recordWidth,height:recordWidth}"><dubbing-button v-if"show" :width.sync"recordWidth" :s…

e智团队实验室项目-第四周-YOLOv论文的对比实验中遇到的问题

贾小云*&#xff0c;赵雅玲 *, 张钊* , 李锦玉*&#xff0c;迟梦瑶*&#xff0c;赵尉*&#xff0c;潘玉*&#xff0c;刘立赛&#xff0c;祝大双&#xff0c;李月&#xff0c;曹海艳&#xff0c; (淮北师范大学计算机科学与技术学院&#xff0c;淮北师范大学经济与管理学院&…

2022年度国家级科技企业孵化器开始申报

科技部火炬中心关于开展2022年度国家级科技企业孵化器申报工作的通知各省、自治区、直辖市及计划单列市科技厅&#xff08;委、局&#xff09;&#xff0c;新疆生产建设兵团科技局&#xff1a; 为贯彻落实党的二十大精神&#xff0c;加快实施创新驱动发展战略&#xff0c;加快实…

MySQL操作

目录 1.对库操作 1.1 创建数据库 1.1.1 查看有哪些数据库 1.1.2 指定数据库的字符集 1.1.3 查重创建数据库 1.1.4 查看警告信息 1.1.5 小知识:SQL语句中的分号 1.1.6 小知识:设置默认字符集 1.1.7 小知识:语句中的大小写 1.2 使用/选中数据库 1.3 删除数据库(慎重操作…

PHP视频网站用wamp、phpstudy运行定制开发mysql数据库BS模式

一、源码特点 PHP视频网站是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库系统主要采用B/S模式开发,开发环境为PHP APACHE&#xff0c;数据库为mysql5.0&#xff0c;使 用php语言开发 PHP视频网站用wamp、phpstu…

21. [Python GUI] PyQt5中的模型与视图框架-抽象模型基类QAbstractItemModel与自定义模型

PyQt5中的抽象模型基类QAbstractItemModel与自定义模型 一、关于QAbstractItemModel类 QAbstractItemModel类继承自QObject&#xff0c; 该类是Qt所有模型类的基类&#xff0c;用于管理模型/视图结构中的数据。Qt的所有模型都需要子类化该类。注意&#xff0c;该类是抽象类&am…

数字孪生应用方向展示

昨晚&#xff0c;2022年卡塔尔世界杯正式打响&#xff01;伴随开幕式的进行&#xff0c;由中国铁建城建的卡塔尔世界杯主场馆卢赛尔体育场惊艳全球。事实上&#xff0c;在数字孪生技术的加持下&#xff0c;体育场馆建设也是重点技术应用方向之一&#xff0c;今天就为大家重点展…

java读取文件

先看项目截图 public class FileTest {public static void main(String[]args) throws IOException {String path Objects.requireNonNull(FileTest.class.getClassLoader().getResource("")).getPath();System.out.println(path);System.out.println("****…

微信“史诗级”更新,小而美终于回来啦~

最近微信安卓版又有了更新&#xff0c;版本号也来到了8.0.30。 此次更新又被业界称之为“史诗级”更新&#xff0c;主要原因是新版本微信安装包体积缩小了10M。 没错&#xff0c;你没有看错微信的安装包真的缩小了&#xff0c;而且整整缩小了10M&#xff01; 天呐&#xff0…

MyBatis从入门到精通真没那么难!跟着我带你深入实践Mybatis技术原理与实战!

什么是Mybatis mybatis 是一个优秀的基于java的持久层框架&#xff0c;它内部封装了jdbc&#xff0c;使开发者只需要关注sql语句本身&#xff0c;而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。 mybatis通过xml或注解的方式将要执行的各种 statemen…

跨平台应用开发进阶(四十五)uni-app集成企微客服实战

文章目录一、前言二、功能实现2.1 环境准备2.2 代码层面2.3 拓展工具三、拓展阅读一、前言 应用运营过程中&#xff0c;考虑接入企业微信客服功能&#xff0c;大致看了下官方接入文档&#xff0c;并不困难&#xff0c;引入代码量也不大。按照手册来操作即可。 二、功能实现 …

Go Module的基本使用

go module是类似于java中的maven,是包的管理工具&#xff0c;在没有这个go module之前&#xff0c;都是配置本地的GOPATH&#xff0c;创建的每个项目也都必须创建在这个GOPATH的src目录下&#xff0c;且项目的go文件不能重名 go module是在go1.1.1版本推出的 开启go module 在…

装配式施工在建筑装修中的应用研究

目 录 摘 要 I Abstract II 1引言 1 2装配式施工在建筑装修中的发展背景及现状 2 2.1装配式施工在建筑装修中的发展背景 2 2.2建筑装饰行业现状 2 3装配式施工在建筑装修中体系的主要特点 3 4装配式施工在建筑装修中体系的构成 4 4.1八大系统 4 4.1.1集成卫浴系统 4 4.1.2集成厨…

【App自动化测试】(二)Appium环境部署

目录1. Appium生态工具2. Appium环境安装部署2.1 Appium 环境依赖说明2.2 第一步&#xff1a;安装JDK2.3 第二步&#xff1a;安装SDK2.4 第三步&#xff1a;安装Appium2.5 第四步&#xff1a;安装appium python client2.6 第五步&#xff1a;安装appium-doctor检测appium的安装…

Metabase学习教程:视图-1

你应该用哪个图表&#xff1f; 您应该使用哪种类型的图表和图表来最好地传达来自数据的见解&#xff1f;这将有助于你选择正确的工作。 选择正确的图表可以归结为两个问题&#xff1a;数据是什么样子的&#xff0c;以及您试图传达什么&#xff1f; 让Metabase为您选择图表 …

Day01-网页结构分析

网页结构分析 一 前言 姓名&#xff1a;陈云 TEL&#xff1a;18571593511 企业用人的两个标准 1.能干活,见到需求能反应出粗线条实施计划,起手实施后能自主预判和解决坑点,直至完成. 2.对某些敏感点理解较准确,有一定潜质做个性化封装和技术选型工作,应对突发状况,避免生…

SpringBoot--通过JSON传递请求参数--方法/实例

原文网址&#xff1a;SpringBoot--通过JSON传递请求参数--方法/实例_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍SpringMVC如何通过JSON格式传递入参。 JSON格式使用post方式来请求&#xff0c;即&#xff1a;对应的注解为&#xff1a;PostMapping。 PostMapping注解的方法…

Vue学习笔记

课程来源&#xff1a;https://www.bilibili.com/video/BV1Zy4y1K7SH?p4&vd_source6f37192b213c98639a87ec77b26d105d 学习计划&#xff1a;一天学10节&#xff0c;从第四节开始做笔记&#xff0c;预计16天完成&#xff08;完成日期2022年12月7日&#xff09; 目录&#…