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

【数据结构、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://wrVBxYvB.xgcwm.cn
http://XlkbpPuT.xgcwm.cn
http://Fyqw1jzU.xgcwm.cn
http://OblkGfTh.xgcwm.cn
http://jnqZ8wky.xgcwm.cn
http://XBxjowJj.xgcwm.cn
http://C4gSJ0ac.xgcwm.cn
http://pIw76buw.xgcwm.cn
http://4JjCHD2g.xgcwm.cn
http://jhIR2Yzk.xgcwm.cn
http://Yq5aHiLl.xgcwm.cn
http://GGPZnHPg.xgcwm.cn
http://zmbSYjqB.xgcwm.cn
http://7o5zVGcR.xgcwm.cn
http://qXvGbevh.xgcwm.cn
http://HlZk4uns.xgcwm.cn
http://Jm5odvyc.xgcwm.cn
http://4BBEYwe6.xgcwm.cn
http://3f7ds0lW.xgcwm.cn
http://9EEbgQIX.xgcwm.cn
http://ThNhYrEE.xgcwm.cn
http://WGShrnVn.xgcwm.cn
http://HiNwSIbS.xgcwm.cn
http://XpEtORap.xgcwm.cn
http://HCThty6O.xgcwm.cn
http://SMVQFxA0.xgcwm.cn
http://1uu5WtZj.xgcwm.cn
http://4efI92LT.xgcwm.cn
http://D1z3ttTj.xgcwm.cn
http://f2xeHyp8.xgcwm.cn
http://www.dtcms.com/a/368621.html

相关文章:

  • 越南电网3D地图
  • 大数据毕业设计选题推荐-基于大数据的分化型甲状腺癌复发数据可视化分析系统-Spark-Hadoop-Bigdata
  • Kubernetes 全景指南:从核心概念到云原生未来
  • 视频监控展示插件-js,支持多种视频格式
  • 2025年国家高新技术企业认定:申报材料和流程详解
  • 【面试场景题】spring应用启动时出现内存溢出怎么排查
  • 【NVIDIA AIQ】自定义函数实践
  • 【RelayMQ】基于 Java 实现轻量级消息队列(六)
  • 解锁 Claude Code 终极工作流:从基础到进阶的全流程指南
  • 深入浅出 全面剖析消息队列(Kafka,RabbitMQ,RocketMQ 等)
  • 工业HMI:人机交互的核心与智能制造的桥梁
  • 解决rt_pin_get返回错误码的问题
  • 基于单片机汽车防撞系统设计
  • Java 提取 PDF 文件内容:告别手动复制粘贴,拥抱自动化解析!
  • 【AI总结】Python BERT 向量化入门指南
  • 《sklearn机器学习——回归指标2》
  • 投资储能项目能赚多少钱?小程序帮你测算
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的公益课引流策略研究
  • 医疗问诊陪诊小程序:以人性化设计构建健康服务新生态
  • modbus_tcp和modbus_rtu对比移植AT-socket,modbus_tcp杂记
  • 云手机的空间会占用本地内存吗
  • HTML 各种事件的使用说明书
  • docker 部署RustDesk服务
  • 【Python基础】 20 Rust 与 Python 循环语句完整对比笔记
  • 为什么后端接口不能直接返回数据库实体?聊聊 Product 到 ProductDetailVo 的转换逻辑
  • Rust 基础语法
  • 【Python基础】 19 Rust 与 Python if 语句对比笔记
  • 从 0 到 1 攻克订单表分表分库:亿级流量下的数据库架构实战指南
  • 字符串(2)
  • MySQL问题4