数组的定义和使用

一.数组的基本概念

什么是数组?

数组:可以看成是相同类型元素的一个集合。在内存中是一段连续空间。比如现实中的车库

1.数组中存放的元素类型相同

2.数组的空间是连在一起的

3.每个空间有自己的编号,起始位置的编号为0,即数组的下标 

二.数组的创建

T[]数组名 = new T[N];

T:表示数组中存放元素的类型

T[]:表示数组的类型

N:表示数组的长度

int[] array1 = new int[10];  //创建一个可以容纳10个int类型元素的数组
double[] array2 = new double[5];  //创建一个可以容纳5个double类型元素的数组
String[] array3 = new double[3];  //创建 一个可以容纳3个字符串元素的数组

三.数组的初始化

数组的初始化主要分为动态初始化以及静态初始化。

1.动态初始化:在创建数组的时候,直接指定数组中元素的个数

int[] array = new int[10];  //此时数组里面是十个0

2.静态初始化:在创建数组时不直接指定元素个数,而直接将具体的数据内容进行指定

编译器会根据你数据内容自动定义大小

T[] array = {data1 , data2 , data3 , .... , datan}
String[] array2 = new String[]{"hell" , "Java"};

注意:

静态初始化虽然没指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。

静态初始化时,{}中数据类型必须和[]前数据类型一致。

静态初始化可以简写,省去后面的new T[].

数组也可以按照如下C语言个数创建,但不推荐

动态和静态初始化也可以分为两步,但是省略格式不可以

int[] array1;
array1 = new int[10];

int array2;
array2 = new int[]{10 , 20 , 30}

//省略格式不可以拆分,否则编译失败
//int[] array3;
//array3 = {1 , 2 , 3};  失败

如果没对数组进行初始化,数组中元素有其默认值

如果数组中存储元素类型基类类型,默认值        为基类类型对应的默认值,比如:

四.数组的使用

1. 数组中元素访问

数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任何位置的元素。比如:

int[]array = new int[]{10 , 20 , 30 , 40 , 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);

也可以[]对数组的元素进行修改

array[0] = 100;
System.out.println(array[0]);

注意事项

2.遍历数组

“遍历”是指将数组中的所有元素都访问一遍,访问是指对数组中的元素进行某种操作,比如打印

可以使用循环来打印

那如何拿到数组的长度呢?

注意:在数组中可以通过:数组对象.length来获取数组的长度

int[]array = new int[]{10 , 20 , 30 , 40 , 50};
for(int i=0; i<array.length;i++){
    System.out.println{array[i]);
}

也可以使用for each遍历数组

for-each是for循环的另外一种使用方式,能够更方便的完成对数组的遍历,可以避免循环条件和更新语句写错

3.打印数组

import java.util.Arrays;
int[] array = {4,7,90,1,3,87,4,33};
System.out.println(Arrays.toString(array));

需要引用:

import java.util.Arrays;

五.数组是引用类型

引用类型——这个变量当中存储的是地址

1.初始JVM的内存分布

内存是一段连续的存储空间,主要用来存储程序运行时数据的

因此JVM也对所使用的内存按照功能的不同进行了划分:

  • 程序计数器:只是一个很小的空间,保存下一条执行的指令的地址
  • 虚拟机栈:与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表,操作数栈,动态链接,返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如局部变量。当方法运行结束后,栈帧就销毁了,即栈帧中保存的数据也被销毁了
  • 本地方法栈:本地方法栈与虚拟机栈作用类似,只不过保存的内容是Native方法的局部变量。在有些版本的JVM实现中(例如HotSpot),本地方法栈和虚拟机栈是一起的

2.基本类型变量和引用类型变量的区别

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;

而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址

        

引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。类似于C语言中的指针

3.引用变量

此时array1和array2的都存的是原来array2的地址了,所有此时改变任何一个数组,另外一个也跟着变,而array1原来的对象就没人指向它了,此时JVM会自动把他回收掉

4.null

null在Java中表示"空引用",也就是一个不指向对象的引用。

null的作用类似于C语言中的NULL(空指针),都表示一个无效的内存位置,因此不能对这个内存进行任何读写操作,一旦尝试读写,就会抛出NullpointerException。

当二维数组没有指定列并且没初始化时,二维数组里面的一维数组的值此时是null

注意:Java中并没用约定null和0号地址的内存有任何关联

六.数组的应用场景

1.保存数据

2.作为函数的参数

1.参数传基本数据

在func方法中修改形参x的值,不影响实参的num值

2.参数传数组类型(引用数据类型)

在func方法内部修改数组内容,方法外部的数组内容也发生改变。

因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的

3.作为函数的返回值

比如获取斐波那契数列的前N项

七.数组练习

1.数组转字符串

借助工具类

自己实现toString

2.数组拷贝

1.用for

2.用类方法

还可以只拷贝一部分

拷贝1下标到3-1下标

3.arraycopy

3.求数组中元素的平均值

4.查找数组中的指定元素

给定一个数组,再给定一个元素,找出该元素在数组中的位置

二分查找(只能用于有序数组)

操作类有二分查找

Arrays.binarySearch(\数组名,找的元素)

5.数组排序

冒泡排序(升序)

public class Main {
    public static int[] sort(int[] arr){
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
                if(arr[j]>arr[j+1]){
                    int ret = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = ret;
                }
            }
        }
        return arr;
    }

    public static void main(String[] args) {
        int[] array = {3 , 8 , 6 , 9 , 0 , 5};
        int[] arr = sort(array);
        String newArr = Arrays.toString(arr);
        System.out.println(newArr);
    }
}

Arrays.sort(数组名

八.二维数组

二维数组本质也是一维数组,只不过每个元素也是一个一维数组

这个二维数组的长度为2,里面有2个长度为3的一维数组

1.二维数组的定义和初始化

未赋值时默认值全为0

2.遍历二维数组

3.打印二维数组

当array1是一个二维数组

4.不规则的二维数组

省略列的时候就是不规则的二维数组,此时第一行的长度是3,第二行的长度是6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值