Java【集合】_java集合方法,零基础入门到精通,收藏这篇就够了

JAVA多线程详解(超详细) 程序:开发写的代码称之为程序。程序就是一堆代码,一组数据和指令集,是一个静态的概念。进程(Process):将程序运行起来,我们称之为进程。进程是执行程序的一次执行过程,它是动态的概念。进程存在生命周期,也就是说程序随着程序的终止而销毁。进程之间是通过TCP/IP端口实现交互的。线程(Thread):线程是进程中的实际运作的单位,是进程的一条流水线,是程序的实际执行者,是最小的执行单位。通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程。线程是CPU调度和执行的最小单位。注意。 阅读详情

目录

一、集合的概述

二、Java集合的类框架

三、集合方法

addAll()方法

removeAll()方法

containsAll()方法

retainAll()方法

toArray()方法

四、集合类型

Iterator(迭代器)

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

引入Iterator 类

获取一个迭代器

循环集合元素

删除元素

Collection集合

List集合

ArrayList类

LinkedList类

Vector集合

Stack类

Queue集合

Set集合

HashSet类

TreeSet类

Map集合

HashMap类

TreeMap类

Properties类


一、集合的概述

集合建立在数组基础上,主要位于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 的元素添加到 list2
    list2.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[] 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();

        // 输出集合中的第一个元素:Google
        System.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() 方法添加元素到 ArrayList
        sites.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 类型。如果要存储其他类型,而 只能为引用数据类型,这时就需要使用到基本类型的包装类。

此外,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()); // 获取第一个元素,输出:Google
        System.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 对象 Sites
        HashMap<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()) {
  // 输出每一个value
  System.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+".");
  }
}

Java开发的就业市场正在经历结构性调整,竞争日益激烈

传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。

大模型为核心的AI领域正展现出前所未有的就业热度与人才红利

2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。

在这里插入图片描述

说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。

结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”

先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。

即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!

如何学习AGI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。

四、大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享

java: 错误: 无效的源发行版:17 阅读详情

相关推荐

学习Java应该关注哪些网站?

下面是我总结的一些不错的网站,可以收藏看一下哈~希望对你有帮助

SiKi学院的博客 1095

java环境变量的配置

配置java环境变量,检测环境变量是否配置成功

weixin_52070377的博客 7万+

Java小白从入门到精通,Java零基础入门看这一篇就够了

作为刚刚接触java的小白,今天这篇文章的目的是帮助大家快速入门java,少走弯路 如何快速入门Java? 一、作为刚接触Java的新手,先了解Java的基础。 Java 基本语法、Java 平台应用、Java的核心概念:JVM、JDK、JRE以及Java面向对象思想,同时要会学到如何在系统中搭建Java开发环境,以及如何利用第三方工具进行Java程序的开发。 还有记住学习Java语言最重要的是两点: 学习步骤/方法 学习资源 找到适合自己的学习方式,找到适合自己现阶段的学习资料,学习的过程中最好记笔记,.

qq_51082517的博客 9388

java安装教程

java安装教程

小白学CS 10万+

java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

这篇文章主要总结我之前所学过的框架以及学习路线 从实打实的零基础到框架再到项目 之后实习工作 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 也在这篇博客中记录我的学习笔记 以及在笔记中遇到的配置安装、代码bug等错误 都从零开始摸索并且记录了下来 后期也会一直实时更新 一键三连防丢失

码农研究僧的博客 3万+

OnePlus救砖指南:线刷包与OTA全量包实战解析

本文详细解析了OnePlus手机救砖的两种核心方法:线刷包与OTA全量包。针对手机变砖的不同状况(如黑屏、能进Recovery等),文章提供了清晰的判断标准和对应的实战操作指南。重点阐述了线刷包作为终极救砖手段的底层原理与详细步骤,并对比了OTA全量包作为温和修复方案的使用场景与卡刷流程,旨在帮助用户安全、有效地恢复手机系统。

weixin_28312391的博客 1318

java 集合,零基础入门到精通,收藏这篇就够了

集合建立在数组基础上,主要位于java.util包中,用来存储Java类对象,并且可以实现各种数据结构。集合大小可以改变,可以存放不同数据类型数据。集合不能存放基本类型数据,只能存放引用数据类型数据。集合不仅可以方便地存放数据,而且提供了添加、读取和删除数据等实用方法。集合中只能存放对象,JVM会自动将基本类型与相应的包装类型转换(装箱:基本类型→对象;拆箱:对象→基本类型)。二、Java集合的类框架**接口:**是代表集合的抽象数据类型。

Python_0011的博客 768

关于Vscode配置Unity环境时的一些报错问题(持续更新)

3.找到设置文件,添加如下代码,用于告诉VSCode)在处理 C# 项目时优先使用 C# 扩展来加载和管理项目,而不是使用 C# Dev Kit 或其他扩展。1.很可能是unity的插件版本问题,打开window > package manager将。2.很可能是项目文件的问题,建议unity打开edit > perfercenes。3.手动重装其他版本的.Net框架(去官网找,多下几个无所谓的)解决:(由于造成问题不一样,所以建议都尝试一次)下载net请求超时(一般都会超时很正常的)

bug制造机 1888

java中的集合_java集合,零基础入门到精通,收藏这篇就够了

1、集合只能存放对象2、集合与数组的不同在于:集合可变长度,不限制元素的类型,存储任意类类型的数据,也可以限定元素的类型——泛型3、集合可以自动扩容Set接口没有提供Collection接口额外的方法,但实现Set接口的集合类中的元素是不可重复的。JDKAPI中所提供的Set集合类常用的有:​ HashSet:散列存放(重点)​ TreeSet:有序存放(重点)​ LinkedHashSet: 有次序。

Javachichi的博客 1214

一文理解近红外光谱数据建模步骤的细节(细节知识总结)

上一篇文章,向入门的同志大体介绍了近红外光谱数据建模的内容,依据上文其实已经可以基本完成数据建模的工作,但是很多工作不够细致,本文便是分享其中的一些技术细节。

weixin_46207310的博客 5567

物理与工程中的‘黑话’:Kronecker delta和Levi-Civita符号到底简化了什么?

本文深入解析了物理与工程中常用的Kronecker delta和Levi-Civita符号的简化作用。通过对比传统表示与张量表示,展示了这些符号在向量运算、矩阵迹计算及流体力学模拟中的高效应用,显著提升计算效率和代码可读性。特别适合理论物理和工程数学领域的学习者与从业者。

weixin_27215403的博客 399

Java集合框架全面详解,零基础入门到精通,收藏这篇就够了

集合框架是一个统一的架构,用于表示和操作集合,使集合能够独立于其实现细节进行操作。Java集合框架提供了一系列接口和类,用于存储、检索、操作和传输数据对象。尽管Java集合框架提供了丰富的实现,但有时您可能需要创建自定义的集合类。扩展现有集合类@Override@Override实现集合接口size = 0;@Override@Override@Override// 省略其他必要的方法实现...使用组合而非继承@Override。

Libra1313的博客 965

Python+gensim【中文LDA】简洁模型

文章目录完整代码过程详解words_lsdictionarydictionary.doc2bow函数corpuslda 完整代码 from gensim import corpora, models import jieba.posseg as jp # 待分析文本集 text1 = '美国教练坦言,没输给中国女排,是输给了郎平' text2 = '中国女排世界排名第一?真实水平如何,听听巴西和美...

ArYe 2万+

最新Java教程(非常详细)零基础入门到精通,收藏这篇就够了

有些大厂,例如奇安信,甚至会将渗透岗位分为红蓝两方,对候选人的技术要求比较高,大部分刚入行的新人,也将渗透岗位作为后期的发展目标。①就业环境:网络安全可以在计算机科学与技术、信息通信、电子商务、互联网金融、电子政务等领域从事相关工作,还可以在政府机关事业单位、银行、保险、证券等金融机构,电信、传媒等行业从事相关工作。推进相关安全管控策略在平台落地、执行。**岗位释义:**主要负责信息安全事件应急响应、攻击溯源、取证分析工作,参与应急响应、攻击溯源、取证分析技术的研究,提升整体重大信息安全事件应急处置能力。

Python_0011的博客 4768

在 ABAP 环境中创建 Job Catalog Entry 和 Job Template 的完整实践指南

摘要:本文介绍了SAP BTP ABAP环境中Application Job的云原生解决方案,对比传统后台作业模式。重点阐述了Job Catalog Entry和Job Template两大核心概念,通过库存重估业务场景演示如何实现可调度类、创建Job Catalog Entry及Job Template。文章详细说明了从ABAP类到Job Catalog Entry再到Job Template的完整链路,并分享实际项目中的设计经验和注意事项,帮助开发者将传统后台作业迁移到Application Job框架

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 232

【AI智能体】Codex AI 辅助编程高级技能实战操作详解

Codex AI 辅助编程高级技能实战操作详解

congge 6758

C语言基础总结,零基础入门到精通,收藏这篇就够了

一. C语言初识与简单介绍二. 数据类型及语句1. C语言的注释2. C语言数据类型和关键字3. 存储相关的关键字4. if选择结构5. switch case语句6. break语句的用法7. while循环语句8. for循环语句9. continue语句10. 格式化输出函数printf11. 类型转换三. 数组1. 数组的分类2. 数组的初始化四. 函数1. 函数的分类2. 函数的定义3. 函数的声明4. 变量的存储类别五. 预处理1. C语言编译过程2. 文件包含 #include。

leah126的博客 1万+

手把手教你学simulink(13.2)--构建一个单相并网逆变器Simulink仿真模型

基于Simulink的单相并网逆变器项目的详细仿真实例。这个项目将重点放在逆变器的详细建模、最大功率点跟踪(MPPT)控制策略、并网控制和仿真分析上。我们将使用MATLAB/Simulink来构建整个系统,并通过具体的代码和模块来实现各个功能。

MHD0815的博客 545

Java 集合实战练习,零基础入门到精通,收藏这篇就够了

设计一个学生管理系统,使用ArrayList存储学生信息(包括学号String、姓名String、年龄int和成绩double。

Python_0011的博客 1097

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

五万字15张导图Java自学路线,小白零基础入门,程序员进阶,收藏这篇就够了

爆肝一周

公号:一条coding 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JAVA中的Map集合,零基础入门到精通,收藏这篇就够了

Map 是 Java 中一种非常重要的集合类型,用于存储键值对(key-value pairs)。它的常见实现类包括 HashMap、TreeMap、LinkedHashMap 等,主要区别在于它们对键值对的存储和顺序管理方式。添加一个键值对到 Map 中,键已存在则更新对应的值。map.put("手表", 100);map.put("手表", 220);// 更新"手表"的值map.put("手机", 2);// 输出: {手表=220, 手机=2}Map提供了丰富的功能来管理键值对。

leah126的博客 943

【Java】2025 年 Java 学习路线:从入门到精通,收藏这篇就够了

Java作为一门拥有近30年历史的编程语言,凭借其和,始终占据编程语言排行榜前列。面对云原生、微服务、AI等技术的蓬勃发展,Java也在持续进化(如虚拟线程、GraalVM)。本文将为初学者和进阶者梳理一条清晰的2025年Java学习路线,涵盖的全流程,并提供实用的学习资源推荐。

Libra1313的博客 3045

java常见集合有什么_java 有哪些集合,零基础入门到精通,收藏这篇就够了

分类接口/类特点适用场景ListArrayList动态数组,查询快频繁读取,较少修改LinkedList双向链表,增删快频繁插入、删除(如队列、栈)SetHashSet哈希表实现,无序快速去重、查找维护插入顺序需保留插入顺序TreeSet红黑树实现,自动排序需要有序数据QueueLinkedList双端队列普通队列或栈操作堆实现,优先级排序任务调度、优先级队列MapHashMap哈希表,无序高频读写维护插入/访问顺序LRU缓存、保留顺序TreeMap红黑树,自动排序。

Python_0011的博客 710

【Java】java 集合框架(详解)零基础入门到精通,收藏这篇就够了

Collection 接口是Java单列集合中的 根接口,它定义了各种具体单列集合的共性其他单列集合大多直接 或 间接继承该接口。由于是接口不能直接使用,就需要通过类来实现Collection 接口由Collection 接口的定义可以看到,Collection是Iterable的子接口,Collection和Iterable后面的 表示 它两 都使用了泛型🎈 如果不想按照实现了Comparable接口的类中compareTo()方法。

Libra1313的博客 786

2025版最新零基础学Java,从入门到精通的完整指南,收藏这篇就够了

无论你是想成为一名专业的Java开发者,还是对编程感兴趣的爱好者,这篇教程都能帮你打下扎实的基础。

Libra1313的博客 4417

Java Set集合的详解,零基础入门到精通,收藏这篇就够了

判断两个元素是否相同,先要判断元素的hashCode值是否一致,只有在该值一致的情况下,才会判断equals方法,如果存储在HashSet中的两个对象hashCode方法的值相同equals方法返回的结果是true,那么HashSet认为这两个元素是相同元素,只存储一个(重复元素无法存入)。元素的哈希值是通过元素的hashcode方法 来获取的, HashSet首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals方法 如果 equls结果为true ,HashSet就视为同一个元素。

Libra1313的博客 642
上一篇: java多线程,零基础入门到精通,收藏这篇就够了
下一篇: Java常见面试题及答案汇总(2026持续更新)_java面试题,零基础入门到精通,收藏这篇就够了
程序员_大白
博客等级 码龄5年 1万+粉丝 4001原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值