Java【集合】

一、集合的概述

集合建立在数组基础上,主要位于java.util包中,用来存储Java类对象,并且可以实现各种数据结构。

  • 集合大小可以改变,可以存放不同数据类型数据。
  • 集合不能存放基本类型数据,只能存放引用数据类型数据。
  • 集合不仅可以方便地存放数据,而且提供了添加、读取和删除数据等实用方法。
  • 集合中只能存放对象,JVM会自动将基本类型与相应的包装类型转换(装箱:基本类型→对象;拆箱:对象→基本类型)。


二、Java集合的类框架

所有的集合框架都包含如下内容:

  •  接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象。
  1.  Collection是单列集合的根接口,存储的元素符合某种规律。
  2. Map是双列集合的根接口,用于存储具有键、值映射关系的元素,每一个元素都包含一个键-值对 。
  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
  • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序,这些算法实现了多态,那是因为相同的方法可以在相似的接口上有着不同的实现。   


三、集合方法

addAll()方法

用来将指定集合种所有的对象添加到该集合中,如果对象集合进行了泛化,则要求指定集合中所有对象都符合泛化类型,否则编译时会抛出异常。

方法签名

boolean addAll(Collection<? extends E> c)

  • 参数:另一个集合 c,其中的所有元素将被添加到调用该方法的集合中。
  • 返回值:如果该集合因为调用而发生了变化(即至少添加了一个元素),则返回 true;否则返回 false。
import java.util.ArrayList;
import java.util.Collection;public class Test{public static void main(String[] args){String a = "A";String b = "B";String c = "C";//创建一个 ArrayList 用于存储字符串Collection<String> list = new ArrayList<String>();list.add(a);list.add(b);//使用 Object 类型以便添加不同类型的元素Collection<Object> list2 = new ArrayList<Object>(); //使用 addAll() 将 list 的元素添加到 list2list2.addAll(list); //list2.add(list);也可以list2.add(c);//使用迭代器:通过iterator()方法序列化集合中所有的对象Iterator<Object> it = list2.iterator();  while(it.hasNext()){//获取下一个元素Object ojb = it.next();  //对实例进行了泛化,不需要强制类型转换System.out.println("使用迭代器打印:"+ojb);}}
}

注意:Collection不能实例化,而ArrayList类是Collection的间接实现类,可以通过ArrayList类实例化。

removeAll()方法 

用来从集合中移除同时包含在指定集合中的对象,与retainAll()方法相反。

方法签名

boolean removeAll(Collection<?> c)

  • 参数c是要从调用该方法的集合中移除的元素的集合。? 表示可以接受任何类型的集合。
  • 返回值:如果调用该方法后集合的内容发生了变化(即至少移除了一个元素),则返回 true;如果没有元素被移除,则返回 false
import java.util.ArrayList;
import java.util.Collection;public class RemoveAllExample {public static void main(String[] args) {// 创建第一个集合Collection<String> collection1 = new ArrayList<>();collection1.add("A");collection1.add("B");collection1.add("C");// 创建第二个集合Collection<String> collection2 = new ArrayList<>();collection2.add("B");collection2.add("C");// 使用 removeAll() 从 collection1 中移除 collection2 的元素boolean modified = collection1.removeAll(collection2);// 打印结果System.out.println("集合1修改后: " + collection1);System.out.println("集合是否被修改: " + modified);}
}//输出结果:
//集合1修改后: [A]
//集合是否被修改: true

containsAll()方法

用来查看集合是否存在指定集合中的所有元素对象。

方法签名

boolean containsAll(Collection<?> c)

  • 参数c是要检查的集合,? 表示可以接受任何类型的集合。
  • 返回值:如果调用的集合包含参数集合中的所有元素,则返回 true;否则返回 false
import java.util.ArrayList;
import java.util.Collection;public class ContainsAllExample {public static void main(String[] args) {// 创建第一个集合Collection<String> collection1 = new ArrayList<>();collection1.add("A");collection1.add("B");collection1.add("C");// 创建第二个集合Collection<String> collection2 = new ArrayList<>();collection2.add("B");collection2.add("C");// 使用 containsAll() 检查 collection1 是否包含 collection2 的所有元素boolean contains = collection1.containsAll(collection2);// 打印结果System.out.println("集合1包含集合2的所有元素: " + contains);}
}//输出结果:
//集合1包含集合2的所有元素: true

retainAll()方法

仅保留集合中同时包含在指定集合中的元素,其他全部移除。

方法签名

boolean retainAll(Collection<?> c)

  • 参数c是与调用该方法的集合进行比较的集合。只有在 c 中存在的元素将被保留。
  • 返回值:如果调用的集合因调用该方法而发生变化(即至少移除了一个元素),则返回 true;如果集合没有变化,则返回 false
import java.util.ArrayList;
import java.util.Collection;public class RetainAllExample {public static void main(String[] args) {// 创建第一个集合Collection<String> collection1 = new ArrayList<>();collection1.add("A");collection1.add("B");collection1.add("C");// 创建第二个集合Collection<String> collection2 = new ArrayList<>();collection2.add("B");collection2.add("C");collection2.add("D");// 使用 retainAll() 保留 collection1 中与 collection2 相同的元素boolean modified = collection1.retainAll(collection2);// 打印结果System.out.println("集合1修改后: " + collection1);System.out.println("集合是否被修改: " + modified);}
}//输出结果:
//集合1修改后: [B, C]
//集合是否被修改: true

toArray()方法

用来获得一个包含所有对象的指定类型的数组,将集合转换为数组的方法。

方法签名

//无参数

Object[] toArray()

  • 返回值:返回一个包含集合中所有元素的数组,数组的类型为 Object[]
import java.util.ArrayList;
import java.util.Collection;public class ToArrayExample {public static void main(String[] args) {Collection<String> collection = new ArrayList<>();collection.add("A");collection.add("B");collection.add("C");// 使用无参数版本的 toArray()Object[] array = collection.toArray();// 打印结果for (Object element : array) {System.out.println(element);}}
}

//带参数

<T> T[] toArray(T[] a)

  • 参数a是一个用于指定返回数组的类型的数组实例,如果传入的数组能够容纳集合中的所有元素,则返回该数组;否则,将创建一个新的数组并返回。
  • 返回值:带参数版本返回 T[],其中 T 是参数数组的类型。
import java.util.ArrayList;
import java.util.Collection;public class ToArrayExample {public static void main(String[] args) {Collection<String> collection = new ArrayList<>();collection.add("A");collection.add("B");collection.add("C");// 使用带参数版本的 toArray()String[] array = collection.toArray(new String[0]);// 打印结果for (String element : array) {System.out.println(element);}}
}


四、集合类型

Iterator(迭代器)

Java Iterator(迭代器)不是一个集合,是一种用于遍历集合的接口,可用于迭代 ArrayList 和 HashSet 等集合。它提供了一种统一的方式来访问集合中的元素,而不需要了解底层集合的具体实现细节。ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。

迭代器接口定义的常用方法

  • next():返回迭代器的下一个元素,并将迭代器的指针移到下一个位置。
  • hasNext():用于判断集合中是否还有下一个元素可以访问。
  • remove():从集合中删除迭代器最后访问的元素(可选操作)。

引入Iterator 类

import java.util.Iterator;

获取一个迭代器

集合想获取一个迭代器可以使用 iterator() 方法:

// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;public class RunoobTest {public static void main(String[] args) {// 创建集合ArrayList<String> sites = new ArrayList<String>();sites.add("Google");sites.add("Runoob");sites.add("Taobao");sites.add("Zhihu");// 获取迭代器Iterator<String> it = sites.iterator();// 输出集合中的第一个元素:GoogleSystem.out.println(it.next());}
}

循环集合元素

让迭代器 it 逐个返回集合中所有元素最简单的方法是使用 while 循环:

while(it.hasNext()) {
  System.out.println(it.next());
}

// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;public class RunoobTest {public static void main(String[] args) {// 创建集合ArrayList<String> sites = new ArrayList<String>();sites.add("Google");sites.add("Runoob");sites.add("Taobao");sites.add("Zhihu");// 获取迭代器Iterator<String> it = sites.iterator();// 输出集合中的所有元素while(it.hasNext()) {System.out.println(it.next());}}
}//输出结果如下:
//Google
//Runoob
//Taobao
//Zhihu

删除元素

// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;public class RunoobTest {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<Integer>();numbers.add(12);numbers.add(8);numbers.add(2);numbers.add(23);Iterator<Integer> it = numbers.iterator();while(it.hasNext()) {Integer i = it.next();if(i < 10) {  it.remove();  // 删除小于 10 的元素}}System.out.println(numbers);}
}//输出结果如下:
//[12, 23]

注意:Java 迭代器是一种单向遍历机制,只能从前往后遍历集合中的元素。在使用迭代器遍历集合时,不能直接修改集合中的元素,否则,可能会导致 ConcurrentModificationException 异常;为了避免这个问题而是需要使用迭代器的 remove() 方法来删除当前元素。通过使用迭代器,可以逐个访问集合中的元素,而不需要使用传统的 for 循环或索引。这种方式更加简洁和灵活,适用于各种类型的集合。

Collection集合

Collection 是最基本的集合接口,无法实例化;一个 Collection 代表一组 Object,Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。Collection 接口存储一组不唯一,无序的对象。

 List集合

List集合为列表类型,以线性方式存储对象,List接口元素有序可重复。List 和数组类似,可以动态增长,根据实际存储的数据的长度自动增长 List 的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。

ArrayList类

对象被存储在ArrayList对象中,其容量会自带增加,也可以通过ensureCapacity()来人工增加容量。该类实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的50%,插入删除效率低。ArrayList 是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。

适合用处

  • 频繁访问列表中的某一个元素。
  • 只需要在列表末尾进行添加和删除元素操作。

引入ArrayList 类

import java.util.ArrayList; // 引入 ArrayList 类ArrayList<E> objectName =new ArrayList<>();  // 初始化

添加元素

public class RunoobTest {public static void main(String[] args) {ArrayList<String> sites = new ArrayList<String>();//使用 add() 方法添加元素到 ArrayListsites.add("Google");sites.add("Runoob");sites.add("Taobao");sites.add("Weibo");System.out.println(sites);}
}

访问元素

System.out.println(sites.get(1));  // 访问第二个元素

修改元素 

set(int index, E element) 方法的第一个参数是索引(index),表示要替换的元素的位置,第二个参数是新元素(element),表示要设置的新值。

sites.set(2, "Wiki"); // 修改第三个元素的值

删除元素

sites.remove(3); // 删除第四个元素

计算大小

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

迭代数组列表

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

其他基本类型引用

ArrayList 中的元素实际上是对象,在以上实例中,数组列表元素都是字符串 String 类型。如果要存储其他类型,而 <E> 只能为引用数据类型,这时就需要使用到基本类型的包装类

此外,BigInteger、BigDecimal 用于高精度的运算,BigInteger 支持任意精度的整数,也是引用类型,但它们没有相对应的基本类型。 

ArrayList<Integer> list1 = new ArrayList<>();     // 存放整数元素
ArrayList<Character> list2 = new ArrayList<>();   // 存放字符元素

示例

import java.util.ArrayList;public class RunoobTest {public static void main(String[] args) {ArrayList<Integer> myNumbers = new ArrayList<Integer>();myNumbers.add(10);myNumbers.add(15);myNumbers.add(20);myNumbers.add(25);for (int i : myNumbers) {System.out.println(i);}}
}

ArrayList 排序 

import java.util.ArrayList;
import java.util.Collections;  // 引入 Collections 类public class RunoobTest {public static void main(String[] args) {ArrayList<String> sites = new ArrayList<String>();sites.add("Taobao");sites.add("Wiki");sites.add("Runoob");sites.add("Weibo");sites.add("Google");Collections.sort(sites);  // 字母排序for (String i : sites) {System.out.println(i);}}
}//执行输出结果为:
//Google
//Runoob
//Taobao
//Weibo
//Wiki
import java.util.ArrayList;
import java.util.Collections;  // 引入 Collections 类public class RunoobTest {public static void main(String[] args) {ArrayList<Integer> myNumbers = new ArrayList<Integer>();myNumbers.add(33);myNumbers.add(15);myNumbers.add(20);myNumbers.add(34);myNumbers.add(8);myNumbers.add(12);Collections.sort(myNumbers);  // 数字排序for (int i : myNumbers) {System.out.println(i);}}
}//执行输出结果为:
//8
//12
//15
//20
//33
//34

ArrayList 常用方法(更多请看:ArrayList)

方法描述
add()将元素插入到指定位置的 arraylist 中
addAll()添加集合中的所有元素到 arraylist 中
clear()删除 arraylist 中的所有元素
clone()复制一份 arraylist
contains()判断元素是否在 arraylist
get()通过索引值获取 arraylist 中的元素
indexOf()返回 arraylist 中元素的索引值
removeAll()删除存在于指定集合中的 arraylist 里的所有元素
remove()删除 arraylist 里的单个元素
size()返回 arraylist 里元素数量
isEmpty()判断 arraylist 是否为空
subList()截取部分 arraylist 的元素
set()替换 arraylist 中指定索引的元素
sort()对 arraylist 元素进行排序
toArray()将 arraylist 转换为数组
toString()将 arraylist 转换为字符串
ensureCapacity()设置指定容量大小的 arraylist
lastIndexOf()返回指定元素在 arraylist 中最后一次出现的位置
retainAll()保留 arraylist 中在指定集合中也存在的那些元素
containsAll()查看 arraylist 是否包含指定集合中的所有元素
trimToSize()将 arraylist 中的容量调整为数组中的元素个数
removeRange()删除 arraylist 中指定索引之间存在的元素
replaceAll()将给定的操作内容替换掉数组中每一个元素
removeIf()删除所有满足特定条件的 arraylist 元素
forEach()遍历 arraylist 中每一个元素并执行特定操作

LinkedList类

该类实现了List接口,允许有null(空)元素。主要用于创建链表数据结构,该类没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,即在创建List时候构造一个同步的List。

适合用处

  • 需要通过循环迭代来访问列表中的某些元素。
  • 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。

引入LinkedList类

// 引入 LinkedList 类
import java.util.LinkedList; 
//LinkedList<E> list = new LinkedList<E>();   // 普通创建方法
LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表

创建简单链表

// 引入 LinkedList 类
import java.util.LinkedList;public class RunoobTest {public static void main(String[] args) {LinkedList<String> sites = new LinkedList<String>();sites.add("Google");sites.add("Runoob");sites.add("Taobao");sites.add("Weibo");sites.addFirst("Wiki"); // 使用 addFirst() 在头部添加元素sites.addLast("Wiki");  // 使用 addLast() 在尾部添加元素System.out.println(sites);}
}
//输出结果:[Wiki, Google, Runoob, Taobao, Weibo, Wiki]

移除元素

sites.removeFirst(); // 使用 removeFirst() 移除头部元素
sites.removeLast();  // 使用 removeLast() 移除尾部元素

获取元素

System.out.println(sites.getFirst()); // 使用 getFirst() 获取头部元素
System.out.println(sites.getLast()); // 使用 getLast() 获取尾部元素

迭代元素

for (int size = sites.size(), i = 0; i < size; i++) {System.out.println(sites.get(i));
}
for (String i : sites) {System.out.println(i);
}

LinkedList类常用方法(其他请见:LinkedList)

方法描述
public boolean add(E e)链表末尾添加元素,返回是否成功,成功为 true,失败为 false。
public void add(int index, E element)向指定位置插入元素。
public boolean addAll(Collection c)将一个集合的所有元素添加到链表后面,返回是否成功,成功为 true,失败为 false。
public boolean addAll(int index, Collection c)将一个集合的所有元素添加到链表的指定位置后面,返回是否成功,成功为 true,失败为 false。
public void addFirst(E e)元素添加到头部。
public void addLast(E e)元素添加到尾部。
public boolean offer(E e)向链表末尾添加元素,返回是否成功,成功为 true,失败为 false。
public boolean offerFirst(E e)头部插入元素,返回是否成功,成功为 true,失败为 false。
public boolean offerLast(E e)尾部插入元素,返回是否成功,成功为 true,失败为 false。
public void clear()清空链表。
public E removeFirst()删除并返回第一个元素。
public E removeLast()删除并返回最后一个元素。
public boolean remove(Object o)删除某一元素,返回是否成功,成功为 true,失败为 false。
public E remove(int index)删除指定位置的元素。
public E poll()删除并返回第一个元素。
public E remove()删除并返回第一个元素。
public boolean contains(Object o)判断是否含有某一元素。
public E get(int index)返回指定位置的元素。
public E getFirst()返回第一个元素。
public E getLast()返回最后一个元素。
public int indexOf(Object o)查找指定元素从前往后第一次出现的索引。
public int lastIndexOf(Object o)查找指定元素最后一次出现的索引。
public E peek()返回第一个元素。
public E element()返回第一个元素。
public E peekFirst()返回头部元素。
public E peekLast()返回尾部元素。
public E set(int index, E element)设置指定位置的元素。
public Object clone()克隆该列表。
public Iterator descendingIterator()返回倒序迭代器。
public int size()返回链表元素个数。
public ListIterator listIterator(int index)返回从指定位置开始到末尾的迭代器。
public Object[] toArray()返回一个由链表元素组成的数组。
public T[] toArray(T[] a)返回一个由链表元素转换类型而成的数组。

Vector集合

Vector实现动态数组,与ArrayList相似,但Vector是同步的。

Stack类

栈是Vector的一个子类,它实现了一个标准的后进先出的栈。该类不是同步的,因此在多线程环境下需要自行实现同步。

适合用处

  • 需要实现回溯功能(如浏览器历史记录)。
  • 需要进行深度优先搜索(DFS)等算法。
import java.util.Stack;  // 引入 Stack 类public class StackTest {public static void main(String[] args) {Stack<String> stack = new Stack<>();stack.push("Google");stack.push("Runoob");stack.push("Taobao");System.out.println(stack); // 输出结果:[Google, Runoob, Taobao]// 移除元素stack.pop(); // 移除顶部元素System.out.println(stack); // 输出结果:[Google, Runoob]// 获取元素System.out.println(stack.peek()); // 获取顶部元素,输出:Runoob// 迭代元素for (String item : stack) {System.out.println(item);}}
}

Queue集合

Queue接口表示队列,向末尾添加元素,从队头删除元素,允许有重复元素,LinkedList类不仅实现了List接口,还实现了Queue接口。

示例:

Queue<String> queue = new LinkedList<String>();
//从末尾进入队列
queue.add("Tom");
queue.add("Mike");
queue.add("Linda");//从队头出
System.out.println(queue.remove());  //打印Tom
System.out.println(queue.remove());  //打印Mike
System.out.println(queue.remove());  //打印Linda

Set集合

Set接口元素无序不可重复,与 Collection 完全一样的接口。Set 检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。

HashSet类

HashSet 允许有 null 值,

引入HashSet语法

import java.util.HashSet;

创建一个 HashSet 对象示例

HashSet<String> sites = new HashSet<String>();

添加元素 

// 引入 HashSet 类      
import java.util.HashSet;public class RunoobTest {public static void main(String[] args) {HashSet<String> sites = new HashSet<String>();sites.add("Google");sites.add("Runoob");sites.add("Taobao");sites.add("Zhihu");sites.add("Runoob");  // 重复的元素不会被添加System.out.println(sites);}
}

判断元素是否存在 

System.out.println(sites.contains("Taobao"));

删除元素

sites.remove("Taobao");  // 删除指定元素,删除成功返回 true,否则为 false
sites.clear();  // 删除所有元素

计算大小

System.out.println(sites.size());  //打印集合大小

迭代 HashSet 

for (String i : sites) {System.out.println(i);
}

TreeSet类

TreeSet类实现了Set接口,基于红黑树的实现,元素是有序的。允许null元素(最多一个)。

适合用处

  • 需要自动排序的集合。
  • 需要快速查找、不允许重复的元素集合。
import java.util.TreeSet; // 引入 TreeSet 类public class TreeSetTest {public static void main(String[] args) {TreeSet<String> treeSet = new TreeSet<>();treeSet.add("Google");treeSet.add("Runoob");treeSet.add("Taobao");System.out.println(treeSet); // 输出结果:[Google, Runoob, Taobao]// 移除元素treeSet.remove("Runoob");System.out.println(treeSet); // 输出结果:[Google, Taobao]// 获取元素System.out.println(treeSet.first()); // 获取第一个元素,输出:GoogleSystem.out.println(treeSet.last()); // 获取最后一个元素,输出:Taobao// 迭代元素for (String item : treeSet) {System.out.println(item);}}
}

Map集合

Map 接口存储一组键值对象,提供key(键)到value(值)的映射。

HashMap类

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射,对象按升序排序。它实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。HashMap 的 key 与 value 类型可以相同也可以不同

引入HashMap类语法

import java.util.HashMap;

创建 HashMap 对象

HashMap<Integer, String> Sites = new HashMap<Integer, String>();

添加元素

// 引入 HashMap 类      
import java.util.HashMap;public class RunoobTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap<Integer, String> Sites = new HashMap<Integer, String>();// 使用 put() 方法添加键值对Sites.put(1, "Google");Sites.put(2, "Runoob");Sites.put(3, "Taobao");Sites.put(4, "Zhihu");System.out.println(Sites);}
}

访问元素

System.out.println(Sites.get(3));  // 使用 get(key) 方法来获取 key 对应的 value

删除元素

Sites.remove(4);  // 使用 remove(key) 方法来删除 key 对应的键值对(key-value)
Sites.clear();    // 删除所有键值对

计算大小

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

迭代 HashMap

// 输出 key 和 value
for (Integer i : Sites.keySet()) {System.out.println("key: " + i + " value: " + Sites.get(i));
}
// 返回所有 value 值
for(String value: Sites.values()) {// 输出每一个valueSystem.out.print(value + ", ");
}

HashMap 常用方法

方法描述
clear()删除 hashMap 中的所有键/值对
clone()复制一份 hashMap
isEmpty()判断 hashMap 是否为空
size()计算 hashMap 中键/值对的数量
put()将键/值对添加到 hashMap 中
putAll()将所有键/值对添加到 hashMap 中
putIfAbsent()如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。
remove()删除 hashMap 中指定键 key 的映射关系
containsKey()检查 hashMap 中是否存在指定的 key 对应的映射关系。
containsValue()检查 hashMap 中是否存在指定的 value 对应的映射关系。
replace()替换 hashMap 中是指定的 key 对应的 value。
replaceAll()将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。
get()获取指定 key 对应对 value
getOrDefault()获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
forEach()对 hashMap 中的每个映射执行指定的操作。
entrySet()返回 hashMap 中所有映射项的集合集合视图。
keySet()返回 hashMap 中所有 key 组成的集合视图。
values()返回 hashMap 中存在的所有 value 值。
merge()添加键值对到 hashMap 中
compute()对 hashMap 中指定 key 的值进行重新计算
computeIfAbsent()对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中
computeIfPresent()对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。

TreeMap类

继承了AbstractMap,实现了Map接口,基于红黑树的实现,键是有序的,对象按升序排序。允许null 键(最多一个)。

适合用处

  • 需要键值对自动排序的映射。
  • 需要快速查找和插入的键值对集合。
import java.util.TreeMap; // 引入 TreeMap 类public class TreeMapTest {public static void main(String[] args) {TreeMap<String, String> treeMap = new TreeMap<>();treeMap.put("Google", "搜索引擎");treeMap.put("Runoob", "学习网站");treeMap.put("Taobao", "购物网站");System.out.println(treeMap); // 输出结果:{Google=搜索引擎, Runoob=学习网站, Taobao=购物网站}// 移除元素treeMap.remove("Runoob");System.out.println(treeMap); // 输出结果:{Google=搜索引擎, Taobao=购物网站}// 获取元素System.out.println(treeMap.get("Google")); // 获取键为 Google 的值,输出:搜索引擎// 迭代元素for (String key : treeMap.keySet()) {System.out.println(key + ": " + treeMap.get(key));}}
}

Properties类

是Hashtable的一个子类,它用来保持值的列表,其中键和值都是String。

import java.util.Properties;
import java.util.Set;
import java.util.Iterator;public class Test{public static void main(String[] args){// 创建 Properties 对象Properties capitals = new Properties();Set states;String str;// 添加元素capitals.put("中国", "北京");capitals.put("俄罗斯", "莫斯科");capitals.put("日本", "东京");capitals.put("法国", "巴黎");capitals.put("英国", "伦敦");// 获取映射中包含的项的集合states = capitals.keySet();// 遍历国家和首都的映射Iterator itr = states.iterator();while(itr.hasNext()){str = (String) itr.next();System.out.println("国家:"+str+",首都:"+capitals.getProperty(str)+".");}System.out.println();str = capitals.getProperty("美国", "没有发现");System.out.println("美国的首都:"+str+".");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/141436.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

力扣题解2848

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;简单&#xff09;&#xff1a; 与车相交的点 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i&#xff0c;nums[i] [starti, endi] &…

中考全国45套(全国教育发达地区中考试卷)

文章目录 获取方式 为什么选择这份资源&#xff1f; 权威性与全面性&#xff1a;我们精心搜集了全国教育发达地区的最新中考试卷&#xff0c;确保每一套试卷都代表了该地区的教学水平和考试趋势。这不仅涵盖了丰富的知识点&#xff0c;还融入了各地独特的命题风格&#xff0c;让…

2020ICPC上海 D - Walker M - Gitignore

D: 首先显然要二分,判断当前二分的mid时间下是否能满足走满0~n 枚举所有情况,这里按照左,右起点p1,p2分别讨论 p1向左 p2向左(以下向左和向右都代表向左或者向右到墙,而不代表初速度方向)&#xff0c;只需要计算p1或者p2反弹之后还能走距离n就是合法 p1向左 p2向右&#xff…

3.4.2 __ipipe_init_early之fixup_percpu_data()

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 3.4.2 __ipipe_init_early之fixup_percpu_data() 这个函数只有在CPU是SMP对称多core的情况下&#xff0c;才会真正运作&#xff0c;否则就是个空函数。 #ifdef CONFIG_SMPstatic inline void fixup_percpu_data…

H5 three.js 实现六年级观察物体

o(&#xffe3;▽&#xffe3;)ブ 我又带着新的demo来啦~ 预览 功能点 立方体的阴影 立方体的添加 位置记录 最大限制 三视图展示 立方体的移除 答题模式 随机出题 题库出题 源码 注释算是比较全了&#xff0c;可能部分会有点绕&#xff0c;还能够再优化一下~ <!DOCTYPE …

【代码随想录训练营第42期 续Day58打卡 - 图论Part8 - Dijkstra算法

目录 一、Dijkstra算法 实现方式 1、使用优先队列&#xff08;最小堆&#xff09; 2、朴素法&#xff08;简单数组&#xff09; 二、经典例题 题目&#xff1a;卡码网 47. 参加科学大会 题目链接 题解&#xff1a;朴素Dijkstra 三、小结 一、Dijkstra算法 刚入门Dijks…

AI论文写作测评!类似茅茅虫论文写作助手网站

在当前的学术研究和写作环境中&#xff0c;AI论文写作助手成为了许多学者和学生的重要工具。其中&#xff0c;千笔-AIPassPaper和茅茅虫论文写作助手是两款备受关注的平台。本文将对这两款工具进行详细测评&#xff0c;并推荐适合不同需求的用户使用。 千笔-AIPassPaper AI论文…

实现领域驱动设计(DDD)系列详解:限界上下文

随着微服务的兴起&#xff0c;限界上下文更是被拔高到战略设计的核心地位&#xff0c;也成了连接问题空间与解空间的重要桥梁&#xff0c;但不可否认&#xff0c;一方面&#xff0c;领域驱动设计社区纷纷发声强调它的重要性&#xff1b;另一方面&#xff0c;还有很多人依旧弄不…

游戏算法专题之PRD算法:听说你想凭运气抽中荣耀水晶?

PRD算法全称Pseudo-Random Distribution。是概率分布中的一种常见算法&#xff0c;在游戏开发领域中很常用。 PRD用于控制随机事件的触发概率&#xff0c;使其表现得更加符合预期&#xff0c;相比于传统得随机数生成&#xff0c;PRD算法可以平滑得控制随机事件的触发次数&…

计算机毕业设计 二手闲置交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

什么是快充协议,最常见的快充协议有哪些

什么是快充协议 随着手机快充的出现大家都知道快充技术但很多人确不知道快充协议&#xff0c;在快充技术里快充协议是必不可少的&#xff0c;那么今天我们就来探讨一下什么是快充协议&#xff1f; 快充协议是一种通过提高充电效率来缩短设备充电时间的电池充电技术。它通过在充…

主播和礼品检测系统源码分享

主播和礼品检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

约瑟夫环和一元多项式修正版

这里先附上上一篇博文的链接大家可以对比着看&#xff0c;错误已经改正https://blog.csdn.net/2302_78946488/article/details/141751514?spm1001.2014.3001.5501 约瑟夫环 以下是详细代码 //约瑟夫环 #include<stdio.h> #include<stdlib.h> //建立链表结点 str…

【Unity】 HTFramework框架(五十六)MarkdownText:支持运行时解析并显示Markdown文本

更新日期&#xff1a;2024年9月15日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 MarkdownText支持的Markdown语法标题强调文本表格嵌入图像超链接 使用MarkdownText设置项运行时属性解析使用ID模式嵌入图像 MarkdownText MarkdownText…

句子成分——每日一划(八)

目录 一、原句 二、第一部分 三、第二部分 一、原句 In class society everyone lives as a member of a particular class, and every kind of thinking, without exception, is stamped with the brand of a class. 来源&#xff1a;二、阶级和阶级斗争 二、第一部分 In…

QT添加图标标题和打包项目

QT项目打包 项目的标题和图标标题项目图标exe图标 可执行文件——生成exeexe运行报错“找不到qt6gui.dll”等 相关库文件——生成zip安装包打包程序——生成exe安装包 项目的标题和图标 项目打包要好看点&#xff0c;得有个好点的标题和图标&#xff0c;这次打包的项目是我上一…

图论篇--代码随想录算法训练营第五十八天打卡|拓扑排序,dijkstra(朴素版),dijkstra(堆优化版)精讲

拓扑排序 题目链接&#xff1a;117. 软件构建 题目描述&#xff1a; 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依赖于文件 B&#xff0…

【移动端】菜单的自动展开与收回

前言 为了满足手机上菜单栏随用户移动&#xff0c;菜单的自动展示与隐藏&#xff0c;特此记录 基本原理 实现逻辑 window.addEventListener(‘scroll’, debouncedScrollHandler) – 监听文档视图滚动事件 document.querySelector(‘.header’) – 选择器匹配元素 创建show和h…

中断门+陷阱门

中断门&#xff1a; 中断描述符在IDT表里面 kd> dq idtr 80b95400 83e48e000008bfc0 83e48e000008c150 80b95410 0000850000580000 83e4ee000008c5c0 80b95420 83e4ee000008c748 83e48e000008c8a8 80b95430 83e48e000008ca1c 83e48e000008d018 80b95440 000085000050…

Tuxera NTFS for Mac 2023绿色版

​ 在数字化时代&#xff0c;数据的存储和传输变得至关重要。Mac用户经常需要在Windows NTFS格式的移动硬盘上进行读写操作&#xff0c;然而&#xff0c;由于MacOS系统默认不支持NTFS的写操作&#xff0c;这就需要我们寻找一款高效的读写软件。Tuxera NTFS for Mac 2023便是其中…