一.数组的基本概念
什么是数组?
数组:可以看成是相同类型元素的一个集合。在内存中是一段连续空间。比如现实中的车库
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