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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】Eclipse+CDT+Gcc编译选项控制

原文地址&#xff1a;http://www.oschina.net/question/4873_19441 如果我们的程序调用动态链接库&#xff0c;当在cdt中运行的时候&#xff0c;可以通过run-->enviroment-->添加LD_LIBRARY_PATH 环境变量来设置查找动态链接库文件的路径。但是在运行的时候&#xff0c;程…

apt ubuntu 指定ipv4_macOS 下使用 Docker 搭建 ubuntu 环境

学习网络开发过程中不想“污染”macOS&#xff0c;考虑到之后部署网络应用主要是与linux打交道&#xff0c;所以安装了 ubuntu 虚拟机以满足短期的知识学习需求。十里安装了 ubuntu 虚拟机&#xff0c;一般就是在 mac 中 ssh 连接 ubuntu 虚拟机在终端下进行操作学习&#xff0…

java中static关键字简介

static静态关键字&#xff1a; static关键字可以修饰成员变量和成员方法&#xff0c;被修饰的成员是属于类的&#xff0c;而不是简简单单的属于某个对象&#xff0c;也就是说可以不用通过对象调用&#xff0c;而是通过类直接调用。 类变量&#xff08;静态变量&#xff09;&a…

[WCF编程]10.操作:回调操作

一、回调操作概述 WCF支持服务将调用返回给它的客户端。在回调期间&#xff0c;许多方面都将颠倒过来&#xff1a;服务将成为客户端&#xff0c;客户端将编程服务。回调操作可以用在各种场景和应用程序中&#xff0c;但在涉及事件或者服务发生时间需要通知客户端时&#xff0c;…

float去掉小数点之后_float类型的存储方式

在c语言中float函数是单精度的。它在内存中以二进制的形式存储。分为符号位&#xff0c;阶码与尾数三部分。 符号位最为简单&#xff0c;如果你存储的是正数那么符号数就是0。如果是负数&#xff0c;则为1。下面&#xff0c;我以13.625为例说明阶码与尾数的表示方法。首先&…

idea 2020.2 如何设置classpath_开发属于自己的第一款IDEA插件!

作者&#xff1a;木杉 http://imushan.com/写Java代码的时候&#xff0c;经常会涉及到重复性的操作&#xff0c;这个时候就会想要是有这样一个插件就好了&#xff0c;如果是大家都会遇到的场景&#xff0c;IDE或许已经提供了&#xff0c;再不然也有可能有人编写了相关的插件。要…

java中Arrays类和Math类常用API简介

Arrays类&#xff1a; java.util.Arrays是一个与数组相关的工具类&#xff0c;提供了许多静态方法对数组进行操作&#xff0c;直接通过类点出来使用&#xff0c;无需创建对象。 // 1.Arrays类存在与java.util下&#xff0c;需要导包&#xff1a; import java.util.Arrays; pu…

按15分钟取数据_Python爬取猫眼电影《飞驰人生》4万多条评论并对其进行数据分析...

前言文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者&#xff1a; Yura不说数据说 &#xff0c;PYuraLPS&#xff1a;如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://note.youdao.c…

UI设计

摘要 源于ajlr项目的验收&#xff0c;过程中ui的设计被屡次提到。所以就有了这样一个思考&#xff0c;什么是ui设计&#xff1f;对于开发人员来说&#xff0c;ui设计是否很重要&#xff1f;以及如何来进行ui设计&#xff1f; ui设计&#xff1f; User Interface&#xff0c;简称…

Java中继承、this关键字、super关键字

继承: 概述&#xff1a;当多个类中存在相同属性和行为时&#xff0c;将这些相同的内容抽取到单独一个类中&#xff0c;那么多个类无需再定义这些属性和行为&#xff0c;只要继承抽离出来的这个类即可。 子类&#xff1a;当某个类继承了另一个类的时候&#xff0c;可以把这个某…

java中抽象类,abstract关键字

抽象类&#xff1a;java语法规定&#xff0c;包含抽象方法的类为抽象类。 abstract关键字&#xff1a;abstract用来定义抽象方法和抽象类&#xff0c;定义抽象方法格式为&#xff1a;abstract修饰方法&#xff0c;并去掉大括号&#xff0c;直接以封号结束&#xff1b;定义抽象…

c++获取当前时间戳_python开发:python时间模块的使用

前言&#xff1a;今天元宵节&#xff0c;祝福大家元宵节快乐。今天在元宵节给各位朋友分享一下python时间模块。我们在开发中经常会与时间打交道&#xff0c;如&#xff1a;获取事件戳&#xff0c;时间戳的格式化等&#xff0c;这里简要记录一下python操作时间的方法。ython中常…

Linux重新编译内核指南

Linux的一个重要的特点就是其源代码的公开性&#xff0c;全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中&#xff0c;由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内核则是这些特点的最直接的代表。      为什么…

python 获取向上两级路径_Python学习第171课--相对路径和绝对路径

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】这节我们补充2个概念&#xff1a;相对路径和绝对路径。●绝对路径就像一棵大树一样&#xff0c;从它的根开始&#xff0c;往上会有大的枝干&#xff0c;在大的枝干上面又会有小一点的树枝&#xff0c;小树枝上面…

Java接口、implements关键字、接口中抽象方法,默认方法,静态方法,私有方法,常量、final关键字

接口&#xff1a; 接口是Java语言中一种引用类型&#xff0c;是方法的集合&#xff0c;如果说类的内部封装了成员变量、构造方法和成员方法&#xff0c;那么 接口的内部主要就是封装了方法&#xff0c;包含抽象方法&#xff08;JDK 7及以前&#xff09;&#xff0c;默认方法和…

百度热力图颜色说明_大数据下的龙港、鳌江人口热力图

大数据下的龙港、鳌江人口热力图--趋势显示&#xff0c;人口逐步集中于区域中心地区与城市 2020-08-25 大数据(big data)&#xff0c;是指无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。大数据有五大特点&#xff0c;即大量(Volume)、高速(Velocity)…

python 显示图片matplotlib_Python OpenCV ——Matplotlib显示图片

Color image loaded by OpenCV is in BGR mode.But Matplotlib displays in RGB mode.So color images will not be displayed correctly in Matplotlib if image is read with OpenCV.Please see the exercises for more details.(引自文档)import numpy as npimport cv2from …

什么是Spring?Spring是什么?

Spring概述&#xff1a; Spring是一个开源框架&#xff0c;是为了解决企业应用程序开发复杂性而开发的。 从简单性、可測试性和松耦合的角度而言&#xff0c;不论什么java应用都能够从Spring中受益。 简而言之&#xff0c;Spring就是一个轻量级的控制反转&#xff08;IOC&#…

java中多态,instanceof关键字

多态&#xff1a; 面向对象三大特征&#xff1a;继承、封装、多态&#xff0c;其中多态指的是有多种形态&#xff0c;可以使代码更加灵活&#xff0c;而非状态。继承或接口是多态的前提&#xff0c;比如一个对象狗是宠物类的实现类对象&#xff0c;而宠物类又继承了动物类&…