• 程序=算法+数据结构
  • 数组是最基本的一种数据结构,所谓数据结构就是按照特定的某种结构来保存数据。

1.定义基本类型数组

  • 数据类型[] 数组名 = new 数据类型[数组长度];
  • int[] arr = new int[10];或者 int arr[] = new int[10]
  • int[]:数组中的每一个元素都是int类型
  • arr : 数组类型的变量
  • 10:数组中元素的个数,即数组的长度。
  • 声明数组时不规定数组长度,执行new语句才使得数组分配到指定空间大小
  • 通过数组的length属性可以获得数组的长度
int[] arr = new int[]{1,2,3,4};
int len = arr.length;//len为数组长度

2.数组的初始化

  • 如果数组类型为基本类型,其元素初始值:byte,short,char,int,long为0;float,double为0.0;boolean为false
  • 如果数组类型为引用类型,其元素初始值为null
public class Person {
    private int age;
    private String name;
    
    public void fun(){
        Person[] p = new Person[2];
        //p[0],p[1]默认为null
    }
}
  • 可以在数组声明的同时对元素初始化:(基本类型)int[] arr = {1,2,3,4};元素的个数即为数组的长度。
  • (引用类型)Person[] p = {new Person(),new Person()};
  • int[] arr = {1,2,3,4};此种写法只能用于声明时初始化,不能用于赋值。
int[] arr;
arr = {1,2,3,4};//这样的写法会报编译错误

//正确写法
int[] arr;
arr = new int[]{1,2,3,4};//[]中不能写长度,元素个数就是数组长度

3.数组的复制

  • System.arraycopy()方法用于数组的复制
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
    src         -源数组
    srcPos      -源数组中的起始位置
    dest        -目标数组
    destPos     -目标数组中的起始位置
    length      -要复制的数组元素的数量
  • Arrays.copyOf()用于方法的复制,获得的新数组是源数组的副本。

类型[] newArray = Arrays.copyOf(类型[] original,int newLength);
-- newLength小于源数组,则进行截取
-- newLength大于源数组,则用0或null进行补充

int[] a = {1,2,3,4};
//复制a数组中的元素,新数组长度为5,最后一位补0
int[] b =Arrays.copyOf(a,5);// b的元素为 {1,2,3,4,0}
  • Arrays.copyOf()可以对数组进行扩容。数组创建后,长度就固定了。数组扩容是创建一个更大长度的数组,把原来数组的元素复制到新数组中
int[] a = {1,2,3,4};
a = Arrays.copyOf(a,a.length+1);//创建一个长度为5的新数组赋值给a

4.数组内存结构
268495275-5d4cc4871119d_articlex.jfif

  • 数组变量 arr指向数组第一个元素的地址。因为地址是连续的,所以通过下标可以遍历获取数组中所有元素
  • 这里涉及到引用传递和值传递。
普通变量的赋值,只是将内存空间中的值赋值给另一个变量,这就是值传递
如:int a = 10;
    int b = a; //b的值为10
    b = 20;//当b改变的时候,a不会变,因为它们属于两个存储空间

111.png

引用类型变量赋值时为引用传递,实际传递的是:值所属空间的地址
int[] a = new int[]{1,2,3,4};
int[] b = a;
b[0] = 10;
System.out.println(a[0]);//值为10
因为a赋值给b,是将a中保存的地址复制了一份给了b,a和b指向了同一个内存空间,
a和b任意一个发生改变,两个数组中相同位置的值会同时改变。

222.png


forest
0 声望1 粉丝