首页 > 编程语言 >20、javase-API.容器

20、javase-API.容器

时间:2025-01-10 16:30:44浏览次数:3  
标签:元素 20 hashMap int Object list API 集合 javase

为了在程序中可以保存数目不确定对象,Java提供了一系列特殊的类容器

位于 java.util 包中,使用时必须导包。

在这里插入图片描述

容器按照其存储结构可以分为两大类

  • 单列集合Collection
    • List:元素有序、可重复
      • ArrayList
      • LinkedList
    • Set:元素无序,不可重复
      • HashSet
      • TreeSet
  • 双列集合Map,用于存储具有键(Key)、值(Value)映射
    • HashMap
    • TreeMap

一、List 接口及实现类

1、List接口

List接口,位于java.util包,承自Collection接口,用于存储一组有序的元素,并且允许元素重复出现。List接口中的常见方法如下(了解即可):

void add(Object element)	
    将元素element插入在List集合的尾部
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)	
    返回对象o在List集合中最后一次出现的位置索引
    
List<E> subList(int fromIndex, int toIndex)	
    返回从索引fromIndex(包括)到 toIndex(不包括)处所有元素集合组成的子集合

2、ArrayList实现类

  • ArrayList是 List 接口的数组实现方式。
  • ArrayList在查询元素时速度很快,但在增删元素时效率较低。

1)构造方法

ArrayList() 
    构造一个初始容量为 10 的空列表;
ArrayList(int initialCapacity)
    构造一个具有指定初始容量的空列表;
ArrayList(Collection<? extends E> c)
    构造一个包含指定集合元素的列表,按照集合迭代器返回元素的顺序。

例如:

ArrayList<String> strings = new ArrayList<>();

2)添加相关

boolean add(E e)
    将e附加到此list的末尾;
void add(int index, E element)
    在此list的指定位置前插入e;
boolean addAll(Collection<? extends E> c)
    将C中的所有元素,追加到此list的末尾;
boolean addAll(int index, Collection<? extends E> c)
    将C中的所有元素,插入到此list的index之前;

3)删除相关

E remove(int index)
    移除此list中指定位置的元素;
boolean remove(Object o)
    从此list中移除第一次出现的指定元素(如果存在);
boolean removeAll(Collection<?> c)
    从此list中移除指定集合中包含的所有元素;

boolean removeIf(Predicate<? super E> filter)
    移除此集合中满足给定谓词的所有元素;
    students.removeIf(student -> {
        return student.age >= 20;
    });

4)修改相关

E set(int index, E element)
    用指定元素替换此list中指定位置的元素;

5)查询相关

int size()
    返回此list中的元素数;
boolean isEmpty()
    如果此list不包含任何元素,则返回 true;
boolean contains(Object o)
    如果此list包含指定元素,则返回 true;
E get(int index)
    返回此list中指定位置的元素;
List<E> subList(int fromIndex, int toIndex)
    返回此list中指定的 fromIndex(含)和 toIndex(不含)之间的元素。

3、LinkedList实现类

  • List 接口的双向链表实现方式,LinkedList内部维护了一个双向循环链表,每个元素都使用引用的方式来记录它的前一个元素和后一个元素。
  • 对于元素的增删操作具有很高的效率,但查询效率不高。

LinkedList定义了一些特有的方法如下所示:

void addFirst(Object o)	
    将指定元素插入此列表的开头;
void addLast(Object o)	
    将指定元素添加到此列表的结尾;
Object getFirst()		
    返回此列表的第一个元素;
Object getLast()		
    返回此列表的最后一个元素;
Object removeFirst()	
    移除并返回此列表的第一个元素;
Object removeLast()		
    移除并返回此列表的最后一个元素;

4、循环迭代

ArrayList list = new ArrayList(); // 创建ArrayList集合
list.add("张三");                  // 向该集合中添加字符串
list.add("李四");
list.add("王五");
list.add("赵六");

方式1:

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

方式2:

for (String element : list) {
    System.out.println(element);
}

方式3:

//适用大量数据的场景 没有取到元素暂时不会占用内存

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

方式4

stus.forEach(student -> {
	System.out.println(student);
});

二、set接口及实现类

Set 接口概述

Set 是 Java 集合框架中的一个接口,位于java.util包中。它是Collection接口的子接口,用于存储一组无序(无序是指元素的存储顺序和插入顺序无关)且不包含重复元素的集合。Set 接口主要用于确保集合中的元素具有唯一性,常见的实现类有HashSetTreeSet

1、HashSet实现类

基本原理

HashSet 是基于哈希表(Hash Table)实现的。

元素添加(add)

HashSet<String> hashSet = new HashSet<>();
hashSet.add("apple");
hashSet.add("banana");
hashSet.add("apple");
System.out.println(hashSet);

元素删除(remove)

hashSet.remove("apple");
System.out.println(hashSet);

元素查找(contains)

System.out.println(hashSet.contains("banana"));

获取集合大小(size)

System.out.println(hashSet.size());

HashSet 的元素唯一性原理

当向 HashSet 中添加元素时,首先会调用元素的hashCode方法来获取元素的哈希码,根据哈希码确定元素在哈希表中的存储位置。如果两个元素的哈希码相同,会进一步调用equals方法来判断它们是否真正相等。只有当hashCodeequals方法都表明两个元素相同时,才认为它们是重复元素,不会将新元素添加到集合中。

例如:

public class Student {
    String sno;
    String sname;

    public Student(String sno, String sname) {
        this.sno = sno;
        this.sname = sname;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(sno, student.sno) && Objects.equals(sname, student.sname);
    }

    @Override
    public int hashCode() {
        return Objects.hash(sno, sname);
    }

    @Override
    public String toString() {
        return "Student{" +
                "sno='" + sno + '\'' +
                ", sname='" + sname + '\'' +
                '}';
    }
}

测试

class Test {
    public static void main(String[] args) {
        HashSet<Student> students = new HashSet<>();
        students.add(new Student("001", "张三"));
        students.add(new Student("001", "张三"));

        for (Student student : students) {
            System.out.println(student);
        }
    }
}

2、TreeSet实现类

基于红黑树(Red - Black Tree)数据结构实现的。

TreeSet 中的元素是有序的且不重复的

  • 要么按照元素的自然顺序(如果元素实现了Comparable接口)
  • 要么根据提供的比较器(compareTo)来排序。

1)自然顺序

TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
System.out.println(treeSet);

2)自定义排序

根据Comparable接口compareTo方法的比较结果排序

public class Student implements Comparable<Student> { //实现Comparable接口
    String sno;
    String sname;

    public Student(String sno, String sname) {
        this.sno = sno;
        this.sname = sname;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sno='" + sno + '\'' +
                ", sname='" + sname + '\'' +
                '}';
    }

    @Override
    public int compareTo(Student o) {  //根据学号排序
        return this.sno.compareTo(o.sno);
    }
}

测试类

class Test {
    public static void main(String[] args) {
        TreeSet<Student> students = new TreeSet<>();
        students.add(new Student("001", "张三"));
        students.add(new Student("001", "张三"));

        for (Student student : students) {
            System.out.println(student);
        }
    }
}

3)特有方法

E first()
    返回此集合中当前的第一个(最低)元素;
E last()
    返回此集合中当前的最后一个(最高)元素;
E pollFirst()
    返回【并删除】此集合中当前的第一个(最低)元素;
E pollLast()
  返回【并删除】此集合中当前的最后一个(最高)元素;
SortedSet<E> subSet(E fromElement, E toElement)
    返回此集合的部分视图,其元素范围从 fromElement(含)到 toElement(不含);
SortedSet<E> tailSet(E fromElement)
    返回此集合中元素【大于或等于】 fromElement 的部分的视图;

3、综合练习

用户输入用户名、密码、确认密码、生日(格式为yyyy--mm—dd为正确)、手机号(手机号长度为11位,并且以13、15、17、18为开头的手机号为正确)、邮箱(包含符号“@”为正确)信息之后,判断信息正确后,验证用户是否重复,重复则给出相应提示,如果不重复则注册成功。
案例要求分别使用HashSet和TreeSet实现。

三、Map接口及实现类

1、Map接口

Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。从Map集合中访问元素时,只要指定了Key,就能找到对应的Value。

Map接口常用方法

// 增加
void put(Object key, Object value)	
    将指定的值与此映射中的指定键关联(可选操作);

// 删除
void clear()
    从此map中删除所有映射(可选操作);
V remove(Object key)
    如果存在,则从此map中删除键的映射(可选操作);
boolean remove(Object key, Object value)
    仅当指定键当前映射到指定值时才删除该条目;

// 修改
V replace(K key, V value)
    仅在当前映射到某个值时才替换指定键的条目;
boolean replace(K key, V oldValue, V newValue)
    仅当当前映射到指定值时才替换指定键的条目;

// 查询
int size()
    返回此map中键值对的数量;
V get(Object key)
    返回指定键映射到的值,如果此map不包含键的映射,则返回 null;
V getOrDefault(Object key, V defaultValue)
    返回指定键映射到的值,如果此map不包含键的映射,则返回 defaultValue;
Set<K> keySet()
    返回此map中,包含的【键】的 Set 视图;
Collection<V> values() 
    返回此map中,包含的【值】的 Collection 视图;
Set<Map.Entry<K,V>>entrySet()
    返回此map中,包含的【键和值】的 Set 视图;

// 判断
boolean isEmpty()
    如果此map不包含键值映射,则返回 true;
boolean containsKey(Object key)
    如果此map包含指定键的映射,则返回 true;
boolean containsValue(Object value)
    如果此map将一个或多个键映射到指定值,则返回 true;

2、HashMap实现类

HashMap 是 Java 集合框架中的一个重要类,位于java.util包中。它实现了 Map 接口,用于存储键 - 值(key - value)对。

创建 HashMap

使用无参数构造函数创建一个空的 HashMap

HashMap<String, Integer> hashMap = new HashMap<>();
System.out.println(hashMap);

通过指定初始容量负载因子来创建 HashMap。

// 当前的容器容量是16,负载因子是0.75;
// 16*0.75=12,也就是说,当容量达到了12的时就会执行扩容操作。
// 思考当负载因子为1.0或0.5时会发生什么?
HashMap<String, Integer> hashMap = new HashMap<>(16, 0.75f);
System.out.println(hashMap);

添加键 - 值对(put)

hashMap.put("Alice", 90);
hashMap.put("Bob", 80);

如果添加的键已经存在于 HashMap 中,新的值会覆盖旧的值

int oldValue = hashMap.put("Alice", 95);
System.out.println("旧的值为: " + oldValue);
System.out.println(hashMap);

获取值(get)

System.out.println(hashMap.get("Bob"));

删除键 - 值对(remove)

hashMap.remove("Bob");

遍历 HashMap 的方式

通过 keySet() 方法获取 HashMap 中所有键,然后遍历键集来获取对应的值。

HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("Alice", 90);
hashMap.put("Bob", 80);
hashMap.put("Charlie", 95);
Set<String> keySet = hashMap.keySet();
for (String key : keySet) {
    System.out.println(key + " : " + hashMap.get(key));
}

通过 entrySet() 方法获取包含所有键 - 值对的集合,每个元素是一个Map.Entry类型,包含键和值。

HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("Alice", 90);
hashMap.put("Bob", 80);
hashMap.put("Charlie", 95);
Set<Map.Entry<String, Integer>> entrySet = hashMap.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
    String key = entry.getKey();          // 获取Entry中的键
    Integer value = entry.getValue();     // 获取Entry中的值
    System.out.println(key + ":" + value);
}
maps.forEach((key, value) -> {
System.out.println(key + ":" + value);
});

3、TreeMap实现类

TreeMap 是 Java 集合框架中的一个实现类,位于java.util包中。它实现了Map接口,用于存储键 - 值(key - value)对。和 HashMap 不同,TreeMap 是基于红黑树(Red - Black Tree)这种自平衡二叉查找树的数据结构实现的。

基本使用

自然序

//创建 TreeMap 对象
TreeMap<Integer, String> treeMap = new TreeMap<>(); 
// 添加
treeMap.put(3, "apple");	
treeMap.put(1, "banana");
treeMap.put(2, "cherry");
// 删除
String removedValue = treeMap.remove(1); 
// 修改
String oldValue = hashMap.replace(2, "香蕉");
// 查询
String value = hashMap.get(2);

自定排序(自定义子类)

标签:元素,20,hashMap,int,Object,list,API,集合,javase
From: https://blog.csdn.net/weixin_42238065/article/details/145060876

相关文章

  • 上市公司资产收益率资产回报率ROA净资产收益率ROE数据2000-2021年-社科数据
    上市公司资产收益率资产回报率ROA净资产收益率ROE数据2000-2021年-社科数据https://download.csdn.net/download/paofuluolijiang/90028563https://download.csdn.net/download/paofuluolijiang/90028563在分析上市公司的财务表现时,资产回报率(ROA)和净资产收益率(ROE)是两个核心......
  • LeetCode:206.反转链表
    flowchartTDA[开始]-->B{p1是否为空}B-->|No|C[保存p1.next到temp]C-->D[将p1.next指向p2]D-->E[更新p2为p1]E-->F[更新p1为temp]F-->BB-->|Yes|G[返回p2]LeetCode:206.反转链表/***Definitionforsingly-linkedlist.*functionLi......
  • CES Asia 2025:精神焕发,重新想象
    在科技飞速发展的时代浪潮中,CES Asia 2025(赛逸展)即将以全新的姿态盛大开启,在4.6万平米的广阔空间里,打造一场小而精致的消费电子精品展,为全球科技行业带来一场别开生面的盛宴。自2015年诞生以来,CES Asia凭借独特理念与专业运营在消费电子领域脱颖而出,连续五年的辉煌历史奠......
  • CES Asia 2025:科技盛宴即将开启,续写辉煌篇章
    随着2025年国际消费类电子产品展览会(CES)在美国拉斯维加斯盛大开幕并展现出诸多令人瞩目的发展趋势,亚洲科技界也对即将到来的CES Asia 2025充满期待,一场科技盛宴即将在亚洲大陆续写辉煌。在刚刚拉开帷幕的CES 2025上,人工智能无疑是最耀眼的明星之一。从智能眼镜到可穿戴设......
  • P8076 [COCI2009-2010#7] RESTORAN
    RESTORAN题目链接。Problem给定一张\(n\)个点,\(m\)条边的无向图。现在要求一种对边的染色的方式,使得每个度数不小于\(2\)的点基于白色边相连,又与黑色边相连。无解输出-1。数据范围:\(1\len,m\le10^5\),不保证没有重边。Sol经典套路?先考虑无解的情况,当且仅当存在一......
  • 2025毕设ssm家乡旅游文化推广网站程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着现代社会的发展,旅游业成为了全球经济中一个重要的组成部分。家乡旅游文化推广网站的建设背景源于多方面因素。首先,在旅游市场不断发展的大环......
  • 2025毕设ssm礼服定制租赁管理系统程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在现代社会,人们的生活水平不断提高,社交活动日益频繁,对于礼服的需求也呈现多样化的趋势。在诸如婚礼、晚宴、舞会等特殊场合,礼服的穿着必不可少。......
  • 网络安全雷区:网络工程师必知的20个高危端口及防护策略
    在当今数字化时代,网络如同一张错综复杂的巨大蛛网,遍布全球各个角落,承载着海量的数据传输与信息交互。网络工程师,作为这张网络的守护者与架构师,肩负着保障网络稳定运行与数据安全的重任。在网络安全的战场上,高危端口犹如隐匿的暗礁,稍有不慎,便可能引发数据泄露、系统瘫痪等灾......
  • FastApi框架异步调用同步问题
    Fastapi项目,在接口中调用同步方法,如果该同步方法,耗时较长(比如连接redis超时),会造成整个项目接口的阻塞,这是任何接口的访问都会被阻塞超时一、为什么会阻塞FastAPI是基于异步框架(如asyncio或anyio)构建的,它的核心是一个事件循环(EventLoop)。事件循环负责调度和执行所有的异步......
  • P10681 [COTS 2024] 奇偶矩阵 Tablica
    P10681[COTS2024]奇偶矩阵Tablica题意有一个\(n\timesm\)的\(01\)矩阵,问有多少种填\(01\)的方式,满足同一行、列恰好有\(1\)或\(2\)个\(1\)。\(n,m\le3000\)。思路首先一个显然的\(O(nm^2)\)做法:设\(f_{i,s0,s1}\)表示考虑到第\(i\)行,目前有\(s0\)......