arraylist扩容是创建新数组吗 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[] 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编程之数组扩容相关推荐
- arraylist扩容是创建新数组吗 java_Java集合干货——ArrayList源码分析
前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体实现,一些基本的都也知道,譬 ...
- arraylist扩容是创建新数组吗 java_Java 集合,你肯定也会被问到这些
文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱 作为一位小菜 "一面面试官",面试过程中,我肯定会问 Java 集合的内容,同时作为求职者,也肯定会 ...
- arraylist扩容是创建新数组吗 java_Java 基础数据结构分析
java -version java version "13.0.2" 2020-01-14 Java(TM) SE Runtime Environment (build 13.0 ...
- arraylist扩容是创建新数组吗 java_arraylist扩容机制要怎么实现?arraylist怎么扩容...
ArrayList大家都知道了吧,这是一个动态数组.以java语言来说,数组是定长的,在被创建之后就不能被加长或缩短了,因此,了解它的扩容机制对使用它尤为重要.下面,我们就一起来看看它的扩容机制是怎么 ...
- 向数组添加元素 java_java如何向数组里添加元素
向数组里添加一个元素怎么添加,这儿总结有三种方法: 1.一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度. 但有个可以改变大小的数组为ArrayList,即可以定义一个Arra ...
- python创建新进程_Python并发编程(进程的创建)
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的. 并发性:任何进程都可以同其他进程一起并发执行 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的 ...
- linux中利用脚本编写数组,shell脚本编程之数组
bash仅支持一维数组,类型声明: declare -i : 表示数值 declare -a :表示普通数组(默认,可不用声明类型) declare -A :表示关联数组(必须声明类型,bas ...
- arraylist扩容是创建新数组吗 java_Java ArrayList扩容问题实例详解
本文研究的主要是Java ArrayList扩容问题实例详解的相关内容,具体介绍如下. 首先我们需要知道ArrayList里面的实质的其实是一个Object类型的数组,ArrayList的扩容问题其实 ...
- 数组序列化 java_Java基础之数组序列化、反序列化 小发现(不知道 是不是有问题)...
结论: 数组,无论是否声明为transient,都是可以序列化.反序列化的. 测试情况如下: 1.两种类型的数组:int .String: 2 声明为transient 或者不做任何修饰:. 3. ...
最新文章
- Python-CSS整理
- python 目录遍历 目录文件列表 介绍
- ddr4单颗粒最大_Zynq UltraScale +系列之“DDR4接口设计”
- BZOJ 2301: [HAOI2011]Problem b
- struts2的处理流程
- python做自动化如何定位动态元素_python-web自动化-元素定位
- MySql-流程函数
- 应聘c语言面试试题,c语言面试最必考的十道试题,求职必看!!!
- 带宽对于并发连接的一些总结
- 菜鸟上网必备知识大全
- 软件数字签名证书选购指南
- java servlet试题_JAVA servlet 面试题
- houseprice_analysis_广州房子租售比分析(上)
- 信息熵、相对熵、交叉熵
- Python实现两个有序集合的交集和并集
- 踩在云端的温柔!这是我最近穿上就不想脱下来的鞋 | 钛空实测
- Magic Leap 价值 20 多亿美元的 AR 幻梦,现在醒了
- js 实现页面语音播报
- 4个小故事,分分钟看懂人民币汇率
- 用Mediawiki做百科网站资源大参考