集合

本文详细介绍了Java集合框架中的List、Set和Map三大类,对比了它们的长度可变性、元素排序及典型实现类,如ArrayList、LinkedList和HashMap、TreeMap。展示了如何使用这些集合以及它们在实际编程中的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合

  • 集合又被称为容器

  • 集合与数组的区别:

数组的长度是固定的; 用来存放基本类型的数据

集合的长度是可变的;用来存放对象的引用

常用的集合有:

List集合、Set集合、Map集合,其中List 和 Set 继承了 COllection (Collection 接口是层次结构中的根接口,构成 Collection 的单位称为元素)

继承关系图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2NGIH5sJ-1618404892769)(C:\Users\34747\Desktop\屏幕截图\屏幕截图 2021-04-14 092828.png)]

Collection

  • Collection 接口的常用方法
方法功能描述
add(E e)将指定对象添加到集合中
remove(Object o)将指定对象从该集合中移除
isEmpty()返回boolean值,用于判断当前集合是否为空
iterator()返回在此Collection的元素上进行迭代的迭代器。用于遍历集合中的对象
size()返回int型值,获取该集合中元素的个数

例:

import java.util.*;
public class Test {
    public static void main(String[] args) {
        Collection<String> list = new ArrayList<>();  //实例化集合类对象
        list.add("jiang");  //add 添加对象
        list.add("zi");
        list.add("wen");
        Iterator<String> it = list.iterator();  //创建迭代器
        while(it.hasNext()){                    //判断是否有下一个元素
            String str = (String) it.next();    //获取集合中的元素
            System.out.println(str);
        }
    }
输出结果:jiang
         zi
         wen

List集合

  • List 集合包括 List接口以及 List接口的所有实现类。List集合中的元素允许重复,各元素的顺序就是对象插入的顺序。
  • 和数组一样,用户可以通过索引(下标)来访问集合中的元素

get(int index) :获得指定下标位置的元素

set(int index ,Object obj):将集合中指定下标位置的对象修改为指定对象

  • List接口的实现类

ArrayList 类实现了可变的数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问;缺点是向指定的索引位置插入对象或删除对象的速度较慢

LinkedList 类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入或删除对象时,使用LinkedList类实现List集合的效率较高;对于随机访问集合中的对象时,使用LinkedList 类实现List集合的效率较低

  • 分别通过ArrayList 、LinkedList 类实例化集合:
List<E> list = new ArrayList<>();

List<E> list2 = new LinkedList<>();
//创建Gather类,在main方法中创建集合对象,通过Math类的random()方法随机获取集合中的某个元素,然后移除索引是'2'的元素,最后便利数组
public class Gather {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();    //创建集合对象
        list.add("j");     //add 添加对象
        list.add("Z");
        list.add("w");
        int i = (int)(Math.random()*list.size());       //获得下标0~2之间的随机数字a
        System.out.println("随机获取的元素: "+ list.get(i));
        list.remove(2);                     //remove: 删除指定下标的对象
        System.out.println("将索引是'2'的元素删除后数组的元素为:");
        for (int j = 0; j < list.size(); j++) {    //循环遍历集合
            System.out.println(list.get(j));
        }
    }
}

与数组相同,索引从0开始



Set集合

  • Set 集合中的对象不按特定的方式排序,只是简单的把对象加入集合中,但是Set集合不能出现重复的对象。
  • Set 集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection接口的所有方法

Set接口常用的实现类有HashSet类和TreeSet类

  • HashSet类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。他不保证Set的迭代顺序,特别是他不保证该顺序一直不变(无序)。此类允许使用null元素

  • TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序(自动排序)

  • TreeSet 类增加的方法

方法功能描述
first()返回此Set中当前第一个元素
last()返回此Set中当前最后一个元素
comparator()返回对此Set中的元素进行排序的比较器。如果此Set使用自然排序,则返回null
headSet(E toElement)返回一个新的Set集合,是fromElement(不包含)之前的所有对象
subSet(E fromElement,E fromElement)返回一个新的Set集合,是fromElement(包含)对象与fromElement(不包含)对象之间的所有对象
tailSet(E fromElement)返回一个新的Set集合,新集合包含对象fromElement(包含)之后的所有对象

例:

//创建类UpdateStu,实现Comparable 接口,重写该接口中的compareTo()方法。在主方法中创建UpdateStu对象,创建集合,并将UpdateStu对象添加到集合中。遍历该集合中的所有元素,并且通过 headSet()和subSet()方法获得相应的集合

import java.util.Iterator;
import java.util.TreeSet;

public class UpdateStu implements Comparable<Object>{  //创建类实现Comparable 接口


    String name;
    Long id;

    public UpdateStu(String name,Long id){  //构造方法
        this.id = id;
        this.name = name;
    }
    public int compareTo(Object o){
        UpdateStu upstu = (UpdateStu) o;
        int result = id>upstu.id ? 1 :(id == upstu.id ? 0 : -1);   //参照代码说明
        return result;
    }
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public Long getld(){
        return id;
    }
    public void setld(long id){
        this.id = id;
    }


    public static void main(String[] args) {
        UpdateStu stu1 = new UpdateStu("李同学", 01011L);     //创建 UpdateStu 对象
        UpdateStu stu2 = new UpdateStu("陈同学", 01021L);
        UpdateStu stu3 = new UpdateStu("王同学", 01051L);
        UpdateStu stu4 = new UpdateStu("马同学", 01012L);
        TreeSet<UpdateStu> tree = new TreeSet<>();
        tree.add(stu1);                    //add 向集合添加对象
        tree.add(stu2);
        tree.add(stu3);
        tree.add(stu4);
        Iterator<UpdateStu> it = tree.iterator();      //Set 集合中的所有对象的迭代器
        System.out.println("Set中的所有元素:");
        while(it.hasNext()){                            //遍历集合
            UpdateStu stu = (UpdateStu) it.next();
            System.out.println(stu.getld()+" "+stu.getName());
        }
        it = tree.headSet(stu2).iterator();               //截取排在stu2对象之前的对象
        System.out.println("截取前面部分的集合:");
        while(it.hasNext()){                         //遍历集合 
            UpdateStu stu = (UpdateStu) it.next();
            System.out.println(stu.getld()+" "+stu.getName());
        }
        it = tree.subSet(stu2,stu3).iterator();         //截取排在stu2和stu3之间的对象
        System.out.println("截取中间部分的集合:");
        while(it.hasNext()){                           //遍历集合
            UpdateStu stu = (UpdateStu) it.next();
            System.out.println(stu.getld()+" "+stu.getName());
        }
    }
}
输出结果:
Set中的所有元素:
521 李同学
522 马同学
529 陈同学
553 王同学
截取前面部分的集合:
521 李同学
522 马同学
截取中间部分的集合:
529 陈同学

存入TreeSet类实现的Set集合必须实现Comparable接口,该接口中的compareTo()方法比较此对象与指定对象的顺序。如果该对象小于、等于、或大于指定对象,则分别返回负整数、0、或正整数。



Map集合

  • Map 集合没有继承Collection接口,其提供的是key到value的映射。Map中不能包含相同的key,每个key只能映射一个value。key还决定了存储对象在映射中的存储位置,但不是由key对象本身决定的,而是通过一种“散列技术”进行处理,产生一个散列码的整数值。

  • 散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置。

  • Map接口

Map接口提供了将key映射到值得对象。一个映射不能包含重复得key,每个key最多只能映射到一个值。

  • Map接口中得常用方法
方法功能
put(K key,V value)向集合中添加指定的key与value的映射关系
containsKey(Object key)如果此映射包含指定key的映射关系,则返回true
containsValue(Object value)如果此映射将一个或多个key映射到指定值,则返回true
get(Object key)如果存在指定的key对象,则返回该对象对应的值,否则返回null
keySet()返回该集合中的所有key对象形成的Set集合
values()返回该集合中所有值对象形成的Collection集合

例:

//创建类,在主方法中创建map集合,并获取集合中所有key对象的集合和所有values值得集合

public class MapTest<S, S1> {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();     //创建Map实例
        map.put("01","李同学");      //put 向集合中添加元素
        map.put("02","魏同学");
        Set<String> set = map.keySet();     //构建Map集合中所有key对象的集合
        Iterator<String> it = set.iterator();  //创建集合迭代器
        System.out.println("key集合中的元素:");
        while(it.hasNext()){                //遍历集合
            System.out.println(it.next());
        }
        Collection<String> coll = map.values();   //构建Map集合中所有values 值的集合
        it = coll.iterator();
        System.out.println("value中的元素:");
        while(it.hasNext()){         //遍历集合
            System.out.println(it.next());
        }
    }
}

输出结果:
key集合中的元素:
01
02
value中的元素:
李同学
魏同学

Map集合中允许值对象是null,而且没有个数限制。例如,可以通过"map.put(“05”,null);" 来向集合中添加对象

  • Map接口的实现类

Map接口常用得实现类有 HashMap 和 TreeMap。建议使用 HashMap 类实现Map集合,因为由 HashMap 类实现的 Map 集合添加和删除映射关系效率更高

  • HashMap 是基于哈希表的Map接口的实现,HashMap通过哈希码对其内部的映射关系进行快速查找

  • 而TreeMap 中的映射关系存在一定的顺序,如果希望Map集合中的对象也存在一定的顺序,应该使用TreeMap类实现Map集合

  • HashMap 类是基于哈希表的Map接口的实现,此实现提供所有可选的映射操作,并允许使用null值和null键,但必须保证键的唯一性。HashMap 通过哈希表对其内部的映射关系进行快速查找。此类不保证映射的顺序,特别是它不保证该顺序一直不变(无序)

  • TreeMap 类不仅实现了Map接口,还实现了java.util.SortedMap 接口,因此,集合中的映射具有既定的映射顺序。但在添加、删除、定位映射关系时,TreeMap 类比 HashMap 类性能较差。由于TreeMap 类实现的Map集合中的映射关系是根据键对象按照一定的顺序排列的,因此不允许键对象是null

例:

//创建Emp类
public class Emp {
    private String e_id;
    private String e_name;
    public Emp(String e_id,String e_name){
        this.e_id = e_id;
        this.e_name = e_name;
    }
   //get、set方法
    public String getE_id() {
        return e_id;
    }

    public void setE_id(String e_id) {
        this.e_id = e_id;
    }

    public String getE_name() {
        return e_name;
    }

    public void setE_name(String e_name) {
        this.e_name = e_name;
    }
}
//创建一个用于测试的主类。先创建一个Map集合,并添加集合对象。分别遍历由HashMap类与TreeMap类实现的Map集合
import java.util.*;

public class MapText {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();          //由HashMap 实现的 Map集合

        Emp emp = new Emp("315","张三");       //创建Emp对象
        Emp emp2 = new Emp("512","李四");
        Emp emp3 = new Emp("853","王一");
        Emp emp4 = new Emp("125","赵六");
        Emp emp5 = new Emp("341","黄七");

        map.put(emp4.getE_id(),emp4.getE_name());           //将对象添加到集合中
        map.put(emp5.getE_id(),emp5.getE_name());
        map.put(emp.getE_id(),emp.getE_name());
        map.put(emp2.getE_id(),emp2.getE_name());
        map.put(emp3.getE_id(),emp3.getE_name());

        Set<String> set = map.keySet();                     //获取Map集合中的Key对象集合
        Iterator<String> it = set.iterator();
        System.out.println("HashMap 类实现的Map集合,无序:");
        while(it.hasNext()){                                 //遍历Map集合
            String str = (String) it.next();
            String name = (String) map.get(str);
            System.out.println(str+" "+ name);
        }
        TreeMap<String,String> treemap = new TreeMap<>();         //创建TreeMap 集合对象
        treemap.putAll(map);                                        //向集合添加对象
        Iterator<String> iter = treemap.keySet().iterator();
        System.out.println("TreeMap 类实现的Map集合,键对象升序:");
        while(iter.hasNext()){                               //遍历集合
            String str = (String) iter.next();              //获取集合中所有key对象
            String name = (String) treemap.get(str);        //获取集合中所有values值
            System.out.println(str + " "+ name);
        }
    }
}
输出结果:
HashMap 类实现的Map集合,无序:
341 黄七
125 赵六
512 李四
853 王一
315 张三
TreeMap 类实现的Map集合,键对象升序:
125 赵六
315 张三
341 黄七
512 李四
853 王一

内容概要:本文档是详尽的 Android SDK 中文帮助文档,介绍了 Android SDK 的核心概念、组件、开发环境搭建、基础开发流程及常用工具使用指南。首先解释了 Android SDK 的定义及其核心价值,即提供标准化开发环境,使开发者能高效构建、测试、优化 Android 应用。接着详细列出了 SDK 的核心组件,包括 Android Studio、SDK Tools、Platform Tools、Build Tools、Android 平台版本和系统镜像。随后,文档提供了详细的环境搭建步骤,适用于 Windows、macOS 和 Linux 系统,并介绍了基础开发流程,以“Hello World”为例展示了从创建项目到运行应用的全过程。此外,还深入讲解了 ADB、AVD Manager 和 SDK Manager 等核心工具的功能和使用方法。最后,文档涵盖了调试与优化工具(如 Logcat、Profiler 和 Layout Inspector)、关键开发技巧(如多版本 SDK 兼容、Jetpack 库的使用和资源文件管理)以及常见问题的解决方案。 适合人群:具有初步编程知识,希望深入了解 Android 应用开发的开发者,尤其是新手开发者和有一定经验但需要系统化学习 Android SDK 的技术人员。 使用场景及目标:①帮助开发者快速搭建 Android 开发环境;②指导开发者完成基础应用开发,理解核心工具的使用;③提高开发效率,掌握调试与优化技巧;④解决常见开发过程中遇到的问题。 阅读建议:此文档内容全面且实用,建议读者按照章节顺序逐步学习,结合实际开发项目进行练习,尤其要注意动手实践环境搭建和基础开发流程,同时参考提供的扩展学习资源,进一步提升开发技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ShallwetaIk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值