javaSE---数组

目录

数组定义

数组的存储

JVM的内存划分

 数组存储

 数组的基本操作

数组遍历

数组转化为字符串

 数组拷贝

 常见错误

 空指针异常

数组下标越界

 数组传参

1.数组传参

 2.整数交换

3.数组作为函数返回值

 模拟实现Arrays.toString函数

二维数组

二维数组的存储

 打印二维数组

java中数组和c的差异

1.自动补0的问题

 2.可以省略行列不同

3.不规则的二维数组


数组定义

数组定义的三种格式

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

数组类型[] 数组名=new 数组类型 []{数组元素}

数组类型[] 数组名={数组元素}

 关键字new:用来创建对象,给对象在内存中申请空间

 watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16


    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4};
        int[] array = new int[3];
        int[] str = new int[]{1, 2, 3, 4};
    }

 arr数组元素被初始化为1,2,3,4

array数组中3个元素全部自动默认初始化为0

str数组中的元素被初始化为1,2,3,4

 watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_16,color_FFFFFF,t_70,g_se,x_16

数组的存储

JVM的内存划分

2a005407eefdcd49918253cc9be3d721.png

 java虚拟机栈---类似于我们c语言的栈,可以存放局部变量

本地方法栈---运行c/c++代码,jvm本身即是用c/c+写出来的

方法区---可以放静态变量

堆---一般放对象

程序计数器---存放下一条指令

 数组存储

以int[] arr = {1, 2, 3, 4};为例,这个语句可以划分为两部分 

 int[] arr;

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

int []arr;声明了一个变量arr,arr类型是int []。arr是一个局部变量,存储在栈中。

arr=new int[] {1, 2, 3, 4};new int[] {1,2,3,4}创建了一个数组,并将元素初始化,将数组首元素的地址赋给了变量arr,程序运行期间,可以通过arr来引用数组。{1,2,3,4}存储在堆中

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 数组的基本操作

数组遍历

java中通过”数组名.length"就可以获取数组长度

通过数组下标来访问数组元素,下标从0开始。

 public static void main(String[] args) {
        int []arr=new int []{1,2,3,4};
        System.out.println(arr.length);
        for (int i = 0; i < arr.length ; i++) {
            System.out.print(arr[i]+" ");
        }
    }

 for each循环

Java支持一个简便的for循环,称之为for-each循环,不使用下标变量就可以顺序的遍历整个数组。

语法:for(元素类型 元素 :数组名){

语句体;

 元素类型要和数组元素类型相同

public static void main(String[] args) {
        int []arr=new int []{1,2,3,4};
        System.out.println(arr.length);
        for(int x:arr) {
            System.out.print(x+" ");
        }

数组转化为字符串

借用Array.toString

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

包: import java.util.Arrays;

public static void main(String[] args) {
        int[] arr = new int[]{1, 2, 3, 4};
        System.out.println(Arrays.toString(arr));
    }

 数组拷贝

1.for循环遍历拷贝

public static int [] Mycopy(int []arr){
        int []copy=new int[arr.length];
        for (int i = 0; i <arr.length ; i++) {
            copy[i]=arr[i];
        }
        return copy;
    }
    public static void main(String[] args) {
        int []arr={1,2,3,4};
        int []copy=Mycopy(arr);
        System.out.println(Arrays.toString(copy));
    }

2.

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

public static void main(String[] args) {
        int []arr={1,2,3,4};
        int []copy=Arrays.copyOf(arr,arr.length);//以指定的长度复制arr数组
        System.out.println(Arrays.toString(copy));
    }

 鼠标选中copyof,鼠标右键打开,找到Go To,选中Declartion or Usages,或者 鼠标选中copyof,按ctrl+B,可以打开jdk源码watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 这就是Arrays.copy的源码watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 3.指定范围的复制watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 from---开始复制,to---终止复制   [左闭区间,右开区间)

public static void main(String[] args) {
        int []arr={1,2,3,4};
        int []copy=Arrays.copyOfRange(arr,0,2);//下标[0,2),元素1,2
        System.out.println(Arrays.toString(copy));
    }

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

4.我们发现jdk的以上两个源码中,都出现出现了watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16 这也是一个拷贝方法

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 public static void main(String[] args) {
        int []arr={1,2,3,4};
        int []copy=new int[arr.length];
       System.arraycopy(arr,1,copy,2,2);
       //从arr下标是1的元素开始,拷贝2个元素到copy数组,从copy数组下标为2的地方开始赋值
        //0 0 2 3
        System.out.println(Arrays.toString(copy));
    }

 5. 数组名.clone()

 public static void main(String[] args) {
        int []arr={1,2,3,4};
        int []copy=arr.clone();
        System.out.println(Arrays.toString(copy));
    }

 常见错误

 空指针异常

通过变量来引用一个数组,如果说 arr=null,那么意味着arr不指向任何一个数组,此时通过该变量访问数组的任何信息都会出现错误---空指针异常

public static void main(String[] args) {
    int []arr=null;
        System.out.println(arr.length);
    }

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

数组下标越界

   public static void main(String[] args) {
        int []arr={1,2,3};
        for (int j = 0; j <= arr.length; j++) {
            System.out.println(arr[j]);
        }
    }

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 数组传参

1.数组传参

形参变量得到实参变量的值,也即是数组的首元素地址,如果形参变量的值不更改,那么可以通过形参改变数组元素。

   public static void fun(int []arr) {
       arr=new int[]{3,2};
    }
    public static void Fun(int []arr) {
        arr[0]=4;
    }
    public static void main(String[] args) {
        int []arr={1,2,3,4};
        System.out.print(Arrays.toString(arr));
        System.out.println();
        fun(arr);
        System.out.print(Arrays.toString(arr));
        System.out.println();
        int []brr={1,2,3,4};
        System.out.print(Arrays.toString(brr));
        System.out.println();
        Fun(brr);
        System.out.print(Arrays.toString(brr));
    }

 结果如下:

ac343cf4e4f14ee5afe186128bf1a0c8.png

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 2.整数交换

结果:a=10,b=20;

public static void Swap(int a,int b){
        int tmp=a;
        a=b;
        b=tmp;
    }
    public static void main(String[] args) {
        int a=10,b=20;
        System.out.println("交换前a="+a+"b= "+b);
        Swap(a,b);
        System.out.println("交换后a="+a+"b= "+b);
    }

使用引用类型更改

结果:a=20,b=10;

public static void Swap(int []str){
        int tmp=str[0];
      str[0]=str[1];
        str[1]=tmp;
    }
    public static void main(String[] args) {
        int a=10,b=20;
        int []str={a,b};
        System.out.println("交换前a="+str[0]+"b= "+str[1]);
        Swap(str);
        System.out.println("交换后a="+str[0]+"b= "+str[1]);
    }

3.数组作为函数返回值

将数组元素扩大二倍存放到一个新数组里面,且不改变原数组的元素值

    public static int [] Double(int []arr) {
        int[] str = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            str[i] = arr[i] * 2;
        }
        return str;
    }
    public static void main(String[] args) {

        int []arr={1,2,3,4};
       int []str= Double(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(str[i]+" ");
        }
    }

 模拟实现Arrays.toString函数

利用字符串的“+”

public static String Mytostring (int []arr) {
           if(arr==null)
            return null;
        String str = "[";
        for (int i = 0; i < arr.length; i++) {
            str += arr[i];
            if (i < arr.length - 1)
                str += ",";
        }
        str+="]";
        return str;
    }
    public static void main(String[] args) {
        int []arr={1,2,3,4,9};
        String str=Mytostring(arr);
        System.out.println(str);
    }

二维数组

二维数组的存储

c语言中,二维数组可以使用按行存储或者按列存储(大多按行存储)

int arr[2][3]={1,2,3,5,6,7}

在c语言中如下存储,arr[0],arr[1]存放的将会分别是数组{1,2,3},数组{5,6,7}的地址

1

2

3

5

6

7

在java中,arr[0],arr[1]存放的将会分别是数组{1,2,3},数组{5,6,7}的地址

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 所以说通过arr[0]可以引用{1,2,3}这个数组, 通过arr[1]可以引用{5,6,7}这个数组

 打印二维数组

  public static void main(String[] args) {
        int [][]array={{1,2,3},{4,5,6}};
       // System.out.println(array.length);//2 行 array[0],array[1]两个元素
       // System.out.println(array[0].length);//3 列 array[0]数组存放{1,2,3}
        for (int i = 0; i <array.length ; i++) {
            for (int j = 0; j < array[0].length; j++) {
                System.out.print(array[i][j]+" ");
            }
            System.out.println();
        }
    }
public static void main(String[] args) {
        int [][]array={{1,2,3},{4,5,6}};
        for (int []arr:array
             ) {
            for (int x:arr
                 ) {
                System.out.print(x+" ");
            }
            System.out.println();
        }
    }

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 使用方法

  public static void main(String[] args) {
        int [][]arr={{1,2,3},{5,6,7}};
        System.out.println(Arrays.deepToString(arr));
    }

java中数组和c的差异

1.自动补0的问题

 int [][]array={{1,2},{5,6,7}};
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_16,color_FFFFFF,t_70,g_se,x_16

 不会自动补0

而c语言中

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

直接报错误,arr必须至少有列长度

更改之后

#include<stdio.h>
int main()
{
	int arr[][3] = { {1,2},{4,5,6} };
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
			printf("%d ", arr[i][j]);
	}
	return 0;
}

 79244f41dd634b948cc74bc029851814.png

 自动补0

 2.可以省略行列不同

java中只可以省略列,不可以省略行

c语言中只可以省略行,不可以省略列

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 java先对二维数组分配空间,也就是先要分配arr[0],arr[1]的空间,然后才对arr[0],arr[1]这两个一维数组分配空间,所以要知道行

 在c语言中,通过直接赋值的方式传入元素,再加上c语言自动补0,通过列可以计算出行,如果只给行无法计算出列数

3.不规则的二维数组

 public static void main(String[] args) {
        int[][] array = new int[2][];
        array[0] = new int[]{1, 2};
        array[1] = new int[3];
        array[1][0] = 4;
        array[1][1] = 5;
        array[1][2] = 6;

        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
    }

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdHdvIOWAqQ==,size_12,color_FFFFFF,t_70,g_se,x_16

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值