JavaSEDemo24集合ArrayList、LinkedList、HashSet、TreeSet

JAVA复习【11】单列集合Collection:ArrayList、 LinkedList、HashSet、TreeSet学习与使用 ArrayList、 LinkedList、HashSet、TreeSet学习与使用 阅读详情

简介

  • 本文是2021/04/23整理的笔记
  • 赘述可能有点多,还请各位朋友耐心阅读
  • 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进

ArrayList

ForEach删除容易出错

  • 增强for循环不能删除东西,会出现ConcurrentModification 并发修改异常
    @Test
    public void testForEachDel(){
        ArrayList<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(20);
        list.add(30);
        for (Integer integer : list) {
            System.out.println("integer = " + integer);
            boolean remove = list.remove(new Integer(20));
            System.out.println("remove = " + remove);
        }
        System.out.println(list);
    }

迭代器使用list.remove也不能删除,会报错

@Test
    public void testIteratorDel(){
        ArrayList<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(20);
        list.add(30);
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            Integer next = iterator.next();
            System.out.println("next = " + next);
            boolean remove = list.remove(new Integer(20));
            System.out.println("remove = " + remove);
        }
    }

迭代器remove可以删除 iterator.remove

@Test
    public void testIteratorRemove(){
        ArrayList<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(20);
        list.add(30);
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            Integer next = iterator.next();
            System.out.println("next = " + next);
            iterator.remove();
        }
        System.out.println("list = " + list);
    }

LinkedList

常用方法1

  • add(E e) 将指定元素添加到此列表的结尾。
  • addFirst(E e) 将指定元素插入此列表的开头。
  • addLast(E e) 将指定元素添加到此列表的结尾
  • element() 获取但不移除此列表的头(第一个元素)
  • getFirst() 返回此列表的第一个元素
  • getLast() 返回此列表的最后一个元素
  • peek() 获取但不移除此列表的头(第一个元素)。
  • peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null
  • peekLast() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null
  • poll() 获取并移除此列表的头(第一个元素)
  • pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null
  • pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null
  • push(E e) 将元素推入此列表所表示的堆栈
  • pop() 从此列表所表示的堆栈处弹出一个元素
  • remove(int index) 移除此列表中指定位置处的元素。
  • removeFirst() 移除并返回此列表的第一个元素。
@Test
    public void testAdd(){
        LinkedList<String> list = new LinkedList<>();
        list.add("刘备");
        list.add("关羽");
        list.addFirst("诸葛亮");
        list.addLast("赵云");
        list.offer("孙尚香");
        list.offerFirst("黄忠");
        list.offerLast("马超");
        System.out.println("list = " + list);
        //System.out.println("list.element() = " + list.element());
        //System.out.println("list.getFirst() = " + list.getFirst());
        //System.out.println("list.getLast() = " + list.getLast());
        //System.out.println("list.peek() = " + list.peek());
//        System.out.println("list.peekFirst() = " + list.peekFirst());
//        System.out.println("list.peekLast() = " + list.peekLast());
//        System.out.println("list.poll() = " + list.poll());
//        System.out.println("list.pollFirst() = " + list.pollFirst());
//        System.out.println("list.pollLast() = " + list.pollLast());
//        list.push("张飞");
//        System.out.println("list.pop() = " + list.pop());
//        System.out.println("list.remove() = " + list.remove());
//        System.out.println("list.removeFirst() = " + list.removeFirst());
        System.out.println("list.removeLast() = " + list.removeLast());
        System.out.println("=====================");


        System.out.println("list = " + list);
    }

常用方法2

  • removeFirstOccurrence 从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表时)
  • removeLastOccurrence从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)
  • toArray 返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组。
@Test
    public void testRemove(){
        LinkedList<String> list = new LinkedList<>();
        list.add("刘备");
        list.add("关羽");
        list.add("关羽");
        list.add("张飞");
        list.add("关羽");
        list.add("关羽");
        list.add("关羽");
        System.out.println("list = " + list);

//        boolean b = list.removeFirstOccurrence("关羽");
        boolean b = list.removeLastOccurrence("关羽");
        System.out.println("b = " + b);
        System.out.println("=====================");

        System.out.println("list = " + list);
        /*
        Object[] objects = list.toArray();
        for (Object object : objects) {
            System.out.println("object = " + object);
        }*/

        String[] array = list.toArray(new String[0]);
        for (String s : array) {
            System.out.println("s = " + s);
        }
    }
}

Stack

常用方法

  • push(E item) 把项压入堆栈顶部。
  • pop() 移除堆栈顶部的对象,并作为此函数的值返回该对象
  • peek()查看堆栈顶部的对象,但不从堆栈中移除它。
  • empty() 测试堆栈是否为空
  • search(Object o)返回对象在堆栈中的位置,以 1 为基数。如果对象 o 是堆栈中的一个项,此方法返回距堆栈顶部最近的出现位置到堆栈顶部的距离;堆栈中最顶部项的距离为 1。使用 equals 方法比较 o 与堆栈中的项。
 @Test
    public void testPush(){
        Stack<String> stack = new Stack<String>();
        stack.push("刘备");
        stack.push("关羽");
        stack.push("张飞");
        System.out.println("stack = " + stack);
        /*System.out.println("stack.pop() = " + stack.pop());
        System.out.println("stack.pop() = " + stack.pop());
        System.out.println("stack.pop() = " + stack.pop());*/


      /*  System.out.println("stack.peek() = " + stack.peek());
        System.out.println("stack.peek() = " + stack.peek());
        System.out.println("stack.peek() = " + stack.peek());*/

        System.out.println("stack.empty() = " + stack.empty());
        System.out.println("stack.search(\"刘备\") = " + stack.search("刘备"));
        System.out.println("stack.search(\"关羽\") = " + stack.search("关羽"));
        System.out.println("stack.search(\"张飞\") = " + stack.search("张飞"));
    }

ArrayList 和 LinkedList 的区别

存储结构

  • ArrayList 的底层采用的是以数组为基础存储
  • LinkedList 的底层采用的是链表存储的.

性能

  • ArrayList:增加元素,删除元素,修改元素性能比 LinkedList 慢,读取数据速度快.
  • 链表:增加元素,删除元素,修改元素性能比 ArrayList 快.读取速度慢.

Set集合

  • 描述:无序不可重复的集合。
    默认初始容量 加载因子

HashSet

add不能添加重复元素

@Test
public void testAdd(){
    HashSet<String> set = new HashSet<>();
    set.add("刘备");
    set.add("关羽");
    set.add("张飞");
    System.out.println("set = " + set);
}

add有大坑

  • Set中不能添加重复元素,但是如下情况添加的元素并不是重复元素,添加的元素都是新new出来的对象。
@Test
    public void testAddPerson(){
        HashSet<Person> set = new HashSet<>();
        set.add(new Person("孙权",26));
        set.add(new Person("孙权",26));
        set.add(new Person("孙权",26));
        set.add(new Person("周瑜",23));
        set.add(new Person("周瑜",23));
        }

remove删除()和ArrayList的情况类似

  1. ForEach删除容易出错
  2. 迭代器使用list.remove也不能删除,会报错
  3. 迭代器remove可以删除 iterator.remove

不可重复的集合在调用add方法添加元素时,JVM会调用compareTo方法

重写equals和HashCode方法

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person person = (Person) o;
        return getAge() == person.getAge() &&
                Objects.equals(getName(), person.getName());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getName(), getAge());
    }

内部比较器

//外部比较器
    @Test
    public void testAddPerson2(){
        TreeSet<Person> set = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                int i = o1.getAge() - o2.getAge();
                int j = o1.getName().compareTo(o2.getName());
                return i == 0?j:i;
            }
        });
        set.add(new Person("a",50));
        set.add(new Person("b",20));
        set.add(new Person("c",20));
        System.out.println("set = " + set);
    }

外部比较器

@Override
    public int compareTo(Person o) {
        int i = this.getAge() - o.getAge();
        int j = getName().compareTo(o.getName());
        return i == 0?j:i;
    }
    

其他一些需要注意的点

  • 先比较HashCode 如果不同 则通过equals比较
  • 不能使用普通for循环遍历set集合,set集合是无序的。
  • forEach也不能用set.remove删除
华为OD机试2025C卷 - CPU调度策略 (C++ & Python & JAVA & JS & GO) 华为OD机试 2025C卷 CPU调度策略,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解 阅读详情

相关推荐

S32的进阶之路->3,S32DS新建/删除/导入工程

右击工程名,点击Delect进行工程删除。选中Delect project contents on disk则会彻底删除工程,不选中Delect project contents on disk工程文件会保存在工作空间中。在Improt Projects中选择工程所在文件夹,选中所需要导入的工程,勾选Copy projects into workspace。选中目标示例工程,点击Finish,完成创建工程。导入已有工程,右击右击Project Explorer空白处,选择Import。

LC_8575的博客 2227

Java集合整理、ArrayList LinkList HashSet TreeSet等集合的使用

Java集合笔记整理、ArrayList LinkList HashSet TreeSet等集合的使用

m0_48895748的博客 1078

智能车学习日记【二】————十字和斜入十字

智能车学习日记【二】————十字和斜入十字 文章目录 智能车学习日记【二】————十字和斜入十字 前言 一、普通十字补线 二、斜入十字 1.判断是否为斜入十字和斜入十字类型 2.找斜入十字拐点 总结 前言 经过了一个多月的学习,小白的我终于也是能较稳定调出了2.8m以上的四轮车,过程中也遇到了很多困难,其中就有十字补线和斜入十字补线。尤其是斜入十字也是困扰了我快一周,现在和大家分享一下我处理斜入十字的方法(我的方法其实还有很多漏洞需要改进,仅供大家参考理解一下,欢迎各位在评论区指点出可

bsefef的博客 2743

Java基础(21)——集合ArrayList、LinkedList、Set、HashSet、TreeSet详解

集合(二)版权声明一、List实现类1、ArrayList(1)原理(2)例子2、LinkedList(1)原理(2)特有方法二、Set1、Set(1)存储原理 版权声明 本文原创作者:清风不渡 博客地址:https://blog.youkuaiyun.com/WXKKang 一、List实现类 1、ArrayList   在实际的开发中,ArrayList是使用频率最高的一个集合实现类 (1)原理 ...

清风不渡 889

python实现RsaWithSHA256签名以及国密Sm3WithSm2签名

【代码】python实现RsaWithSHA256签名以及国密Sm3WithSm2签名。

weixin_45005677的博客 3356

安装 Claude Code 并接入阿里云百炼(Bailian)

这些工具通常提供可视化界面,只需在设置中填入阿里云百炼的 API Key 和 Base URL 即可,无需配置环境变量。注意:如果你使用的是阿里云百炼的 Coding Plan 套餐,请使用该套餐专属的 API Key 和 Base URL。你可以使用文本编辑器打开该文件,或者在终端使用命令(如 macOS/Linux 下使用 nano ~/.claude/settings.json)。你可以直接用自然语言下达指令,例如:“帮我在这个目录下写一个 Python 脚本,实现两数之和的功能”。

hopsky的博客 1846

Java-集合框架(List集合ArrayList,LinkedList,HashSet,TreeSet,Map,HashMap及其原理)

List集合ArrayList,LinkedList,HashSet,TreeSet,Map,HashMap及其原理

Have_MonkeyG的博客 1384

CondaHTTPError: HTTP 404 NOT FOUND for url

用conda创建新环境时出现问题了。

qq_40713201的博客 1270

Java集合学习(含ArrayList、LinkedList、HashSet(HashMap)、TreeSet(TreeMap)等等)

简介 数组的不足 在数组初始化时长度必须定义,一旦定义就不能修改 存储的是同一类型的元素 数组扩容和裁剪比较麻烦 扩容的第一步先创建满足大小的数组,第二步拷贝原数组到新数组中,第三步改变数组对象的引用 集合的好处 可以动态保存任意多个对象 提供了许多对应的增删改查的方法 集合框架体系 Collection:单列集合 Collection接口继承自Iterable接口,有两个重要的子接口:List和Set List的重要实现类:ArrayList Vector Link

zxldecsdn 540

STM32F4 SPI FLASH(W25Q128)驱动详解(含DMA+完整读写擦除+低功耗)

本文实现了一款基于STM32 HAL库的SPI Flash驱动,以W25Q128为例,提供了完整的初始化、读写、擦除、ID读取等功能。驱动集成了DMA传输、超时保护、页对齐写入等特性,支持扇区擦除、整片擦除、页写入及跨页缓冲写入。代码结构清晰,易于移植到其他SPI Flash型号(如W25Q64、W25Q16等),适用于数据存储、固件升级、文件系统等嵌入式场景。

kevin1499的博客 97

全网最强AI辅助课题申报教程!超详细流程拆解,助你快速提高课题申报成功率(附各部分高效提示词)

实验法要详细说明自变量、因变量、实验类型、实验过程、实验步骤、测量工具名称、被试取样方式、无关变量控制方法。这个部分就是让评审专家相信我们有能力把这个项目干成,写的时候要重点突出两块内容:第一是研究基础,包括你或团队在相关领域已有的研究成果,比如发表的论文、承担过的课题、获得过的奖励、相关研究经验等,要具体、有说服力;课题申报专门给我们留了一小节用来突出课题的创新之处,不管是研究角度、研究对象、研究方法,还是应用价值都可以提炼作为我们的创新点,最后的语气成果也要明确具体,且要和课题内容紧密相关。

智能AI让学术科研更容易 665

JavaSEDemo25Map

文章目录简介练习题练习1练习2练习3练习4练习5练习6练习7练习8练习9 简介 本文是2021/04/24整理的笔记 赘述可能有点多,还请各位朋友耐心阅读 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进 练习题 练习1 以下代码的执行结果是?【单项选择题】【简单】 public class Example { public static void main(String[] args) { TreeSet<String> t = new TreeSet<Str

hypertext123的博客 466

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ArrayList、LinkedList、Vector、HashSet、Treeset、HashMap、TreeMap的区别和适用场景

ArrayList与LinkedList的区别和适用场景 Arraylist: 优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。 缺点:因为地址连续,ArrayList要移动数据,所以插入和删除操作效率比较低。 LinkedList: 优点:LinkedList基于链表的数据结构,地址是任意的,所...

zs88897的博客 1756

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

mysql集合与集合的子集_大集合List分为多个子集合

importcom.duotin.util.beans.SubListView;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;/**** Created by xueshan on 17/1/22.*/public classCommonBusiLogic {/***将大集合分成多个子集合*@p...

weixin_42514627的博客 441

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

迷你项目练习题4用户登录与用户注册(异常处理)

题目 (自定义异常)完成某个计费系统的用户登录和注册模块,要求如下: 1) 创建一个 User 类,包括:用户登录名(username)、密码(password)、用户真实姓名(name)、电子邮件地址(email)属性和相应的构造方法及 set/get 方法。 2) 创建两个自定义异常类,一个 LoginException,表示登录异常。一个 RegisterException, 表示注册异常。自定义的两个异常,都要求有一个接受字符串类型参数的构造方法。 3) 创建一个 UserBiz 接口,该接口中定

hypertext123的博客 1097

JavaSEDemo05

文章目录void方法中使用return语句的情况 void方法中使用return语句的情况

hypertext123的博客 605

JavaSE常见错题整理

文章目录条件分支 条件分支 对于switch/case语句以下说法正确的有。 A、default语句是可选的,但是如果出现default则必须位于所有的case后面 B、case子句后面的值必须是常量,且不可重复 C、switch后面的表达式的值如果是数值型,则必须是可精确匹配的整数值,如int\long,而不能是浮点数 D、case后面的break是必选的,不能省略break 正确答案:B选项 错误分析: A选项,default语句可以不放在所有的case后面 C选项,switch/case不支持lon

hypertext123的博客 602

简单的方法递归题

文章目录题目1:卖鸭子题目2:不死神兔 题目1:卖鸭子 一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子? 解题思路:用数学思想解决此类问题比较简单。此题是知道还剩下多少鸭子,不知道一开始有多少鸭子,为知尾不知头的类型。所以我们要寻找F(n)与F(n+m)的规律,m是题中数据发生显著变化的间隔,本题m=1,因为每经过1个村子,数据就会发生变化。 设一个函数F(n),F为经过n个村子后鸭子的数量,n为

hypertext123的博客 596

JavaSEDemo32IO流与网络编程

文章目录简介易错练习练习1练习2练习3练习4练习5文件知识点复习什么是文件FileFile最常用的方法FilenameFilter 过滤某一个文件夹下的所有以xxx结尾或者开头或者包含的文件列表路径IO流流的概念流的分类字节流字符流 简介 易错练习 练习1 以下说法正确的是?【单项选择题题】【简单】 A.RandomAccessFile类是File类的子类 B.FileWriter类提供有操作基本数据类型的方法 C.RandomAccessFile类提供有删除磁盘文件的方法 D.File类提供有删除磁盘文件

hypertext123的博客 579

JavasSEDemo31IO流

文章目录简介易错练习题练习1 简介 本文是2021/04/29整理的笔记 赘述可能有点多,还请各位朋友耐心阅读 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进 易错练习题 练习1 byte b = 127; System.out.println(-b); 选择程序运行结果 A、-127 B、0 C、-128 D、运行错误 答案 A ...

hypertext123的博客 557

迷你项目练习题3遥控器播放CD DVD Tape

题目 定义一个接口 MediaPlayer,表示家庭影院的一个设备。MediaPlayer 中 包含 play(),stop(), open()三个方法,分别表示播放、停止和开仓功能。 MediaPlayer 有三个实现类,分别为:DVDPlayer,表示 DVD 播放器;CDPlayer, 表示 CD 播放器;TapePlayer,表示录音机(播放磁带)。 类图如下: 创建一个遥控器 Controller 类。该遥控器有三个控制通道,可以分别控制三个 设备。部分代码如下: class Controlle

hypertext123的博客 529

JavaSEDemo07

文章目录简介(多态)写一个函数,接受一个图形作为参数,打印出该图形的周长和面积题目分析代码示例Shape类Triangle类Circle类Square类Rectangle类ShapeTest类程序运行结果 简介 本文是2021/03/29整理的笔记 赘述可能有点多,还请各位朋友耐心阅读 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进。 (多态)写一个函数,接受一个图形作为参数,打印出该图形的周长和面积 (1)父类图形Shape类 (2)子类三角形Triangel类 (3)子类圆形Ci

hypertext123的博客 518

JavaSEDemo11Lambda表达式与枚举

文章目录简介易错练习题练习题1 代码改错练习题2LambdaLambda表达式 如果方法只有一个参数 可以不写数据类型和( )Lambda表达式 可以不写数据类型,会自动寻找Lambda表达式 没有返回值的方法成员匿名内部类用Lambda省略只有一个抽象方法的接口叫做函数类接口::操作符绑定静态 成员 构造 三种方法静态成员构造枚举switch语句使用枚举枚举类的常用方法枚举的构造方法枚举实现接口枚举中声明抽象方法枚举中重写父类方法,例如toString方法 简介 本文是2021/04/05整理的笔记 赘

hypertext123的博客 455

JavaSEDemo17线程池调度器与ThreadLocal

文章目录易错练习题练习1练习2 代码改错练习3练习4练习5 读程序写结果 易错练习题 练习1 class MyValue{ private int data; public void m(){ int result = 0; result += 2; data += 2; System.out.println(result + “ ” + data); } } class MyThread extends Thread{ private MyValue mv; public MyThread(MyValue

hypertext123的博客 413

JavaSEDemo12

文章目录易错练习题练习题1练习题2练习题3练习题4练习题5练习题6方法重写时的规则 易错练习题 练习题1 练习题2 练习题3 练习题4 练习题5 练习题6 方法重写时的规则 当子类对父类方法进行重写时 方法签名(方法名称和参数列表)需保持一致 子类方法的访问权限大于等于父类方法的访问权限 引用类型,子类方法的返回值类型小于等于父类方法的返回值类型 基本类型,返回值类型保持相同。 ...

hypertext123的博客 397

迷你项目练习题2猜拳游戏

文章目录题目题目分析代码展示Player类Computer类Test类程序运行结果 题目 用面向对象编程的思想,设计一个猜拳游戏,完成人机猜拳互动游戏的开发。 功能: 选取对战角色 猜拳 记录分数 题目分析 共需要5个类 自定义类:Player玩家类 Computer电脑类 Test测试类 导入类:Scanner类 Random类 代码展示 Player类 public class Player { //玩家名字 private String name; //玩家得分

hypertext123的博客 375
上一篇: JavaSEDemo23集合
下一篇: JavaSEDemo25Map
香鱼嫩虾
博客等级 码龄7年 1671粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

香鱼嫩虾

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

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

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

打赏作者

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

抵扣说明:

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

余额充值