数组

数组的特点

       1.定长。 容量固定。 数组创建之后,长度不能改变

       2.存储的数据类型必须一致

       3.在空间中连续

        4.数组是引用数据类型,存在堆栈的地址引用关系

数组的语法

    创建数组的语法:

        数组类型【】 数组名  = new 数组类型【】;

        数组类型 数组名【】 = new 数组类型【】;

使用的语法:

        数组名【index】,操作数组

        index,因为一个数组存储了多个数组(也叫元素),每个元素都有一个下标,也叫索引index。

        数组的下标不能超过这个范围。否则会下标越界:java.lang.ArrayIndexOutOfBoundsException

内存分析

        内存:存储数据

            栈:存储的是基本数据数据类型的变量,以及引用数据类型的引用。

              特点: 函数中所占用的空间,执行后就会立刻销毁。

            堆:存放的是new出来的东西

                特点:执行之后,堆里面存储的内容(对象等),会被标记为垃圾,但是不会立即被销毁,而是等待系统的垃圾回收机制来自动回收(Gc)

jvm GC (Grabage collection)

数组的遍历

for each 循环 增强for循环

在jdk1.5之后的版本出现的

特定的用法:用于获取集合/数组中的元素

for(数据类型 变量名 :数组名)

{

    System.out.println(变量名);

}

工作原理:定义了一个变量 然后依次赋值给变量

注意点:for each 只能获取数组的数据 不能给数组进行赋值

for each在代码的层面 不能操作下标

数组的默认值

在没有给数组赋值的时候,依旧可以访问

整数:0

小数:0.0

字符:\u0000

布尔:false

  其他:null

创建数组的其他语法

/*

动态创建数组:先创建数组,然后再根据下标一个一个存储数据。

A:先声明,再创建(分配内存空间)

数据类型 [] 数组名;

数组名 = new 数据类型[长度];

B:声明并创建

数据类型 [] 数组名 = new 数据类型[长度];

数据类型  数组名[] = new 数据类型[长度];

//静态创建数组:声明,创建,赋值一起写完。

C:声明,创建,并赋值

数据类型[] 数组名 = {数值1,数值2,数值3,数值4.。。。};

//=左边声明数组,=右边,会先根据{}中数据的个数,然后再将{}中数据,按照顺序存储进去。

完成了几件事:

1.先声明:int[] c

2.根据{}中数组值的个数,开辟堆内存

3.将{}中的数组值,依次按照顺序存入数组中

D:声明,创建,并赋值

数据类型[] 数组名 = new 数据类型[]{数值1,数值2,数值3,数值4.。。。}

*/

数组的地址转移

Java中的数据分为两大类:

基本数据类型是在栈中操作的,传递的是值本身

引用数据类型是在在中存放引用地址,指向堆中的一个连续的空间

数组赋值是将引用地址赋值给其他变量,然后指向堆中的一个连续的空间

示例代码:

class Test4ArrayAddress

{

public static void main(String[] args)

{

/*

数组:引用类型的数据

数组名,存储是引用地址。

*/

int[] a = new int[3];

System.out.println(a.length);//3

System.out.println(a);//a数组的地址

System.out.println(a[0]);//0

a[0] = 1;

a[1] = 2;

a[2] = 3;

int[] b = {4,5,6,7};

System.out.println(b.length);//4

System.out.println(b);//b的地址

System.out.println(b[0]);//4

int[] c = a;//将a的值赋值给c,就是将a存储的数组的地址赋值给c

//a和c存储的地址相同,那么就指向了同一个数组

System.out.println(c.length);//3

System.out.println(c);//a的地址

System.out.println(c[0]);//1

c[0] = 100;

System.out.println(a[0]);

System.out.println(b[0]);

System.out.println(c[0]);

b = c;

b[1] = 200;

System.out.println(a[1]);//200

System.out.println(b[1]);//200

System.out.println(c[1]);//200

System.out.println("Hello World!");

}

}

数组作为参数

数组是引用类型,传递的是地址,就是数组作为参数也会指向这块内存。当方法结束后,数组作为参数也就销毁了。

可变参数

一个参数可以接受 1- n 个类型固定的参数,相当于一个数组

语法:数据类型 。。。 参数名,可变参数在方法中当数组使用

注意点:

1.如果参数列表中除了可变参数还有其他参数,那么可变参数需要放在参数列表的最后

2.一个方法最多只有一个可变参数

数组的排序

1.冒泡排序

for(int i = 0; i < arr.length -1; i++)

{

    for(int j = 0; j< arr.length - 1 -i; j++){

        if(arr[i] > arr[i+1])

        {

            int temp = arr[i];

            arr[i] = arr[i+1];

            arr[i+1] = temp;

        }

    }

}

2.选择排序

选择排序是用固定值依次和后面的值进行比较

第一次比较

int i = 0;

for(int j = 1;j < arr.length;j++)

{

    if(arr[i] > arr[j])

    {

        int temp = arr[i];

        arr[i] = arr[j];

        arr[j] = temp;

    }

}

每次比较规定值的下标后移一个

最终

package com.qf.array.homework;

public class HomeWork1 {

/*

* 选择排序

*/

public static void main(String[] args) {

int[] arr = {3,5,2,1,4};

for(int i = 0; i < arr.length -1; i++)

{

for(int j = i+1; j < arr.length; j++)

{

if(arr[i] > arr[j])

{

int temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

}

}

for(int e:arr)

{

System.out.print(e+" ");

}

}

}

3.jdk排序

Arrays.sort(数组名)返回值为空 参数为数组名

数组的复制

1.定义一个长度大于或者等于原数组的新数组,然后循环遍历赋值进去

2.使用java.util.Arrays.copyof(原数组,新数组长度)方法 ,返回一个新的数组

3.定义一个新的数组,长度等于或者大于原数组

然后使用System.arraycopy(原数组,起始长度,新数组,起始长度,截取数据的长度)

二维数组

二维数组就是一维数组中存储一维数组的地址

定义方法

1.int arr[][]  = new int[3][3];

2.int arr[][] = new int[3][];

3int  arr[] = {{}{}{}};

遍历

for(int i = 0; i < arr.length; i++)

{

    for(int j = 0; j < arr[i].length; j++)

    {

        System.out.println(arr[i][j]);

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容