JAVA:ArrayList集合与HashSet集合

本文详细介绍了Java中的List接口(以ArrayList为例)和Set接口(特别是HashSet)的用法,包括添加、删除、查找等操作,并通过实际案例探讨了ArrayList与HashSet的结合应用,重点突出了HashSet的去重特性以及LinkedHashSet的有序性。

目录

一,前言

二、

1、List接口

1.1ArrayList集合

1.2List集合常见用法及 ArrayList集合案例

2、Set接口

2.1HashSet集合

2.2HashSet集合的用法及案例

3、ArrayList集合与HashSet集合的综合应用

3.1案例分析

参考文献:


一,前言

                为了在程序中保存数目不确定的对象,Java 提供了一系列特殊的类, 这些类可以存储任意类型的对象,并且长度可变,这些类统称为集合。集合类都位于javauil包中,使用时必须导包。

测试环境:Windows11、IntelliJ IDEA 2023.1

二、

1、List接口

1.1ArrayList集合

        ArayList是List接口的一个实现类, 它是程序中最常见的种集合。 在ArrayList内部封装了一个长度可变的数组对象,当存人的元素超过数组长度时,ArayI ist会在内存中分配个更大的数组来存储这些元素,因此可以将ArayList集合看作一个长度可变的数组。

1.2List集合常见用法及 ArrayList集合案例

        ArrayList集合大部分方法都是从父类Collection和List继承过来的,以下列表1-1为List集合的常见用法。

表1-1
方法声明功能描述
void add(int index,Object element)将元素element插入在List集合的index处
boolean addAll (int index, Collection c)将集合C所包含的所有元素插入到List集合的index处
Object get (int index)返回集合索引index处的元素
Object remove ( int index )删除集合索引index处的元素
Object set (int index, Object element)将集合索引index处元素替换成element对象,并将替换后的元素返回
int indexOf (Object o)
 
返回对象o在List集合中出现的位置索引

int lastIndexOf (Object o)
 
返回对象0在List集合中最后一次出现的位置索引

List subList (int fromIndex, int toIndex )
返回从索引fromIndx (包括)到toIndx (不包括)处的所有元素的子集合

        以下为ArrayList集合案例:

   ArrayList list=new ArrayList();//创建ArrayList集合
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("ee");
        //打印list中的元素
        System.out.println(list);
        //结果为:[aa, bb, cc, ee]
        ArrayList C=new ArrayList();
        C.add("ff");
        C.add(0,"dd");
        list.addAll(3,C);
        //打印出加入C集合后的list集合
        System.out.println(list);
        //结果为:[aa, bb, cc, dd, ff, ee]

        //返回位处于list集合2位置的元素
        System.out.println(list.get(1));
        //结果为:bb

        //删除集合位置为4的元素,并打印出删除后的list集合
        list.remove(3);
        System.out.println(list);
        //结果为:[aa, bb, cc, ff, ee]

        //将位置为5的元素换为“aa”,并打印出替换后的list集合
        list.set(4,"aa");
        System.out.println(list);
        //结果为:[aa, bb, cc, ff, aa]

        //返回元素“aa"在list集合的位置索引
        System.out.println(list.indexOf("aa"));
        //结果为:0

        //返回元素“aa"在list集合出现的最后一次位置索引
        System.out.println(list.lastIndexOf("aa"));
        //结果为:4

        //返回元素从索引1到索引3的所有元素组成的子集合
        System.out.println(list.subList(1,3));
        //结果为:[bb, cc]

索引的取值范围是从0开始的。在访问元素时一定要注意索引不可超出范围否则会抛出角标越界异常

IndexOutOfBoundsException

由于ArmayList 集合的底层使用个数组来保存元素, 在增加或删除指定位置的元素时,会创建新的数组。效率比较低,因此不适合做大量的增加或删除操作。因为这种数组的结构允许程序通过索引的方式来访问元素。

2、Set接口

2.1HashSet集合

                HashSet集合之所以能确保不出现重复的元素,是因为调用HashSet集( )方法存人元素时, 首先调用当前存人对象的hashCode ( )方法获得对象的散列值, 然后根据对象数列值计算出一个存储位置。如果该位置上没有元素,则直接将元素存人,如果该位置上有元素存在,则会add( )方法让当前存人的元素依次与该位置上的元索进行比较,如果这返回的结果为false就将该元素存入,如果返回的结果为true则说明有重复元素,将该元素含弃。

2.2HashSet集合的用法及案例

                HashSet是的使用方法和返回值与Collection接口基本一致,并不会像List接口的使用方法一样。HashSet的返回类型与Collection接口是基本一致的。表1-2为Collection接口的使用方法,此方法List接口也可以使用,返回的类型与Collection接口有一点不同。

表1-2
方法声明功能描述
boolean add (Object o)向集合中添加一个元素
boolan addAll ( Collection c)将指定Cllection中的所有元素添加到该集合中
void clear ( )删除该集合中的所有元素
boolean remove ( Object o )删除该集合中指定的元素
boolean removeAll ( Collection c)删除指定集合中的所有元素
boolean isEmpty ( )判断该集合是否为空
boolean contains ( Object o)判断该集合中是否包含某个元素
boolean containsAll ( Collection c)判断该集合中是否包含指定集合中的所有元素
lteraltor iterator ( )返回在该集合的元素上进行迭代的迭代器( lterator),用于遍历该集合所有元素
int size ( )获取该集合元素个数

以上Collection接口继承的功能就不作案例,我们以HashSet集合的特定功能作为案例展示:

 HashSet set =new HashSet();//创建HashSet集合
        set.add("aa");
        set.add("bb");
        set.add("cc");
        set.add("dd");
        //打印list中的元素
        System.out.println(set);
        //结果为:[aa, bb, cc, dd]
        //删除集合中元素”cc”,并打印HashSet集合
        set.remove("cc");
        System.out.println(set);
        //结果为:[aa, bb, dd]
        //添加集合中有相同的元素与不相同的元素,并打印添加元素后的HashSet集合
        set.add("aa");
        set.add("cc");
        set.add("ee");
        System.out.println(set);
        //结果为:[aa, bb, dd, cc, ee]

在HashSet集合的案例展示中我们可以看出,在添加重复值时,是添加失败的。HashSet集合是一个无序的集合,不能像List集合那样查取到元素的的位置。

3、ArrayList集合与HashSet集合的综合应用

3.1案例分析

下面我们通过一个案例来分析他们的综合应用。我们以码题集的竞赛题MC0222文章压缩为例分析,以下为题目和代码案例。图2-1为案例题目,题2-2为输入和输出结果。

图2-1

图2-2

以下为根据题目编写的代码: 

  Scanner input = new Scanner(System.in);
      // code here
       int n = input.nextInt();
        ArrayList list = new ArrayList();
        HashSet set = new LinkedHashSet();//LinkedHashSet()使得set集合添加元素是有序的

        for (int i = 0; i < n; i++) {
            String s = input.next();
            list.add(s);
            set.add(s);
        }

        for (Object obj : set) {     //将set集合的元素循环遍历
            StringJoiner sj = new StringJoiner(",", "(", ")");// 每个元素通过 "," 分割,并且用 "(" 和 ")" 包住前后
            for (int i = 0; i < list.size(); i++) {
                if (list.get(i).equals(obj)) {      //判断list里的元素是否与set遍历到的元素相同
                    sj.add(String.valueOf(i + 1));//将i+1转化为字符串类型
                }
            }
            System.out.print(obj + sj.toString());
        }

我们在题目中用到 :

  HashSet set = new LinkedHashSet();//LinkedHashSet()使得set集合添加元素是有序的

是为了确保我们在输入的元素中保证元素的输入们有重复的,以及保证我们在输入时,保证输入的和输出的时有序的。 

参考文献:

黑马程序员  JAVA基础案例教程 第2版 北京:人民邮电出版社(2022.9重印)

Collection接口使用方法参考:

Java集合Collection接口(超详解)_java collection接口-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_57486248/article/details/132218200?ops_request_misc=&request_id=&biz_id=102&utm_term=Collection%E6%8E%A5%E5%8F%A3&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-132218200.nonecase&spm=1018.2226.3001.4187

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值