当前位置: 首页 > java >正文

【数据结构、java学习】数组(Array)

1,概念

  1. 数组一旦定义,其维数和维界就不再改变。
    因此除了结构的初始化和销毁之外,数组只有存取元素和修改元素值的操作。
  2. Array可以存放对象类型、基本数据类型的数据。
  3. 数组中元素在内存中按顺序线性存放,通过第一个元素就能访问随后的元素,这样的数组称之为“真数组”。

1)java中定义

//一维数组的定义:在内存中开辟一块连续的存储空间,大小是 6 * sizeof(float)= 36*4 字节
//二维数组的定义:行连续,每行对应一个一维数组,但是每一行之间不连续。
float f[][] = new float[6][6];
float []f[] = new float[6][6];
float [][]f = new float[6][6];
float [][]f = new float[6][];//赋值:计算a的首地址,计算a[1]偏移量,找到a[1]地址,写入数据2
a[1] = 2;

2)java中复制数组

当数据量很大时,复制的效率:
System.arraycopy > clone() > Arrays.copyOf> for循环

以上均为浅拷贝;要实现深拷贝,需要在 clone() 方法中手动创建并初始化所有引用类型的属性,此时要考虑避免循环引用(无限递归导致OOM)、破坏类的封装性。

浅拷贝(Shallow Clone,对应深拷贝):
引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存

1>System.arraycopy

System类源码中给出了arraycopy的方法,是native方法,也就是本地方法,肯定是最快的。

//数据量小的时候,for可能快。
public static void arraycopy(Object src,  //源数组int srcPos,  //源数组中的起始位置Object dest, //目标数组int destPos, //目标数据中的起始位置int length)  //要复制的数组元素的数量System.arraycopy(a1, 2, a2, 3, 2);

2>clone()

java.lang.Object类的clone()方法为protected类型,不可直接调用,需要先对要克隆的类进行下列操作:

  1. 被克隆的类实现Cloneable接口;
  2. 被克隆的类覆盖clone()方法,并且在该clone()方法中调用super.clone();
    //1. 被克隆的类要实现Cloneable接口class Cat implements Cloneable {private String name;private int age;public Cat(String name, int age) {this.name = name;this.age = age;}//2. 重写clone()方法protected Object clone() throws CloneNotSupportedException {return super.clone();}}
  1. 调用
            //调用clone方法Cat cat2 = (Cat) cat1.clone();

3>Arrays.copyOf()、 copyOfRange()

Arrays.copyOf有十种重载方法,复制指定的数组,返回原数组的副本。
copyOf() 方法是复制数组至指定长度的(新)数组;
copyOfRange() 方法则将指定数组的指定长度复制到一个新数组中。

//newLength大于原数组,会用desc的元素填充,默认为null
T[] copyOf(T[] original, int newLength) 
//endIndex大于原数组,会用desc的元素填充,默认为null
Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)

4>for循环

直接for循环效率最高,其次是迭代器和 ForEach操作。

3)数组排序

//asc排序
Arrays.sort(nums)
Arrays.sort(int[] a, int fromIndex, int toIndex)//用Comparator接口实现自定义排序规则
Arrays.sort(T[] a, Comparator<? Super T> c)
//举例:降序
Arrays.sort(arr, new Comparator<Integer>() {//重写compare方法,最好加注解,不加也没事public int compare(Integer a, Integer b) {//返回值>0交换return b-a;}
});

2,应用

1)哈希表

把数组的下标设为哈希表的键值(key),而把数组中每一个数字设为哈希表的值(value),有了这样的哈希表,就可以O(1)实现查找。从而快速高效的解决很多问题。

http://www.xdnf.cn/news/20263.html

相关文章:

  • 纯血鸿蒙开发入门:1.开发准备
  • 【NotePad++设置自定义宏】
  • 看显卡低负载状态分析运行情况
  • Kaggle - LLM Science Exam 大模型做科学选择题
  • 上下文工程:AI应用成功的关键架构与实践指南
  • maven编译问题
  • 【智慧城市】2025年中国地质大学(武汉)暑期实训优秀作品(3):基于Mapbox GL JS 构建的城市三维可视化系统
  • 基于单片机雏鸡家禽孵化系统/孵化环境监测设计
  • 【Go】P2 Golang 常量与变量
  • 从零构建企业级LLMOps平台:LMForge——支持多模型、可视化编排、知识库与安全审核的全栈解决方案
  • 亲历记:我如何用新系统终结了财务部的开票混乱
  • 全球汽车氮化镓技术市场规模将于2031年增长至180.5亿美元,2025-2031年复合增长率达94.3%,由Infineon和Navitas驱动
  • 中国生成式引擎优化(GEO)市场分析:领先企业格局与未来趋势分析
  • 安全沙箱配置针对海外vps容器隔离的验证方法
  • CAD:绘图功能
  • eda(电子设计自动化)行业的顶级技术机密,布局布线优化的遗传算法实现,以及国内为什么做不成商业EDA
  • RWA点亮新能源的数字未来
  • DJANGO后端服务启动报错及解决
  • 如何在没有权限的服务器上下载NCCL
  • Photoshop图层
  • 【分享】AgileTC测试用例管理平台使用分享
  • 入针点云在皮肤模型上的投影(去除肋骨)
  • HashMap多线程下的循环链表问题
  • 25高教社杯数模国赛【B题高质量成品论文+无盲点解析】第一弹
  • 单元测试:Jest 与 Electron 的结合
  • OpenCV C++ 核心:Mat 与像素操作全解析
  • CAN通信入门
  • 关于rust的所有权以及借用borrowing
  • 汽车 信息娱乐系统 概览
  • 【前端教程】JavaScript 实现图片鼠标悬停切换效果与==和=的区别