`

Java编程之数组扩容

    博客分类:
  • Java
阅读更多

一、背景

       数组在实际的系统开发中用的越来越少了,我们只有在阅读某些开源项目时才会看到数组的使用。在Java中,数组与List、Set、Map等集合类相比,后者使用起来方便,但是在基本数据类型处理方面,数组还是占优势的,而且集合类的底层也都是通过数组实现的。

       我们大家都知道,在Java中数组是定长的,一旦初始化以后,就不可以改变其长度,而这在实际应用中是不方便的。举例来说,如果要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时有入学、退学、转学的学生),所以需要一个足够大的数组来容纳所有的学生(当然,在实际应用场景中,你可以用List或者其他的集合类,本文在此只讨论数据)。那么,究竟需要多大才算足够大呢?事实上,“足够大”只是一个相对的概念,并没有确定的值。所以,当“足够大”变成“足够小”的时候,就会超出数组的最大容量,如何解决呢?那就给数组扩容吧,也许看到此处的朋友会问,你这不是和前面所说的矛盾么?请不要纠结,我这里所说的给数组扩容,只是“婉转”地给数组扩容。那么,怎么个“婉转”扩容呢?还是从例子说起。

 

二、实例展示

       假设一个班级最初规定只能容纳60个学生,但是由于有几个转学的学生突然插进来,整个班级的学生人数达到了80人,这种情况很正常呢,想想我们高中所在的那些强化班就知道是怎么回事了。

       第一,先定义一个学生的属性类:Student

public class Student {
        /**
          * 学生编号
          */
        private long studentId; 

       /**
         * 学生姓名
         */
        private String name;
   
        /**
          * 学生年龄
          */
        private int age;
   
         /**
           * 学生性别:0-男,1-女
           */
        private int gender;
   
         /**
           * 学生所在班级
           */
        private String ownerClass;

        public long getStudentId() {
		return studentId;
	}
	
	public void setStudentId(long studentId) {
		this.studentId = studentId;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	public int getGender() {
		return gender;
	}
	
	public void setGender(int gender) {
		this.gender = gender;
	}
	
	public String getOwnerClass() {
		return ownerClass;
	}
	
	public void setOwnerClass(String ownerClass) {
		this.ownerClass = ownerClass;
	} 
}

         第二、编写给数组扩容的工具类:ArrayExtendCapacityUtil

public class ArrayExtendCapacityUtil {
    /**
     * 将数组进行扩容
     * 
     * @param datas
     * @param newLen
     * @return
     */
	public static <T> T[] extendCapacity(T[] datas, int newLen){
	   //负值校验
	   newLen = newLen < 0 ? 0 : newLen;
	   
	   //生成一个新的数组,并copy原来的值
	   return Arrays.copyOf(datas, newLen);
   }
}

         第三、编写测试类:ArrayExtendCapacityMain

import java.util.ArrayList;
import java.util.List;

public class ArrayExtendCapacityMain {
   public static void main(String args[]){
	   //一个班规定60个学生
	   Student[] num = new Student[60];
	   System.out.println("初始化:" + num.length);
	   System.out.println("最后一个学生的编号:" + converData(num.length).get(num.length-1).getStudentId());
	   
	   //增加20个学生
	   num = ArrayExtendCapacityUtil.extendCapacity(num, 80);
	   System.out.println("扩容后:" + num.length);
	   System.out.println("扩容后最后一个学生的编号:" + converData(num.length).get(num.length-1).getStudentId());
   }
   
   private static List<Student> converData(int capacity){
	   List<Student> students = new ArrayList<Student>();
	   for(int i=0;i<capacity;i++){
		   Student student = new Student();
		   student.setStudentId(i);
		   student.setName(i+"-King");
		   student.setAge(i+10);
		   student.setGender(i % (i+10) == 0 ? 0 : 1);
		   student.setOwnerClass(i + "-class");	   
		   students.add(student);
	   }	   
	   return students;
   }
}

 

三、测试结果

初始化:60

最后一个学生的编号:59

扩容后:80

扩容后最后一个学生的编号:79

 

四、测试结果分析

       本文实例中采用的是Arrays数组工具类的copyOf方法,产生了一个newLen长度的新数组,并把原来的值拷贝进去,然后就可以对超长的元素进行赋值。

       通过这样的方式,曲折地解决了数组的变长问题。其实,集合的长度自动维护功能的原理与此类似,在实际开发中,如果确实需要变长的数据集,数组也是在考虑范围之内的,不能因为数组是固定长度就将其否定。在这里,我可以直接借用一个结论:对基本数据进行求和计算时,数组的效率是集合的10倍。有兴趣的朋友可以自己证明一下这个结论。

分享到:
评论

相关推荐

    Java 实例 - 数组扩容源代码-详细设计教程.zip

    然而,当初始定义的数组容量不足以容纳更多的元素时,就需要进行数组扩容。这个过程涉及到创建一个新的、更大的数组,并将旧数组中的元素复制到新数组中。本教程将深入探讨Java中数组扩容的详细设计和实现。 首先,...

    Java数组扩容实现方法解析

    数组扩容是Java编程中非常重要的一部分,正确地扩容数组可以提高程序的性能和效率。今天,我们将详细介绍Java数组扩容的实现方法,并提供实践示例代码供大家参考学习。 数组扩容的必要性 在Java编程中,数组是最...

    数组的扩容和链表结构.zip

    本压缩包文件"数组的扩容和链表结构.zip"包含了关于Java数组扩容和链表结构存储的相关知识点,我们将详细探讨这两个主题。 首先,我们来看Java数组。数组是一种线性数据结构,它在内存中连续存储相同类型的数据元素...

    用Java动态数组扩充实现线性表

    在提供的代码文件中,`VariableLengthArrayList.java`可能是实现动态数组的类,它可能包含上述的初始化、扩容、插入和删除等方法。`ListInterface.java`可能定义了一个接口,描述了线性表应具备的基本操作,如`add()...

    11查找数组最小值,并将数组扩容成新数组.docx

    ### Java编程经典案例分析:“查找数组最小值,并将数组扩容成新数组” #### 背景与目标 在本案例中,我们通过一个具体的Java程序来实现以下功能: 1. **随机生成一个包含10个元素(每个元素的取值范围为0到100...

    Java数组的扩容代码示例

    Java数组的扩容是Java编程中的一种常见操作,用于在数组中插入新的元素时扩展数组的长度。在Java中,数组是一种固定长度的数据结构,无法动态地增加或减少其长度,而扩容操作正是解决这个问题的方法。本文将介绍Java...

    Java二维数组实现简单Map

    在Java编程语言中,二维数组可以被用来模拟简单的Map数据结构。Map是一种键值对的集合,其中每个键(Key)都是唯一的,并且与一个值(Value)相关联。尽管Java提供了内置的Map接口(如HashMap、TreeMap等),但有时...

    java 动态的数组链表

    在Java编程语言中,动态数组链表是一种常见的数据结构,它结合了数组和链表的特点,既能快速访问数组中的元素,又能方便地进行插入和删除操作。本文将深入探讨Java中实现动态数组链表的关键概念、操作以及其实现方式...

    java 动态数组的体现

    在Java编程语言中,动态数组是一种能够自动调整其大小的数组,它允许我们在程序运行时增加或减少数组容量。这种特性使得动态数组成为处理不确定数量数据的高效工具。本篇文章将深入探讨Java中的动态数组实现,主要...

    java 数组的合并

    Java的ArrayList类提供了便利的数组操作,包括动态扩容和数组合并。我们可以在ArrayList中添加数组元素,然后使用toArray()方法转换回数组。 ```java int[] array1 = {1, 2, 3}; int[] array2 = {4, 5, 6}; ...

    java数组_java_java数组_

    Java数组是Java编程语言中的基本数据结构之一,它允许我们存储多个同类型的元素在一个单一的变量中。数组的使用在程序设计中至关重要,因为它提供了一种高效、有序的方式来管理和访问数据。下面将深入探讨Java数组的...

    同步java之数组与队列

    在Java编程语言中,数组和队列是两种基础且重要的数据结构。它们在处理数据时起着关键作用,尤其在实现高效算法和并发操作时。本文将深入探讨这两个概念,并结合给定的`Array.java`文件,分析其可能包含的Java数组和...

    java实例-数组(学习资料)

    除此之外,我们还可以看到其他与数组相关的操作,如获取数组长度(通过`array.length`),数组反转,数组输出,获取数组的最大值和最小值,数组合并,数组填充,数组扩容,删除数组元素,数组差集,数组交集,以及在...

    //自编的在程序中自动扩展数组的大小

    扩容的策略是创建一个新的、更大的数组`pLagerArray`,容量为原数组的大小加上`num`,然后将原数组的所有元素复制到新数组中。使用`delete [] pArray`释放旧数组的内存,并用`pArray = pLagerArray`更新指向新数组的...

    用数组实现的优先队列(JAVA)

    - 当数组容量不足时,如何动态扩容? - 如何实现一个最大堆,其中队首元素具有最高优先级? - 如何实现一个可调整优先级的优先队列? 总之,`PriorityQ.java`文件可能是一个简单的数组实现优先队列的示例,通过...

    java电话本数组版本

    - **动态扩容**:如果预设的数组大小不足以容纳所有联系人,可以考虑使用ArrayList代替,它能自动扩容。 - **文件操作**:为了持久化存储,可以将联系人信息写入文件,如CSV或JSON格式,便于读取和备份。 - **...

    Java数组讲解

    #### 1.2 数组扩容 - **扩容必要性**:定义数组后,其长度固定不变。如果需要增加更多元素,则需要进行扩容。 ```java int[] oldArray = {1, 2, 3}; int[] newArray = new int[oldArray.length * 2]; // 扩容为...

    kayer.rar_java 数组链接

    标题中的“kayer.rar_java 数组链接”表明这是一个关于Java编程中数组操作的教程或代码示例,可能涉及数组的连接或串联操作。在Java中,数组是存储相同类型元素的固定大小的线性集合,而“数组链接”可能是指将多个...

    用数组实现的循环队列(java)

    此外,循环队列的效率较高,因为其避免了数组扩容和缩小带来的额外开销。 通过学习这个`QueueArray`类,我们可以了解到Java中如何使用数组高效地实现循环队列,并掌握其核心操作。这个简单的数据结构在实际开发中...

    java代码-Java一维数组练习

    Java一维数组是Java编程语言中的基础数据结构之一,它是一个有序的数据集合,其中的元素类型相同,可以存储在连续的内存位置上。本练习旨在深入理解和熟练掌握Java一维数组的创建、初始化、访问以及操作。下面我们将...

Global site tag (gtag.js) - Google Analytics