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一键自动生成数据库文档

    下面我将详细讲解怎么用 Java 一键自动生成数据库文档的完整攻略,过程中将会包含两条示例。 1. 确定使用的工具 首先需要选择自动生成数据库文档的工具,推荐使用 DDLDoc 。 DDLDoc 是一个使用 Java 开发的工具,可以将数据库的表结构导出成 html 格式的文档,同时也支持 PDF 格式的导出。 2. 安装和配置DDLDoc 下载 DDLDo…

    Java 2023年5月19日
    00
  • Java基本类型与byte数组之间相互转换方法

    请看下面的讲解。 Java基本类型与byte数组之间相互转换方法 在Java中,有时候我们需要将基本类型(如int、float等)转换成byte数组,或者将byte数组转换成基本类型。本文将提供两种方法来实现这种相互转换。 1. 使用Java的ByteBuffer类 Java的ByteBuffer类可以很方便地完成基本类型与byte数组的转换。 将基本类型转…

    Java 2023年5月26日
    00
  • YII2.0框架行为(Behavior)深入详解

    下面针对”YII2.0框架行为(Behavior)深入详解”进行详细讲解,并且提供两个示例说明。 什么是行为(Behavior) 行为是 Yii 2 中一个非常重要的概念,它常常被用来实现代码复用及属性的自定义处理。通俗点来说,行为可以看作是一种类的特殊封装。在 Yii 2 中,每个行为可以封装一个函数或者一组函数。 行为的分类 可以把行为分为两种:普通行为…

    Java 2023年6月15日
    00
  • Spring Boot之FilterRegistrationBean-自定义Filter详解

    下面是对于“Spring Boot之FilterRegistrationBean-自定义Filter详解”的完整攻略。 什么是FilterRegistrationBean? FilterRegistrationBean是Spring提供的一个Bean,用于将Filter(过滤器)注册到Servlet容器中的过程中进行拦截,进而实现自定义Filter。 如何使…

    Java 2023年5月31日
    00
  • Maven优雅的添加第三方Jar包的方法

    Sure!下面是详细的 “Maven优雅的添加第三方Jar包的方法” 博客攻略。 1. 引言 在 Java 开发过程中,需要依赖大量的第三方 Jar 包。Maven 作为一款优秀的项目构建工具,可以帮助我们管理 Jar 包依赖,提升开发效率。但是,由于某些原因,一些 Jar 包并没有上传到 Maven 中央仓库中,这时我们就需要手动导入 Jar 包,并将其打…

    Java 2023年5月20日
    00
  • JAVA记住密码功能的实现代码

    下面我将为您详细讲解“JAVA记住密码功能的实现代码”的完整攻略。 什么是记住密码功能? 记住密码功能是指在用户登录过网站后,即使关闭浏览器或者退出系统之后再次打开网站或系统时,该用户的帐号及密码仍然能够自动填写在登录框中,方便用户使用。 JAVA实现记住密码功能的步骤 第一步:保存用户登录信息 当用户登录成功后,保存用户的登录信息到本地,一般采用cooki…

    Java 2023年6月15日
    00
  • json原理分析及实例介绍

    JSON原理分析及实例介绍 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可读性强,易于阅读和编写。相较于XML,它更加简洁,结构清晰,传输效率更高,被广泛应用于Web前端和后端的数据交互。 JSON数据以键值对的形式组合而成,通过逗号分隔。其中,键必须是字符串类型,而值则可以是字符串、数字、布尔…

    Java 2023年5月26日
    00
  • 亲手带你解决Debug Fastjson的安全漏洞

    下面我将为你讲解如何解决Fastjson的安全漏洞。 什么是Fastjson的漏洞? Fastjson是一款被广泛使用的Java JSON解析器和生成器。然而,在Fastjson中存在一些安全漏洞,使得攻击者可以利用它来执行远程代码、绕过安全措施、拒绝服务攻击等。为了保护我们的应用程序免受这些漏洞的影响,我们需要及时采取措施来解决这些漏洞问题。 解决Fast…

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