数据结构与算法——Java实现 4.数组

news2024/11/13 14:33:18

目录

一、数组 — 概述

1.定义

2.特点

 3.公式

小测试

二、数组的性能

1.空间占用

2.随机访问

三、动态数组

1.实现动态数组

2.新增元素(最后一个元素位置)

3.新增元素、数组扩容

4.检查数组容量

 5.类中定义的其他方法

① 按索引查找元素

② 返回数组长度

③ 遍历数组

④ 遍历泛型

⑤ 函数式接口遍历

⑥ 迭代器遍历

⑦ Java流的方式遍历

⑧ 删除元素值

⑨ 重写比较方法

 6.整体代码

① 类

② 测试类

7.插入或删除性能

四、二维数组

1.定义格式

2.内存分布及内存占用

五、数组的缓存与局部性原理

局部性原理


上帝,请赐予我平静,去接受我无法改变的;

给予我勇气,去改变我能改变的;

赐我智慧,分辨这两者的区别。

                                                        —— 24.9.8

一、数组 — 概述

1.定义

        在计算机科学中,数组是由一组元素(值或变量)组成的数据结构。每个元素有至少一个索引或键来标识(元素的类型必须一致

2.特点

        数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来,例如:

int[] arr = {1,2,3,4,5}
//           0 1 2 3 4

 3.公式

        知道了数组的数据起始地址BaseAddress,就可以由公式BaseAddress + i * size计算出索引 i 元素的地址

        ① i 即索引,在Java、C等语言中都是从 0 开始

        ② size 是每个元素占用的字节,例如 int 占 4 位,double 占 8 位 

小测试

byte[] array = {1,2,3,4,5};

已知array的数据的起始地址是0x7138f94c8,那么元素3的地址是什么?

        0x7138f94c8 + 2*1 = 0x7138f94ca

        16进制:0123456789abcdef

二、数组的性能

1.空间占用

Java 中数组结构为:

        8字节 markword(记录对象的哈希码、锁的信息等)
        4字节 class 指针(压缩类指针的情况)
        4字节 数组大小(决定了数组最大容量是 232)
        数组元素 + 对齐字节(java 中所有对象大小都是8字节的整数倍,不足的要用对齐字节补足)

例如:

int[] array = {1,2,3,4,5};

8 + 4 + 4 * 5 + 4(alignment)

markdown+指针+元素+对齐字节  

2.随机访问

即根据索引查找元素,与数据规模没有关系,时间复杂度是O(1)

三、动态数组

1.实现动态数组

size —— 逻辑大小,代表数组中有效的元素个数

capacity —— 数组的容量,代表数组中最大可以容纳的元素数

public class demo1ArrayVectorInsert implements Iterable<Integer> {
    // 准备三个属性
    private int size = 0;// 逻辑大小
    private int capacity = 8;// 容量
    // 懒惰初始化思想
    private int[] array = {};
}

2.新增元素(最后一个元素位置)

    public void addLast(int element){
        // size代表数组内有效元素个数
        // array[size] = element;
        // size++;
        add(size,element);
    }

3.新增元素、数组扩容

    // 数组增加元素,需要先进行数组扩容
    // index:插入元素的位置索引,element:插入的元素
    // 如果容量不够,需要先扩容
    public void add(int index,int element){
        // 容量的检查
        checkAndGrow();
        // System.arraycopy(array,index,array,index+1,size-index):实现数组间的元素复制
        if(index < size && index >= 0) { // 拷贝到0-size-1的区间内
            // 从原始数组array的index索引开始,拷贝到同一个数组array,向后移动一位,拷贝size-index个元素
            System.arraycopy(array, index, array, index + 1, size - index);
        } else if (index == size) {
            array[index] = element;
            size ++;
        } else{
            // 对插入位置合法性进行判断
            System.out.println("Index out of bounds");
            return;
        }
    }

4.检查数组容量

    private void checkAndGrow() {
        // 容量的检查
        if(size == 0){
            // 检查数组容量是否为8
            array = new int[capacity];
        } else if(size == capacity){
            // 数组容量已满,应进行扩容:1.5倍 1.618倍 2倍
            capacity = capacity + (capacity >> 1);
            // 复制到新数组
            int[] newArray = new int[capacity];
            System.arraycopy(array,0,newArray,0,size);
            array = newArray;
        }
    }

 5.类中定义的其他方法

① 按索引查找元素

    // 按索引查找元素
    public int get(int index) {
        return array[index];
    }

② 返回数组长度

    // 返回数组长度
    public int length(){
        return array.length;
    }

③ 遍历数组

    // 遍历数组
    public void forEach(){
        for(int i = 0; i < size; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }

④ 遍历泛型

    // 遍历泛型
    public void forEachGenirics(Consumer<Integer> consumer){
        for (int i = 0; i < size; i++) {
            consumer.accept(array[i]);
        }
    }

⑤ 函数式接口遍历

    // consumer函数式接口,consumer:一个参数,没有返回值
    public void Foreach(Consumer<Integer> consumer){
        for (int i = 0; i < size; i++) {
        //    System.out.print(array[i]+" ");
            // 提供 array[i]
            // 返回 void
            consumer.accept(array[i]);
            System.out.print(" ");
        }
        System.out.println();
    }

⑥ 迭代器遍历

    // 迭代器遍历
    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            // 匿名内部类的写法
            int i = 0;
            @Override
            // 判断有没有下一个元素
            public boolean hasNext() {
                return i < size;
            }

            @Override
            // 返回当前元素,并移动到下一个元素
            public Integer next(){
                return array[i++];
            }
        };
    }

⑦ Java流的方式遍历

    // Java流的方式进行遍历
    public IntStream stream(){
        return IntStream.of(array);
    }

⑧ 删除元素值

   // 删除元素值
    public int remove(int index){
        if(index < size && index >= 0) {
            int removed = array[index];
            if(index < size - 1){
                System.arraycopy(array, index + 1, array, index, size - index - 1);
            }
            // arraycopy(原始数组,要移动的起始位置,目标数组,目标数组的起始位置),要移动的元素个数
            size--;
            return removed;
        }else {
            System.out.println("Index out of bounds");
            return 0;
        }
    }

⑨ 重写比较方法

    // 重写比较方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        demo1ArrayVectorInsert integers = (demo1ArrayVectorInsert) o;
        return size == integers.size && capacity == integers.capacity && Objects.deepEquals(array, integers.array);
    }

    @Override
    public int hashCode() {
        return Objects.hash(size, capacity, Arrays.hashCode(array));
    }

 6.整体代码

① 类

package Day2Array;

import java.util.Arrays;
import java.util.Iterator;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.stream.IntStream;

// Java自己实现ArrayList动态数组
// 迭代器遍历,实现一个接口Iterable
public class demo1ArrayVectorInsert implements Iterable<Integer> {
    // 准备三个属性
    private int size = 0;// 逻辑大小
    private int capacity = 8;// 容量
    // 懒惰初始化思想
    private int[] array = {};

    // 新增元素
    public void addLast(int element){
        // size代表数组内有效元素个数
        // array[size] = element;
        // size++;
        add(size,element);
    }

    // 数组增加元素,需要先进行数组扩容
    // index:插入元素的位置索引,element:插入的元素
    // 如果容量不够,需要先扩容
    public void add(int index,int element){
        // 容量的检查
        checkAndGrow();
        // System.arraycopy(array,index,array,index+1,size-index):实现数组间的元素复制
        if(index < size && index >= 0) { // 拷贝到0-size-1的区间内
            // 从原始数组array的index索引开始,拷贝到同一个数组array,向后移动一位,拷贝size-index个元素
            System.arraycopy(array, index, array, index + 1, size - index);
        } else if (index == size) {
            array[index] = element;
            size ++;
        } else{
            // 对插入位置合法性进行判断
            System.out.println("Index out of bounds");
            return;
        }
    }

    private void checkAndGrow() {
        // 容量的检查
        if(size == 0){
            // 检查数组容量是否为8
            array = new int[capacity];
        } else if(size == capacity){
            // 数组容量已满,应进行扩容:1.5倍 1.618倍 2倍
            capacity = capacity + (capacity >> 1);
            // 复制到新数组
            int[] newArray = new int[capacity];
            System.arraycopy(array,0,newArray,0,size);
            array = newArray;
        }
    }

    // 按索引查找元素
    public int get(int index) {
        return array[index];
    }

    // 返回数组长度
    public int length(){
        return array.length;
    }

    // 遍历数组
    public void forEach(){
        for(int i = 0; i < size; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }

    // 遍历泛型
    public void forEachGenirics(Consumer<Integer> consumer){
        for (int i = 0; i < size; i++) {
            consumer.accept(array[i]);
        }
    }

    // consumer函数式接口,consumer:一个参数,没有返回值
    public void Foreach(Consumer<Integer> consumer){
        for (int i = 0; i < size; i++) {
        //    System.out.print(array[i]+" ");
            // 提供 array[i]
            // 返回 void
            consumer.accept(array[i]);
            System.out.print(" ");
        }
        System.out.println();
    }


    // 迭代器遍历
    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            // 匿名内部类的写法
            int i = 0;
            @Override
            // 判断有没有下一个元素
            public boolean hasNext() {
                return i < size;
            }

            @Override
            // 返回当前元素,并移动到下一个元素
            public Integer next(){
                return array[i++];
            }
        };
    }

    // Java流的方式进行遍历
    public IntStream stream(){
        return IntStream.of(array);
    }

    // 删除元素值
    public int remove(int index){
        if(index < size && index >= 0) {
            int removed = array[index];
            if(index < size - 1){
                System.arraycopy(array, index + 1, array, index, size - index - 1);
            }
            // arraycopy(原始数组,要移动的起始位置,目标数组,目标数组的起始位置),要移动的元素个数
            size--;
            return removed;
        }else {
            System.out.println("Index out of bounds");
            return 0;
        }
    }

    // 重写比较方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        demo1ArrayVectorInsert integers = (demo1ArrayVectorInsert) o;
        return size == integers.size && capacity == integers.capacity && Objects.deepEquals(array, integers.array);
    }

    @Override
    public int hashCode() {
        return Objects.hash(size, capacity, Arrays.hashCode(array));
    }
}

② 测试类

package Day2Array;

import org.junit.Test;
import org.junit.jupiter.api.DisplayName;

public class test {
    @Test
    @DisplayName("删除遍历")
    public void test1() {
        demo1ArrayVectorInsert demo1ArrayVectorInsert = new demo1ArrayVectorInsert();
        demo1ArrayVectorInsert.addLast(1);
        demo1ArrayVectorInsert.addLast(2);
        demo1ArrayVectorInsert.addLast(3);
        demo1ArrayVectorInsert.addLast(4);
        demo1ArrayVectorInsert.addLast(5);

        int res = demo1ArrayVectorInsert.get(4);
        System.out.println(res);
    }

    @Test
    @DisplayName("删除遍历")
    public void test2() {
        demo1ArrayVectorInsert demo1ArrayVectorInsert = new demo1ArrayVectorInsert();
        demo1ArrayVectorInsert.addLast(1);
        demo1ArrayVectorInsert.addLast(2);
        demo1ArrayVectorInsert.addLast(3);
        demo1ArrayVectorInsert.addLast(4);
        demo1ArrayVectorInsert.addLast(5);

        // 遍历的方法
        // ① 自己写一个for循环,在类中写一个函数返回数组长度
        for (int i = 0; i < demo1ArrayVectorInsert.length(); i++) {
            System.out.print(demo1ArrayVectorInsert.get(i)+" ");
        }
        System.out.println(" ");

        // ② 在数组中写一个遍历的函数,调用函数
        demo1ArrayVectorInsert.forEach();

        // ③ 类定义一个接口,在数组中遍历的函数参数传递一个泛型,在调用函数时进行具体的实现
        demo1ArrayVectorInsert.forEach(element -> {
            demo1ArrayVectorInsert.forEach();
            System.out.print(element+" ");
        });

        // ④ 类定义一个接口,定义一个方法传递泛型类型,调用该方法时时进行具体的实现
        // 将来可以直接调用时修改函数,不需要再函数的定义内部进行代码的修改
        demo1ArrayVectorInsert.forEachGenirics(element -> {
            System.out.println(element);
        });

        // ⑤ 迭代器遍历:实现接口,用增强for循环使用
        demo1ArrayVectorInsert.Foreach(element->{
            demo1ArrayVectorInsert.forEach();
            System.out.print(element+" ");
        });
    }

    @Test
    @DisplayName("删除遍历")
    public void test3() {
        demo1ArrayVectorInsert demo1ArrayVectorInsert = new demo1ArrayVectorInsert();
        demo1ArrayVectorInsert.addLast(1);
        demo1ArrayVectorInsert.addLast(2);
        demo1ArrayVectorInsert.addLast(3);
        demo1ArrayVectorInsert.addLast(4);
        demo1ArrayVectorInsert.addLast(5);

        for (Integer element : demo1ArrayVectorInsert) {// hashNext() next()
            System.out.print(element+" ");
        }
    }

    @Test
    @DisplayName("删除遍历")
    public void test4() {
        demo1ArrayVectorInsert demo1ArrayVectorInsert = new demo1ArrayVectorInsert();
        demo1ArrayVectorInsert.addLast(1);
        demo1ArrayVectorInsert.addLast(2);
        demo1ArrayVectorInsert.addLast(3);
        demo1ArrayVectorInsert.addLast(4);
        demo1ArrayVectorInsert.addLast(5);

        demo1ArrayVectorInsert.stream().forEach(element->{
            System.out.print(element+" ");
        });
    }

    @Test
    @DisplayName("删除测试")
    public void test5() {
        demo1ArrayVectorInsert demo1ArrayVectorInsert = new demo1ArrayVectorInsert();
        demo1ArrayVectorInsert.addLast(1);
        demo1ArrayVectorInsert.addLast(2);
        demo1ArrayVectorInsert.addLast(3);
        demo1ArrayVectorInsert.addLast(4);
        demo1ArrayVectorInsert.addLast(5);

        // 删除第三位,索引为2的元素
        int removed = demo1ArrayVectorInsert.remove(2);
        demo1ArrayVectorInsert.forEach();
        // 验证期望删除值与返回值是否相等
        if(3 == removed){
            System.out.println("true");
        }else{
            System.out.println("false");
        }

        int removed2 = demo1ArrayVectorInsert.remove(3);
        demo1ArrayVectorInsert.forEach();
        // 验证期望删除值与返回值是否相等
        if(5 == removed){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
    }

    @Test
    @DisplayName("扩容数组")
    public void test6() {
        demo1ArrayVectorInsert demo1ArrayVectorInsert = new demo1ArrayVectorInsert();
        for (int i = 0; i < 9; i++) {
            demo1ArrayVectorInsert.addLast(i+1);
        }
        demo1ArrayVectorInsert demo1ArrayVectorInsert1 = new demo1ArrayVectorInsert();
        demo1ArrayVectorInsert1.add(0,1);
        demo1ArrayVectorInsert1.add(1,2);
        demo1ArrayVectorInsert1.add(2,3);
        demo1ArrayVectorInsert1.add(3,4);
        demo1ArrayVectorInsert1.add(4,5);
        demo1ArrayVectorInsert1.add(5,6);
        demo1ArrayVectorInsert1.add(6,7);
        demo1ArrayVectorInsert1.add(7,8);
        demo1ArrayVectorInsert1.add(8,9);

        System.out.println("创建的新数组与目标数组是否相等:"+ demo1ArrayVectorInsert1.equals(demo1ArrayVectorInsert));
    }
}

7.插入或删除性能

① 头部位置,时间复杂度是 O(n)

② 中间位置,时间复杂度是 O(n)

③ 尾部位置,时间复杂度是 O(1) (均摊来说)

四、二维数组

1.定义格式

int[][] array = {

        {11,12,13,14,15},

        {21,22,23,24,25},

        {31,32,33,34,35}

};

2.内存分布及内存占用

i:代表外层数组的索引位置

j:代表内层数组的索引位置

五、数组的缓存与局部性原理

局部性原理

这里只讨论空间局部性

       ① cpu读取内存(速度慢)数据后,会将其放入高速缓存(速度快)当中,如果后来的计算再用到此数据在缓存中能读到的话,就不必读内存了

        ② 缓存的最小存储单位是缓存行(cache line),一般是 64 bytes,一次读的数据少了不划算,因此最少读 64 bvtes 填满一个缓存行,因此读入某个数据时也会读取其临近的数据,这就是所谓空间局部性

        先行后列访问的是连续内存,先列后行访问的是非连续内存,相当于访问链表

先i后j:int[0][0] ——> [0][1] ——> [0][2]... ——> [0][j]

            int[1][0] ——> [1][1] ——> [1[2]... ——> [1][j]

                ……

             int[i][0] ——> [i][1] ——> [i[2]... ——> [i][j]

先j后i:int[0][0]

             int[1][0]

             int[2][0]

                …

             int[i][0]

                ……

             int[][j]

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

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

相关文章

python例子:相片处理工具(可视化)

作品名称&#xff1a;相片处理工具&#xff08;可视化&#xff09; 开发环境&#xff1a;PyCharm 2023.3.4 python3.7 用到的库&#xff1a;sys、os、cv2、numpy、math和random 作品简介&#xff1a;运行例子后&#xff0c;先选择需要处理的图片&#xff0c;然后可对图片进…

鸿蒙开发中实现自定义弹窗 (CustomDialog)

效果图 #思路 创建带有 CustomDialog 修饰的组件 &#xff0c;并且在组件内部定义controller: CustomDialogController 实例化CustomDialogController&#xff0c;加载组件&#xff0c;open()-> 打开对话框 &#xff0c; close() -> 关闭对话框 #定义弹窗 (CustomDial…

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展&#xff0c;Web应用的需求日益增长&#xff0c;而Django作为一个高级的Python Web框架&#xff0c;以其强大的功能和灵活的架构&#xff0c;成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用&#xff0c;并将其部署到线…

springboot学习(10)(自定义starter)(自定义mybatis的starter)(解决:java:错误:不支持发行版本?)

目录 一、引言 &#xff08;1&#xff09;为什么要学习自定义starter&#xff1f; &#xff08;2&#xff09;如何自定义starter&#xff1f; 二、制作一个自定义mybatis-starter &#xff08;1&#xff09;需求 &#xff08;2&#xff09;步骤 &#xff08;3&#xff09;开始实…

SQL各子句的执行顺序

FROM 、WHERE 、GROUP BY 、HAVING、 SELECT、ORDER BY 、LIMIT 执行顺序如下&#xff1a; FROM 子句&#xff1a;确定查询的基础表和视图。 WHERE 子句&#xff1a;基于指定的条件过滤记录。 GROUP BY子句&#xff1a;按指定的列分组结果集中的记录。 HAVING子句&#xff…

网上订餐新体验:SpringBoot技术驱动

1 绪论 1.1 研究背景 随着互联网技术的快速发展&#xff0c;网络时代的到来&#xff0c;网络信息也将会改变当今社会。各行各业在日常企业经营管理等方面也在慢慢的向规范化和网络化趋势汇合[13]。电子商务必将成为未来商务的主流&#xff0c;因此对于餐饮行业来说&#xff0c;…

Spring2~~~

注解配置Bean Spring的 IOC 容器检查到注解就会生成对象&#xff0c;但这个注解的具体含义不会识别 配置自动扫描的包 <!--配置容器要扫描的包1. component-scan 要对指定包下的类进行扫描, 并创建对象到容器2. base-package 指定要扫描的包3. 含义是当spring容器创建/初始…

类和对象(中)- C++

个人主页点这里~ 1. 类的默认成员函数 在C中&#xff0c;当你定义一个类时&#xff0c;即使没有显式地声明它们&#xff0c;编译器也会为该类生成一些默认成员函数。这些默认成员函数在特定情况下非常有用&#xff0c;尤其是当你进行对象拷贝、赋值、销毁或动态内存管理时。 …

BatchUpdateException 问题

我们在使用 statement 的 batch api 时、每 20 条数据作为一个事务提交、如果其中一条数据有问题 我们想知道哪一条数据有问题、那么我们可以通过捕获的 BatchUpdatedException 获取到 我们插入 100 条数据、第 21 条和第 41 条是非法数据、会插入失败的 看看日志打印 看看…

函数指针学习

认识函数指针&#xff1a; 函数指针的用处&#xff1a; 回调函数&#xff08;以函数指针为参数的参数&#xff09; 定义带标签的结构体 typedef struct mode { int data; } Node; 标签&#xff08;mode&#xff09;: mode 是结构体的标签名。在这种定义中&#xff0c;mo…

前端:Vue3学习-2

前端:Vue3学习-2 1. vue3 新特性-defineOptions2. vue3 新特性-defineModel3. vue3 Pinia-状态管理工具4. Pinia 持久化插件 -> pinia-plugin-persistedstate 1. vue3 新特性-defineOptions 如果要定义组件的name或其他自定义的属性&#xff0c;还是得回归原始得方法----再…

Codigger 携手 Jupyter:革新数据科学与编程体验

在现今的数字化时代&#xff0c;数据科学正在多个领域内如日中天地发展。数据分析和数据挖掘需求无处不在&#xff0c;对数据的理解与运用&#xff0c;成为许多企业及科研团队取得成功的重要因素。在这个大背景下&#xff0c;Jupyter 项目以其独特的设计理念和强大功能&#xf…

k8s API资源对象ingress

有了Service之后&#xff0c;我们可以访问这个Service的IP&#xff08;clusterIP&#xff09;来请求对应的Pod&#xff0c;但是这只能是在集群内部访问。 要想让外部用户访问此资源&#xff0c;可以使用NodePort&#xff0c;即在node节点上暴漏一个端口出来&#xff0c;但是这…

UNITY UI简易反向遮罩

附带示例资源文件&#xff1a;https://download.csdn.net/download/qq_55895529/89726994?spm1001.2014.3001.5503 大致效果&#xff1a; 实现思路:通过ui shader的模板测试功能实现 通过让想要被突出显示的物体优先渲染并写入模板值,而后再让黑色遮罩渲染并判断模板值进行渲…

机试算法模拟题 服务中心选址

题目描述 一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置&#xff0c;并希望能够以此为依据为新的服务中心选址&#xff1a;使服务中心到所有区域的距离的总和最小。 给你一个数组positions&#xff0c;其中positions[i] [left, ri…

单项链表的原地反转

逻辑图如下所示&#xff1a; 只需要将需要反转的节点放到头节点位置即可&#xff0c; 使用两个指针一个指针指向需要反转的节点&#xff0c;另一个指针指向需要反转的指针的前驱节点&#xff08;其实也就是元链表的头节点&#xff09; 操作过程&#xff1a; 1 2 3 4 5 2 1 …

零基础国产GD32单片机编程入门(十五)CAN通讯详解及实战含源码

文章目录 一.概要二.CAN网络基本组成三.GD32单片机CAN结构与特点1.GD32F103单片机CAN基本结构图2.GD32F103单片机CAN基本特点 四.CAN协议帧格式五.GD32F103C8T6的CAN通讯波特率六.GDF103C8T6的CAN接收过滤器配置七.配置一个CAN通讯数据收发例程八.工程源代码下载九.小结 一.概要…

机器之心 | 挑战Transformer的Mamba是什么来头?作者博士论文理清SSM进化路径

本文来源公众号“机器之心”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;挑战Transformer的Mamba是什么来头&#xff1f;作者博士论文理清SSM进化路径 对 SSM 感兴趣的研究者不妨读一下这篇博士论文。 在大模型领域&#xff0c;…

仕考网:2025年公务员国考备考技巧

公务员考试掌握好备考技巧非常重要&#xff0c;尤其是国考这种竞争比较激烈的考试&#xff0c;仕考网为大家分享一些备考技巧&#xff0c;希望能对大家有所帮助。 1. 在提升行测分数时&#xff0c;可以采用大量的练习题、整理题以及关注往年核心考点的方式。无论处于准备过程的…

JsonPath全英文文档学习

JsonPath全英文文档学习 1、文档地址2、引入依赖3、浏览翻译问题修复4、文档学习4.1、Operator4.2、Functions4.3、Filter 运算符4.4、json示例 5、实战5.1、获取json数组下的多个元素5.2、获取json数组下的多个元素&#xff08;循环遍历时无元素自动占位&#xff09;5.3、获取…