一、背景

数组在实际的系统开发中用的越来越少了,我们只有在阅读某些开源项目时才会看到数组的使用。在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[] 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 converData(int capacity){

List students = new ArrayList();

for(int i=0;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倍。有兴趣的朋友可以自己证明一下这个结论。

arraylist扩容是创建新数组吗 java_Java编程之数组扩容相关推荐

  1. arraylist扩容是创建新数组吗 java_Java集合干货——ArrayList源码分析

    前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体实现,一些基本的都也知道,譬 ...

  2. arraylist扩容是创建新数组吗 java_Java 集合,你肯定也会被问到这些

    文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱 作为一位小菜 "一面面试官",面试过程中,我肯定会问 Java 集合的内容,同时作为求职者,也肯定会 ...

  3. arraylist扩容是创建新数组吗 java_Java 基础数据结构分析

    java -version java version "13.0.2" 2020-01-14 Java(TM) SE Runtime Environment (build 13.0 ...

  4. arraylist扩容是创建新数组吗 java_arraylist扩容机制要怎么实现?arraylist怎么扩容...

    ArrayList大家都知道了吧,这是一个动态数组.以java语言来说,数组是定长的,在被创建之后就不能被加长或缩短了,因此,了解它的扩容机制对使用它尤为重要.下面,我们就一起来看看它的扩容机制是怎么 ...

  5. 向数组添加元素 java_java如何向数组里添加元素

    向数组里添加一个元素怎么添加,这儿总结有三种方法: 1.一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度. 但有个可以改变大小的数组为ArrayList,即可以定义一个Arra ...

  6. python创建新进程_Python并发编程(进程的创建)

    动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的. 并发性:任何进程都可以同其他进程一起并发执行 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的 ...

  7. linux中利用脚本编写数组,shell脚本编程之数组

    bash仅支持一维数组,类型声明: declare -i    : 表示数值 declare -a  :表示普通数组(默认,可不用声明类型) declare -A :表示关联数组(必须声明类型,bas ...

  8. arraylist扩容是创建新数组吗 java_Java ArrayList扩容问题实例详解

    本文研究的主要是Java ArrayList扩容问题实例详解的相关内容,具体介绍如下. 首先我们需要知道ArrayList里面的实质的其实是一个Object类型的数组,ArrayList的扩容问题其实 ...

  9. 数组序列化 java_Java基础之数组序列化、反序列化 小发现(不知道 是不是有问题)...

    结论:  数组,无论是否声明为transient,都是可以序列化.反序列化的. 测试情况如下: 1.两种类型的数组:int .String: 2 声明为transient  或者不做任何修饰:. 3. ...

最新文章

  1. Python-CSS整理
  2. python 目录遍历 目录文件列表 介绍
  3. ddr4单颗粒最大_Zynq UltraScale +系列之“DDR4接口设计”
  4. BZOJ 2301: [HAOI2011]Problem b
  5. struts2的处理流程
  6. python做自动化如何定位动态元素_python-web自动化-元素定位
  7. MySql-流程函数
  8. 应聘c语言面试试题,c语言面试最必考的十道试题,求职必看!!!
  9. 带宽对于并发连接的一些总结
  10. 菜鸟上网必备知识大全
  11. 软件数字签名证书选购指南
  12. java servlet试题_JAVA servlet 面试题
  13. houseprice_analysis_广州房子租售比分析(上)
  14. 信息熵、相对熵、交叉熵
  15. Python实现两个有序集合的交集和并集
  16. 踩在云端的温柔!这是我最近穿上就不想脱下来的鞋 | 钛空实测
  17. Magic Leap 价值 20 多亿美元的 AR 幻梦,现在醒了
  18. js 实现页面语音播报
  19. 4个小故事,分分钟看懂人民币汇率
  20. 用Mediawiki做百科网站资源大参考

热门文章

  1. think php 子查询,使用thinkPHP怎么实现一个子查询语句
  2. Python 小白从零开始 PyQt5 项目实战(5)布局管理
  3. python导入不在同一路径的函数_Python小课堂|模块
  4. java接口文档生成工具_【分享】接口文档生成工具apipost
  5. python求线段长度_python微元法计算函数曲线长度的方法
  6. ssd训练自己数据集
  7. 【Python】对象、类、元类
  8. jquery获得指定元素坐标的方法
  9. 辅助排序和Mapreduce整体流程
  10. JAR包、WAR包及EAR包的区别