【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)

简介: 【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)


一、什么是数据结构

(1) 概念

🍃 数据结构是计算机存储组织数据的方式

(2) 分类

🎉 线性结构

  • 线性表(数组、链表、栈、队列、哈希表)

🎉 树形结构

  • 二叉树
  • AVL 树
  • 红黑树
  • B 树
  • Trie
  • 哈夫曼树
  • 并查集

🎉 图形结构

  • 邻接矩阵
  • 邻接表

二、线性表

🎁 线性表是具有 n 个相同类型元素的有限序列(n >= 0)

  • a1 是首节点(首元素), an 是尾结点(尾元素)
  • a1 是 a2 的前驱
  • a2 是 a1 的后继

常见的线性表有:

🎗️ 数组

🎗️ 链表

🎗️ 栈

🎗️ 队列

🎗️ 哈希表(散列表)

三、数组(Array)

(1) 数组的底层结构

🎁 数组是一种顺序存储的线性表,全部元素的内存地址是连续的

// 【new】向堆空间申请一段存储空间
int[] array = new int[]{11, 22, 33};

(2) 数组缺点

  • 👓数组有个致命的缺点:无法动态修改容量
  • 👓数组创建完毕后,能够存储的数据就固定了
  • 👓数组操纵元素的方式不够面向对象

🎐 自己实现动态数组,弥补数组的缺点

四、动态数组(Dynamic Array)接口设计

public interface List<E> {
    /**
     * 元素的数量
     */
    int size();
    /**
     * 是否为空
     */
    boolean isEmpty();
    /**
     * 是否包含某个元素
     */
    boolean contains(E element);
    /**
     * 添加元素到最后面
     */
    void add(E element);
    /**
     * 返回 index 位置对应的元素
     */
    E get(int index);
    /**
     * 设置 index 位置的元素
     */
    E set(int index, E element);
    /**
     * 往 index 位置添加元素
     */
    void add(int index, E element);
    /**
     * 删除 index 位置对应的元素
     */
    E remove(int index);
    /**
     * 返回元素的下标
     */
    int indexOf(E element);
    /**
     * 清空数组
     */
    void clear();
}

五、动态数组的设计和基本代码实现

(1) 成员变量

Java 中的成员变量会自动初始化,比如:

🎑 int 类型自动初始化为 0

🎑 对象类型自动初始化为 null

🎑 size 记录动态数组中元素的个数

🎑 elements 用于实际存储数据

🎑 动态数组的底层是数组

(2) 代码

/**
 * 只支持存储 int 类型数据的动态数组
 */
public class ArrayListInt {
    private int size;
    private int[] elements;
    public static final int DEFAULT_CAPACITY = 10;
    public static final int ELEMENT_NOT_FOUND = -1;
    public ArrayListInt() {
        this(DEFAULT_CAPACITY);
    }
    public ArrayListInt(int capacity) {
        capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
        elements = new int[capacity];
    }
    public int size() {
        return size;
    }
    public boolean isEmpty() {
        return size == 0;
    }
    /**
     * 获取 index 索引处的元素
     */
    public int get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("size: " + size + ", " + "index: " + index);
        }
        return elements[index];
    }
    /**
     * 设置 index 位置的元素
     *
     * @param index   下标
     * @param element 要设置的元素
     * @return 原来的元素ֵ
     */
    public int set(int index, int element) {
        // 获取 index 位置的元素
        int old = get(index);
        elements[index] = element;
        return old;
    }
    /**
     * 返回元素的索引
     */
    public int indexOf(int element) {
        // 如果数组为空, 直接找不到
        if (isEmpty()) return ELEMENT_NOT_FOUND;
        for (int i = 0; i < size; i++) {
            if (element == elements[i]) return i;
        }
        return ELEMENT_NOT_FOUND;
    }
    /**
     * 检查数组中是否包含 element 元素
     */
    public boolean contains(int element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }
    /**
     * 清除全部元素
     * 只要【size = 0】就无法获取到数组中的任何元素了
     */
    public void clear() {
        size = 0;
    }
}

① get ()

🎈 该方法的作用:获取 index 索引处的元素

🎈 数组可通过索引获取到元素

🎈 要做参数(index)校验

② indexOf ()

🎈 返回某个元素的索引

🎈 遍历每个下标的元素,拿数组中的每个元素和参数元素进行比较

③ clear ()

🎈 清除全部元素(清空数组)

🎈 在当前的代码中,只要【size = 0】就无法获取到数组中的任何元素了(就可以理解为清空了数组)

六、add 方法和扩容

🎈 add(int element):往数组的尾部添加元素 element

🎈 add(int index, int element):往数组的 index 索引位置添加元素 element

(1) add (int element)

🕰️ 每次往尾部添加元素的时候,是往数组的索引为 size 位置添加元素

public class ArrayListInt {
    /**
     * 往数组尾部添加元素
     */
    public void add(int element) {
        // TODO 扩容检测
        elements[size++] = element;
    }
}

(2) 打印动态数组中的元素

☆写法1:

public class ArrayListInt {
    /**
     * 遍历打印数组中的元素
     */
    public String printElements() {
        StringBuilder sb = new StringBuilder();
        sb.append("{size=").append(size).append(", [");
        for (int i = 0; i < size; i++) {
            sb.append(elements[i]);
            if (i != size - 1) {
                sb.append(", ");
            }
        }
        sb.append("]}");
        return sb.toString();
    }
}

🎨 遍历获取数组中的各个元素,然后进行拼接

🎨 Java 中大量字符串拼接用 StringBuilder 最好

☆写法2:

public class ArrayListInt {
 
    /**
     * 遍历打印数组中的元素
     */
    public String printElements() {
        StringBuilder sb = new StringBuilder();
        sb.append("{size=").append(size).append(", [");
        for (int i = 0; i < size; i++) {
            // 不是第 0 个元素就先拼接【, 】
            if (i != 0) {
                sb.append(", ");
            }
            sb.append(elements[i]);
        }
        sb.append("]}");
        return sb.toString();
    }
}

🎨 不是第 0 个元素就先拼接【, 】

🎨 相比写法1每次循环少了一次减法运算

(3) add (int index, int element)

☆ 往 index 位置插入元素 element

🎁 把 index 位置到 size - 1 位置【[index, size-1]】的元素往后挪动【空出 index 位置的元素】

🎁 把 element 元素赋值到 index 索引位置

🎁 从 索引为 size - 1 处开始挪动

public class ArrayListInt {
    /**
     * 在 index 位置插入元素 element
     */
    public void add(int index, int element) {
        // 当 index 等于 size 的时候, 是往数组的尾部添加元素
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("size: " + size + ", " + "index: " + index);
        }
        // TODO 扩容检测
        // 挪动元素(从最后一个元素开始挪动)
        for (int i = size - 1; i >= index; i--) {
            elements[i + 1] = elements[i];
        }
        // 把元素 element 赋值到 index 索引位置
        elements[index] = element;
        size++; // 数组元素加1
    }
}

(4) 数组越界异常的封装

public class ArrayListInt {
    public void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("index: " + index + " size: " + size);
    }
    public void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }
    public void rangeCheck4Add(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }
}

✏️ outOfBounds(int index):封装抛异常的方法

✏️ rangeCheck(int index):索引 index 不能小于 0 或 大于等于 size,否则都会数组越界

✏️ rangeCheck4Add(int index):添加元素的时候 index 是可以等于 size 的(此时是往数组的最后添加元素)

(5) MyJunit(接口测试)

🍃使用异常知识进行接口测试:当测试不通过的时候,会抛异常

🍃测试通过的时候,打印 Success!

public class MyJunit {
    public static void test(boolean boolean_) {
        try {
            if (!boolean_) throw new Exception("测试不通过");
            System.out.println("\nSuccess!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

(6) 扩容【 ensureCapacity() 】

📖① 申请全新的数组空间(容量适宜)

📖② 把就数据的数据复制到全新的数组中

📔 添加的时候才会考虑扩容操作

/**
     * 扩容检测
     *
     * @param capacity 数组容量至少是 capacity
     */
    private void ensureCapacity(int capacity) {
        int oldCapacity = elements.length;
        // 如果所需容量足够, 则不扩容
        if (oldCapacity >= capacity) return;
        // 申请全新的数组空间(新容量是旧容量的 1.5 倍)
        capacity = oldCapacity + (oldCapacity >> 1);
        int[] newElements = new int[capacity];
        // 把旧数组中的数据复制到新数组中
        for (int i = 0; i < size; i++) {
            newElements[i] = elements[i];
        }
        // elements 指针指向新数组
        elements = newElements;
        System.out.println(oldCapacity + "扩容为" + capacity);
    }

七、remove (int index)

📔 作用:删除 index 索引处的元素,返回之前 index 索引处的元素

📙 思路:① 用后面的元素把要 删除的索引 index 位置的元素覆盖掉

📙 ② 数组 size 减 1

📙 ③ 如何覆盖❓ 遍历

public class ArrayListInt {
    /**
     * 删除 index 位置的元素
     *
     * @param index 下标
     * @return 原来的元素
     */
    public int remove(int index) {
        // 取出 index 索引处原来的元素
        int old = get(index);
        // 覆盖掉 index 索引处的元素
        for (int i = index; i < size; i++) {
            elements[i] = elements[i + 1];
        }
        // 最后一个元素不被访问到的关键代码
        size--;
        return old;
    }
}

八、仅能存储 int 类型的动态数组 ArrayListInt 完整代码

/**
 * 只支持存储 int 类型数据的动态数组
 */
@SuppressWarnings("all")
public class ArrayListInt {
    private int size;
    private int[] elements;
    public static final int DEFAULT_CAPACITY = 10;
    public static final int ELEMENT_NOT_FOUND = -1;
    public ArrayListInt() {
        this(DEFAULT_CAPACITY);
    }
    public ArrayListInt(int capacity) {
        capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
        elements = new int[capacity];
    }
    public int size() {
        return size;
    }
    public boolean isEmpty() {
        return size == 0;
    }
    /**
     * 获取 index 索引处的元素
     */
    public int get(int index) {
        rangeCheck(index);
        return elements[index];
    }
    /**
     * 设置 index 位置的元素
     *
     * @param index   下标
     * @param element 要设置的元素
     * @return 原来的元素ֵ
     */
    public int set(int index, int element) {
        // 获取 index 位置的元素
        int old = get(index);
        elements[index] = element;
        return old;
    }
    /**
     * 返回元素的索引
     */
    public int indexOf(int element) {  
        for (int i = 0; i < size; i++) {
            if (element == elements[i]) return i;
        }
        return ELEMENT_NOT_FOUND;
    }
    /**
     * 检查数组中是否包含 element 元素
     */
    public boolean contains(int element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }
    /**
     * 清除全部元素
     * 只要【size = 0】就无法获取到数组中的任何元素了
     */
    public void clear() {
        size = 0;
    }
    /**
     * 往数组尾部添加元素
     */
    public void add(int element) {
        add(size, element);
    }
    /**
     * 在 index 位置插入元素 element
     */
    public void add(int index, int element) {
        rangeCheck4Add(index);
        // 扩容检测, 保证容量至少是【size+1】
        ensureCapacity(size + 1);
        // 挪动元素(从最后一个元素开始挪动)
        for (int i = size - 1; i >= index; i--) {
            elements[i + 1] = elements[i];
        }
        // 把元素 element 赋值到 index 索引位置
        elements[index] = element;
        size++; // 数组元素加1
    }
    /**
     * 扩容检测
     *
     * @param capacity 数组容量至少是 capacity
     */
    private void ensureCapacity(int capacity) {
        int oldCapacity = elements.length;
        // 如果所需容量足够, 则不扩容
        if (oldCapacity >= capacity) return;
        // 申请全新的数组空间(新容量是旧容量的 1.5 倍)
        capacity = oldCapacity + (oldCapacity >> 1);
        int[] newElements = new int[capacity];
        // 把旧数组中的数据复制到新数组中
        for (int i = 0; i < size; i++) {
            newElements[i] = elements[i];
        }
        // elements 指针指向新数组
        elements = newElements;
        System.out.println(oldCapacity + "扩容为" + capacity);
    }
    /**
     * 删除 index 位置的元素
     *
     * @param index 下标
     * @return 原来的元素
     */
    public int remove(int index) {
        // 取出 index 索引处原来的元素
        int old = get(index);
        // 覆盖掉 index 索引处的元素
        for (int i = index; i < size - 1; i++) {
            elements[i] = elements[i + 1];
        }
        // 最后一个元素不被访问到的关键代码
        size--;
        return old;
    }
    public void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("index: " + index + " size: " + size);
    }
    public void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }
    public void rangeCheck4Add(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }
    /**
     * 遍历打印数组中的元素
     */
    public String printElements() {
        StringBuilder sb = new StringBuilder();
        sb.append("{size=").append(size).append(", [");
        for (int i = 0; i < size; i++) {
            // 不是第 0 个元素就拼接【, 】
            if (i != 0) {
                sb.append(", ");
            }
            sb.append(elements[i]);
        }
        sb.append("]}");
        return sb.toString();
    }
}

九、泛型(让动态数组中能存放各种类型的数据)

🎁 可使用 Java 中的泛型让动态数据更加通用(在动态数组中能存放任何数据类型的数据)

(1) clear () 【对象数组】

🧣 当动态数组中可以存储任何类型的时候,对于 clear() 方法,仅仅把 size 设置为 0 是不够的

🧣 把 size 设置为 0 后,虽然使用动态数组的人无法获取到任何数据,但这些数据仍然存活在内存中【这些数据依然存在,只是你无法使用它而已】

🧣 最佳的方式是:把 size 设置为 0,并把这些内存都回收掉(置为 null)

/**
     * 清除全部元素
     */
    public void clear() {
        // 销毁堆空间的对象数据
        for (int i = 0; i < elements.length; i++) {
            elements[i] = null;
        }
        
        size = 0;
    }

(2) 对象的比较不用 【==】

🎁 两个 对象用 == 运算符进行比较的时候,比较的是两个对象的内存地址

🎁 若不想比较两个对象的内存地址,需要用 equals() 方法

public int indexOf(E element) {
        if (element == null) return ELEMENT_NOT_FOUND;
        // 如果数组为空, 直接找不到
        if (isEmpty()) return ELEMENT_NOT_FOUND;
        for (int i = 0; i < size; i++) {
            if (element.equals(elements[i])) return i;
        }
        return ELEMENT_NOT_FOUND;
    }

(3) remove (int index) 清空最后一个元素

/**
     * 删除 index 位置的元素
     *
     * @param index 下标
     * @return 原来的元素
     */
    public E remove(int index) {
        // 取出 index 索引处原来的元素
        E old = get(index);
        // 覆盖掉 index 索引处的元素
        for (int i = index + 1; i < size; i++) {
            elements[i - 1] = elements[i];
        }
        // 把最后一个元素置空
        elements[--size] = null;
        return old;
    }

(4) null 值处理

动态数组中应该要能够存放 null 值

/**
     * 返回元素的索引
     */
    public int indexOf(E element) {
        if (null == element) {
            for (int i = 0; i < size; i++) {
                if (elements[i] == null) return i;
            }
        } else {
            for (int i = 0; i < size; i++) {
                if (element.equals(elements[i])) return i;
            }
        }
        return ELEMENT_NOT_FOUND;
    }

(5) ArrayList 完整代码

/**
 * 泛型让动态数组中能存放任何数据类型的数据
 */
@SuppressWarnings("all")
public class ArrayList<E> {
    private int size;
    private E[] elements;
    public static final int DEFAULT_CAPACITY = 10;
    public static final int ELEMENT_NOT_FOUND = -1;
    public ArrayList() {
        this(DEFAULT_CAPACITY);
    }
    public ArrayList(int capacity) {
        capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
        elements = (E[]) new Object[capacity];
    }
    public int size() {
        return size;
    }
    public boolean isEmpty() {
        return size == 0;
    }
    /**
     * 获取 index 索引处的元素
     */
    public E get(int index) {
        rangeCheck(index);
        return elements[index];
    }
    /**
     * 设置 index 位置的元素
     *
     * @param index   下标
     * @param element 要设置的元素
     * @return 原来的元素ֵ
     */
    public E set(int index, E element) {
        // 获取 index 位置的元素
        E old = get(index);
        elements[index] = element;
        return old;
    }
    /**
     * 返回元素的索引
     */
    public int indexOf(E element) {
        if (null == element) {
            for (int i = 0; i < size; i++) {
                if (elements[i] == null) return i;
            }
        } else {
            for (int i = 0; i < size; i++) {
                if (element.equals(elements[i])) return i;
            }
        }
        return ELEMENT_NOT_FOUND;
    }
    /**
     * 检查数组中是否包含 element 元素
     */
    public boolean contains(E element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }
    /**
     * 清除全部元素
     */
    public void clear() {
        // 销毁堆空间的对象数据
        for (int i = 0; i < elements.length; i++) {
            elements[i] = null;
        }
        size = 0;
    }
    /**
     * 往数组尾部添加元素
     */
    public void add(E element) {
        add(size, element);
    }
    /**
     * 在 index 位置插入元素 element
     */
    public void add(int index, E element) {
        rangeCheck4Add(index);
        // 扩容检测, 保证容量至少是【size + 1】
        ensureCapacity(size + 1);
        // 挪动元素(从最后一个元素开始挪动)
        for (int i = size - 1; i >= index; i--) {
            elements[i + 1] = elements[i];
        }
        // 把元素 element 赋值到 index 索引位置
        elements[index] = element;
        size++; // 数组元素加1
    }
    /**
     * 扩容检测
     *
     * @param capacity 数组容量至少是 capacity
     */
    private void ensureCapacity(int capacity) {
        int oldCapacity = elements.length;
        // 如果所需容量足够, 则不扩容
        if (oldCapacity >= capacity) return;
        // 申请全新的数组空间(新容量是旧容量的 1.5 倍)
        capacity = oldCapacity + (oldCapacity >> 1);
        E[] newElements = (E[]) new Object[capacity];
        // 把旧数组中的数据复制到新数组中
        for (int i = 0; i < size; i++) {
            newElements[i] = elements[i];
        }
        // elements 指针指向新数组
        elements = newElements;
        System.out.println(oldCapacity + "扩容为" + capacity);
    }
    /**
     * 删除 index 位置的元素
     *
     * @param index 下标
     * @return 原来的元素
     */
    public E remove(int index) {
        // 取出 index 索引处原来的元素
        E old = get(index);
        // 覆盖掉 index 索引处的元素
        for (int i = index + 1; i < size; i++) {
            elements[i - 1] = elements[i];
        }
        // 把最后一个元素置空
        elements[--size] = null;
        return old;
    }
    public void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("index: " + index + " size: " + size);
    }
    public void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }
    public void rangeCheck4Add(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }
    /**
     * 遍历打印数组中的元素
     */
    public String printElements() {
        StringBuilder sb = new StringBuilder();
        sb.append("{size=").append(size).append(", [");
        for (int i = 0; i < size; i++) {
            // 不是第 0 个元素就拼接【, 】
            if (i != 0) {
                sb.append(", ");
            }
            sb.append(elements[i]);
        }
        sb.append("]}");
        return sb.toString();
    }
}

JDK 中内置了动态数组类:java.util.ArrayList

如有错误和疑问,欢迎和我交流

相关文章
|
1月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
87 4
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
2月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
188 3
|
4月前
|
Java 索引
Java ArrayList中的常见删除操作及方法详解。
通过这些方法,Java `ArrayList` 提供了灵活而强大的操作来处理元素的移除,这些方法能够满足不同场景下的需求。
506 30
|
5月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
295 3
|
6月前
|
人工智能 安全 JavaScript
Java ArrayList:动态数组
本文探讨Java中的数组,对比C/C++、JS/PHP/Python等语言的数组特性。文章分析了Java数组的定义、创建方式及其规范,指出其优缺点。Java数组作为引用类型,在堆上分配内存,支持动态大小,避免了C/C++中裸数组的常见问题(如越界访问)。然而,Java数组也存在性能瓶颈和设计缺陷,例如运行时的安全检查影响速度,无法创建超大数组或泛型数组,且多线程场景下缺乏同步机制。作者建议在实际开发中用集合替代数组以规避这些问题。
172 1
|
6月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
298 0
|
6月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
7月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
246 1
|
7月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
758 1
下一篇
oss云网关配置