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

1,概念

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

1)java中定义

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方法,也就是本地方法,肯定是最快的。

java 复制代码
//数据量小的时候,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();
java 复制代码
    //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. 调用
java 复制代码
            //调用clone方法
            Cat cat2 = (Cat) cat1.clone();

3>Arrays.copyOf()、 copyOfRange()

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

java 复制代码
//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)数组排序

java 复制代码
//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)实现查找。从而快速高效的解决很多问题。

相关推荐
古译汉书11 小时前
嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
数据结构·笔记·stm32·单片机·嵌入式硬件·个人开发
max50060012 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
callJJ12 小时前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di
wangjialelele12 小时前
Linux中的线程
java·linux·jvm·c++
谷咕咕12 小时前
windows下python3,LLaMA-Factory部署以及微调大模型,ollama运行对话,开放api,java,springboot项目调用
java·windows·语言模型·llama
没有bug.的程序员12 小时前
MVCC(多版本并发控制):InnoDB 高并发的核心技术
java·大数据·数据库·mysql·mvcc
在下村刘湘13 小时前
maven pom文件中<dependencyManagement><dependencies><dependency> 三者的区别
java·maven
橘颂TA13 小时前
【数据结构】解锁数据结构:通往高效编程的密钥
数据结构
王哥儿聊AI13 小时前
Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量
人工智能·算法·安全·机器学习·音视频·软件工程
不务专业的程序员--阿飞14 小时前
JVM无法分配内存
java·jvm·spring boot