Java集合框架详解(特容易上手)(中篇)

使用工具IntelliJ IDEA Community Edition 2023.2.4

使用语言 Java8

本章只负责讲一些基本集合框架接口实现类,剩下的Map集合框架接口和泛式集合交给下一章节来进行讲解,代码速成小秘诀,看完代码自己再敲一遍,绝对学得快

目录

2.List

2.1 List概述

2.1.1 List扩展方法

2.1.2  List的常用实现类

2.2 ArrayList集合类详解

2.2.1 ArrayList贯通案例

2.3 LinkedList集合类详解

2.3.1 ArrayList集合的缺陷

2.3.2 LinkedList的常用特有方法

2.3.3 LinkedList贯通案例

2.4 ArrayList和LinkedList的优缺点

2.4.1 ArrayList集合

2.4.2 LinkedList集合

3.Set

3.1 HashSet集合

3.1.1 HashSet类特征

3.2 HashSet贯穿案例

3.3 底层逻辑中Set和List的区别

4. Map


2.List

List集合是一类存储元素有序、可重复的集合,集合中每个元素都有其对应的索引。List集合允许使用重复元素,可以通过索引访问指定位置的集合元素。

2.1 List概述

List接口作为Collection接口的子接口,可以使用Collection接口定义的全部方法。由于List集合是有序集合,所以List接口在Collection接口方法(这个在上篇有讲解噢)的基础上,另外扩展了一些根据索引操作集合元素的方法,如下所示:

2.1.1 List扩展方法

void add(int index,Object element)

  •     将元素(element)插入List集合的指定位置(index)
  •     在原索引(index)数据位置前插入数据

boolean addAll(int index,Collection c)

  •     将集合c所包含的所有元素都插入List集合的指定位置(index)

Object get(int index)

  •     返回集合index索引处的元素

int indexOf(Object o)

  •     返回对象o在List集合中第一次出现的位置索引

int lastIndexOf(Object o)

  •     返回对象o在List集合最后一次出现的位置索引

Object remove(int index)

  •     从集合中删除指定位置的元素
  •     按照索引删除

boolean remover(Object o)

  •     从集合中删除指定对象
  •     按照对象删除

Object set(int index,Object element)

  •     将index索引处的元素替换成Element对象,返回新元素
  •     调用set(int index,Object element)方法改变List集合指定索引处的元素时,指定的索引必须是List集合的有效索引。例如长度是4,不能指定替换index值为4的元素,即该方法不会改变List集合的长度。

List subList(int fromIndex,int toIndex)

  •     返回从索引包含(fromIndex)到索引不包含(toIndex)处所有集合元素组成的子集合
  •     就是截取从索引fromIndex到索引toIndex中的所有元素,不包含toIndex索引的那一个元素,但是包含fromIndex索引的那个元素及在toIndex前的所有元素

2.1.2  List的常用实现类

所有的List集合都可以调用以上的方法操作集合元素。List集合比Collection接口扩充了更多的方法,而且这些方法操作起来很方便,需要通过List接口的子类实例化对象调用。常用的子类有ArrayList类和LinkedList类,它们的集合对象都可以容纳所有类型的元素对象,包括null,允许重复,并且保证元素按顺序存储。

  1. ArrayList类对数组进行了封装,实现了长度可变的数组。ArrayList集合存储数据的方式和数组相同,都是在内存中分配连续的空间。
  2. LinkedList集合存储数据的方式为双向链表存储方式,它的每个节点中都有两个指针,分别指向直接后继和直接前驱。它提供了额外的addFirst()、addLast()、removeFirst()和removeLast()等方法,可以在链表的首部或尾部进行插入或删除操作。

2.2 ArrayList集合类详解

元素个数不确定,但有一定顺序,可以使用List接口的实现类ArrayList完成该需求。

由于ArrayList集合类是List的实现类,因此可以使用List接口的扩展方法;

ArrayList集合类中要获取元素的索引值需要ArrayList中的对象名.get(索引);

2.2.1 ArrayList贯通案例

案例需求

  • 向集合中添加水果信息
  • 向指定排序位置新增水果信息
  • 删除指定排序位置的水果信息
  • 更新指定位置的水果信息
  • 截取指定部分的水果信息集合

具体实现步骤

  • 创建多个Fruit对象,将其添加到ArrayList集合对象中
  • 使用remove(int index)、remove(object o)方法实现删除水果
  • 使用set()方法实现更新指定位置水果信息
  • 使用subList()方法实现截取子集合

实现代码 

package com.testPack;

import java.util.ArrayList;
import java.util.List;

/**
 * 测试类
 */
public class ArrayListTest {
    public void show(List list){
        /**
         * List遍历方法1
         */
        for(Object obj : list){
            Fruit fruit=(Fruit) obj;
            System.out.println(fruit.name+",每斤"+fruit.money+"元。");
        }
        /**
         * List遍历方法2
         */
//        for (int i = 0; i < list.size(); i++) {
//            Fruit fruit=(Fruit) list.get(i);
//            System.out.println(fruit.name+",每斤"+fruit.money+"元。");
//        }
    }
    public static void main(String[] args) {
        ArrayListTest arrayListTest=new ArrayListTest();
        List list=new ArrayList();
        Fruit fruit1=new Fruit("苹果1号",2.5);
        Fruit fruit2=new Fruit("苹果2号",2.0);
        Fruit fruit3=new Fruit("苹果3号",3.5);
        Fruit fruit4=new Fruit("苹果4号",3.0);
        System.out.println("向集合中存储信息");
        list.add(fruit1);
        list.add(fruit2);
        list.add(fruit3);
        arrayListTest.show(list);
        System.out.println("将4号苹果插入第2个位置");
        list.add(1,fruit4);
        arrayListTest.show(list);
        System.out.println("删除第三个元素");
        list.remove(2);
        arrayListTest.show(list);
        System.out.println("将第二个元素替换成新元素");
        list.set(1,new Fruit("无名苹果",1.0));
        arrayListTest.show(list);
        System.out.println("截取子字符串");
        arrayListTest.show(list.subList(1,2));
    }
}

 打印结果

由于遍历方法2中的List集合中放的都是Object类型对象,所以add(Object o)方法的参数是Object类的对象,即使在调用时实际参数是Fruit类的对象,但系统认为里面只是Object类的参数,所以在通过get(int i)方法获取元素时必须进行强制转换;

2.3 LinkedList集合类详解

2.3.1 ArrayList集合的缺陷

由于ArrayList集合采用了和数组相同的存储方式,在内存中分配连续的空间,当添加和删除非尾部元素时会导致后面所有元素的移动,性能低下,所以在插入、删除操作较频繁时,可以考虑使用LinkedList集合提高效率。

2.3.2 LinkedList的常用特有方法

这些方法是LinkedList特有的方法,如果是父父new子就无法调用这些方法

LinkedList类是List接口的实现类,这就意味着LinkedList集合和ArrayList集合都是一个List集合,可以根据索引随机访问集合中的元素。除此之外,LinkedList集合还具有双向链表结构,更加方便实现添加和删除操作。基于LinkedList集合的特征,它除了List的扩展方法外,还提供了实现链表操作的方法,如下所示:

void addFirst(Object o)
    在链表的首部添加元素
void addLast(Object o)
    在链表的末尾添加元素
Object getFirst()
    返回链表中第一个元素
Object getLast()
    返回链表中最后一个元素
Object removeFirst()
    删除并返回链表中的第一个元素
Object removeLast()
    删除并返回链表中的最后一个元素

2.3.3 LinkedList贯通案例

打印结果

2.4 ArrayList和LinkedList的优缺点

2.4.1 ArrayList集合

ArrayList集合的底层是数组:

优点:
    基于数组实现,读取操作效率高;
缺点:
    不适合频繁进行插入和删除操作,因为每次执行该类操作都需要频繁移动其中的元素;

2.4.2 LinkedList集合

优点:
    增加、删除操作只需修改链表节点指针,无需进行频繁的移动;
缺点:
    遍历效率低;

3.Set

Set接口和List接口一样,都是Collection的子接口,它类似于一个罐子,丢进Set集合里的多个对象没有明显的顺序。Set集合与Collection集合基本一样,没有提供额外的方法,只是行为上略有不同,Set集合不允许包含重复元素。

3.1 HashSet集合

3.1.1 HashSet类特征

HashSet类是Set接口的典型实现,使用HashSet集合可以实现对无序不重复数据的存储,具有很好的存取和查找性能。它具有以下特征:

  • 不允许存储重复的元素;
  • 没有索引,没有包含索引的方法,不能用索引遍历;
  • 是无序集合,存储元素和取出元素的顺序可能不一致;

3.2 HashSet贯穿案例

打印结果

3.3 底层逻辑中Set和List的区别

从上面的运行结果中可以看出,向Set集合中添加重复的对象fruit1时,添加操作失败。在执行该操作时,程序会将新添加的对象依次和集合中现有的元素进行比较,判断集合中是否存在与所添加对象相同的元素(通过执行集合元素的hascode()方法和equals()方法进行判断),如果不存在则添加成功,否则,添加失败。
由于Set集合中存储的元素是无序的,无法使用索引,所以不能使用索引进行遍历,这是和List集合明显的区别。 

4. Map

继续敬请期待吧!!

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值