Java自定义一个变长数组的思路与代码

首先我们来讲一下如何自定义一个变长数组。

思路

实现一个变长数组需要将数据存储在连续的内存空间中,并能够对数组的大小进行动态调整。具体实现中,我们需要考虑以下几点:

  1. 数组的存储:数组需要存储在内存空间中,可以使用Java中的数组或对象来存储。
  2. 数组的大小:数组大小的动态调整可以通过重新分配内存空间实现。
  3. 数组的操作:支持向数组中插入、删除、修改元素,以及获取指定位置的元素。

基于以上的思路,我们可以实现一个基本的变长数组。

代码

以下是一个示例代码,用于实现简单的变长数组,我们可以根据自己的需求来进行改进和优化。

public class DynamicArray<T> {
    private T[] array;
    private int size;
    private int capacity;

    public DynamicArray(int capacity) {
        this.array = (T[]) new Object[capacity];
        this.size = 0;
        this.capacity = capacity;
    }

    public DynamicArray() {
        this(10);
    }

    public int size() {
        return this.size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public T get(int index) {
        if(index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index out of bound.");
        }
        return array[index];
    }

    public void set(int index, T value) {
        if(index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index out of bound.");
        }
        array[index] = value;
    }

    public void add(T value) {
        if(size == capacity) {
            resizeArray(capacity * 2);
        }
        array[size] = value;
        size++;
    }

    public void delete(int index) {
        if(index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index out of bound.");
        }
        for(int i = index; i < size - 1; i++) {
            array[i] = array[i + 1];
        }
        size--;
        if(size <= capacity / 4) {
            resizeArray(capacity / 2);
        }
    }

    private void resizeArray(int newCapacity) {
        T[] newArray = (T[]) new Object[newCapacity];
        for(int i = 0; i < size; i++) {
            newArray[i] = array[i];
        }
        array = newArray;
        capacity = newCapacity;
    }

    public static void main(String[] args) {
        DynamicArray<Integer> array = new DynamicArray<>();
        array.add(1);
        array.add(2);
        array.add(3);
        array.add(4);
        array.add(5);
        System.out.println(array.get(3));   // 输出4
        array.set(0, 0);
        System.out.println(array.get(0));   // 输出0
        array.delete(2);
        System.out.println(array.size());   // 输出4
    }
}

上述代码中,我们定义了一个DynamicArray类,其中array数组用于存储元素,size表示当前数组大小,capacity表示数组容量。类中包含了一些基本的操作,如获取数组大小、判断是否为空、获取和设置指定位置的元素、向数组中添加元素、删除指定位置的元素。在数组大小达到容量时,会自动调整数组的容量。

示例说明

假设我们需要实现一个学生管理系统,其中需要存储所有学生的学号、姓名、年龄、性别等信息。我们可以使用自定义的变长数组来存储这些信息,代码如下:

public class Student {
    private int id;
    private String name;
    private int age;
    private String gender;

    public Student(int id, String name, int age, String gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    // getter and setter methods ...

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

public class StudentManager {
    private DynamicArray<Student> students;

    public StudentManager() {
        students = new DynamicArray<>();
    }

    public void addStudent(Student student) {
        students.add(student);
    }

    public void deleteStudent(int index) {
        students.delete(index);
    }

    public Student getStudent(int index) {
        return students.get(index);
    }

    public void setStudent(int index, Student student) {
        students.set(index, student);
    }

    public void printAllStudents() {
        for(int i = 0; i < students.size(); i++) {
            System.out.println(students.get(i));
        }
    }

    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
        manager.addStudent(new Student(1, "Tom", 18, "male"));
        manager.addStudent(new Student(2, "Lucy", 17, "female"));
        manager.addStudent(new Student(3, "Jack", 19, "male"));
        manager.addStudent(new Student(4, "Lily", 20, "female"));
        manager.printAllStudents();
    }
}

在上述示例中,我们通过定义一个Student类来存储每个学生的信息,然后使用自定义的变长数组DynamicArray来存储所有学生的信息。StudentManager类则封装了对学生信息的添加、获取、删除和修改等操作,并提供了一个printAllStudents()方法来输出所有学生的信息。

除此之外,我们也可以将上面的示例代码中的泛型<T>改为具体的类型,比如<Student>来实现一个专门存储学生信息的变长数组。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java自定义一个变长数组的思路与代码 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 详解Java程序读取properties配置文件的方法

    当我们需要在Java程序中读取一些配置信息时,通常可以使用Properties文件作为配置文件,这种方式比硬编码更加灵活、易于维护。 以下是读取Properties配置文件的方法: 准备Properties文件 首先需要准备一个Properties文件。文件扩展名通常为.properties,它是一个文本文件,可以使用任何文本编辑器来编辑。属性文件由键值对组…

    Java 2023年5月20日
    00
  • 详细分析Java内存模型

    详细分析Java内存模型的完整攻略 Java内存模型(Java Memory Model,JMM)是Java虚拟机(JVM)创造的一种抽象概念,用于规范Java程序在内存中的行为。因为Java程序是运行在虚拟机中,虚拟机又是运行在操作系统中,所以Java程序在内存中的表现是比较复杂的。Java内存模型对Java程序在内存中的访问和修改行为做了明确的规范,确保…

    Java 2023年5月26日
    00
  • Struts2在打包json格式的懒加载异常问题

    当使用Struts2进行json数据懒加载时,有可能会遇到打包json格式的异常问题。这种异常通常是由于Struts2缺少正确的json转换器或配置参数导致的。在本文中,将为您详细讲解如何解决这个问题。 1.检查json-lib库 首先要检查的事项是 json-lib 库, 您需要检查您项目中的 json-lib 包是否正常。 json-lib 库是 Str…

    Java 2023年5月20日
    00
  • SpringMVC+MyBatis 事务管理(实例)

    SpringMVC+MyBatis 事务管理(实例) 在使用SpringMVC和MyBatis进行开发时,我们通常需要使用事务管理来确保数据的一致性和完整性。本文将介绍如何在SpringMVC和MyBatis中使用事务管理,并提供两个示例说明。 步骤一:配置数据源和事务管理器 首先,我们需要配置数据源和事务管理器。可以通过在applicationContex…

    Java 2023年5月17日
    00
  • 利用Springboot实现Jwt认证的示例代码

    本文将为大家详细讲解如何使用Spring Boot实现JWT认证,并提供两个示例说明。请按照下面的步骤操作。 前置条件 在开始之前,您需要了解: Java及其相关技术(Java web开发、Spring Boot框架等); JWT(JSON Web Token)认证方式的基本概念和使用方法。 步骤 1. 添加依赖 请在您的项目中添加Spring Securi…

    Java 2023年5月31日
    00
  • java睡眠排序算法示例实现

    Java睡眠排序算法示例实现是一种非常特殊的排序算法,它通过将数组中每个元素对应的线程让其进入睡眠状态,进而实现了对数组内元素的排序。下面我将详细介绍Java睡眠排序算法的完整攻略,并附上两个示例,希望对您有所帮助。 Java睡眠排序算法的基本原理 Java睡眠排序算法的基本原理是,对于一个包含n个元素的待排序数组,我们可以创建n个线程,每个线程对应数组中的…

    Java 2023年5月19日
    00
  • Java 项目生成静态页面的代码

    生成静态页面的过程可以通过以下步骤完成: 第一步:选择合适的技术栈 要生成静态页面,需要选择适合的技术栈来完成。常见的技术栈包括但不限于: 前端框架:Vue、React、AngularJS等 构建工具:Webpack、Gulp、Grunt等 静态网站生成器:Jekyll、Hugo、Hexo等 选择合适的技术栈,可以根据个人或者团队的技术熟练度、项目需求、性能…

    Java 2023年6月15日
    00
  • 一个牛人给Java初学者的建议(必看篇)

    一个牛人给Java初学者的建议(必看篇)攻略详解 建议1:学好基础知识 Java是一门面向对象的编程语言,因此学好面向对象编程的思想是Java入门的基础。学习面向对象编程,要掌握类、对象、继承、封装、多态等基本概念。 同时,Java还有很多重要的基础知识,比如数据类型、控制语句、循环结构、数组、接口、异常处理等,这些知识点也需要熟练掌握。初学者可以通过阅读教…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部