【数据结构、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)实现查找。从而快速高效的解决很多问题。

相关推荐
寒山李白21 小时前
关于Java项目构建/配置工具方式(Gradle-Groovy、Gradle-Kotlin、Maven)的区别于选择
java·kotlin·gradle·maven
mit6.82421 小时前
前后缀分解
算法
独自破碎E1 天前
判断链表是否为回文
数据结构·链表
你好,我叫C小白1 天前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
无妄无望1 天前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
MC丶科1 天前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
千码君20161 天前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
夜白宋1 天前
【word多文档docx合并】
java·word
@yanyu6661 天前
idea中配置tomcat
java·mysql·tomcat
2501_916766541 天前
【项目部署】JavaWeb、MavenJavaWeb项目部署至 Tomcat 的实现方式
java·tomcat