一、数组的使用
一、1、使用方式1-动态初始化
数组的定义
语法:数据类型 数组名[]=new 数据类型[大小]
int a[] =new int [5]; //创建了一个数组,名字为a,存放5个int数据
也可以这样写,作用是一样的
int[] a=new int[5];
一、2、使用方式2-动态初始化(先声明)
1. 先声明数组
语法:数据类型 数组名[];
int a[];
或者:int[] a;
2.创建数组
语法:数组名=new 数据类型[大小]
a=new int[10];
一、3、使用方式3-静态初始化
语法:数据类型 数组名[]={元素值,元素值...}
int a[]={2,4,6,3,5,1};
等同于
int a[]=new int[6];
a[0]=2;a[1]=4;a[2]=6;a[3]=3;a[4]=5;a[5]=1;
一、4、数组的注意事项
- 数组是多个相同类型数据的组合,实现对这些数据的统一管理
- 数组中的元素可以是任何数据类型,包基本数据类型和引用数据类型,但不能混用。
- 数组创建后,如果没有赋值,默认值为0
- 数组的下标从0开始
- 数组属于引用类型,数组型的数据本质是对象
一、5、数组的赋值机制
- 基本数据类型赋值,这个值就是具体的数据,而且相互不影响
- 数组在默认情况下是引用传递,赋的值是地址
简单来说上面的arr2=arr1;实际上就是arr2指向arr1的数组空间里面,就是说arr2和arr1指向同一个空间,二者之间的改变会相互影响,因为它们是指向同一个空间的,改变的内容也是同一个内容。(可以理解为一个房间给两个人一起使用)
代码:
public static void main(String[] args) {
int n1=2;
int n2=5;
n2=n1;
System.out.println("n2="+n2);
int[] arr1={1,2,3};
int[] arr2=arr1;
System.out.println("遍历输出arr2");
for (int i :arr2) {
System.out.println(i);
}
}
运行结果:
n2=2
遍历输出arr2
1
2
3
一、6、数组的拷贝
public static void main(String[] args) {
int[] arr1={20,23,41,51,56};
int[] arr2=new int[arr1.length];
System.out.println("数组的拷贝");
for (int i=0;i<arr1.length;i++){
arr2[i]=arr1[i]; //实际上就是把数组arr1[]的每个值都赋值给数组arr2[]
}
System.out.println("遍历输出数组arr2");
for (int i=0;i<arr2.length;i++){
System.out.print(arr2[i]+" ");
}
}
一、7、数组的翻转
一、7.1、方法一
- 解题思路:
- 把arr[0]和arr[5]进行交换
- 把arr[1]和arr[4]进行交换
- 把arr[2]和arr[3]进行交换
- 一个交换3次=arr.length/2;每次交换时,对应的下标为arr[i] 和arr[arr.length-1-i]
public static void main(String[] args) {
int[] a=new int[6];
//这里的Random.nextInt(100)是随机产生100以内的整数
for (int i=0;i<a.length;i++){
a[i]=new Random().nextInt(100);
}
System.out.println("===没有变之前的数组===");
for (int i=0;i<a.length;i++){
System.out.println("a["+i+"]="+a[i]);
}
for (int i=0;i<a.length/2;i++){
//声明一个变量来存放要交换的值
int temp=a[a.length-1-i];
a[a.length-1-i]=a[i];
a[i]=temp;
}
System.out.println("===改变之后的数组===");
for (int i=0;i<a.length;i++){
System.out.println("a["+i+"]="+a[i]);
}
}
运行结果:
===没有变之前的数组===
a[0]=72
a[1]=48
a[2]=83
a[3]=57
a[4]=20
===改变之后的数组===
a[0]=20
a[1]=57
a[2]=83
a[3]=48
a[4]=72
一、7.2、方法二
- 解题思路:
- 使用逆序赋值方式
- 1.先创建一个新的数组arr2,大小为arr1.length
- 2.逆序遍历arr1,将每个元素拷贝到arr2的元素中去(顺序拷贝)
- 3.建议增加一个循环变量j->0->arr1.length
- 4.把arr1指向arr2数据空间
- 此时arr1原来的数据空间就没有变量引用,会被当作垃圾销毁。
代码:
public static void main(String[] args) {
int[] arr1=new int[5];
for (int i=0;i<5;i++){
arr1[i]=new Random().nextInt(100);
}
System.out.println("===没有变之前的数组===");
for (int i=0;i<arr1.length;i++){
System.out.println("a["+i+"]="+arr1[i]);
}
int[] arr2=new int[arr1.length];
for (int i=arr1.length-1,j=0;i>=0;i--,j++){
arr2[j]=arr1[i];
}
arr1=arr2;
System.out.println("===改变之后的数组===");
for (int i=0;i<arr1.length;i++){
System.out.println("a["+i+"]="+arr1[i]);
}
}
运行结果:
===没有变之前的数组===
a[0]=72
a[1]=10
a[2]=20
a[3]=12
a[4]=8
===改变之后的数组===
a[0]=8
a[1]=12
a[2]=20
a[3]=10
a[4]=72
一、8、数组扩容
思路分析
1.初始化一个数组 int[] a={1,2,3};
2.定义一个新的数组 int[] b=new int[a.length+1]
3.遍历a数组,一次将a数组的值拷贝到b数组
4.将要新添加的元素赋值给b[b.length-1](就是把值赋给b数组的最后一个元素)
5.让a指向b,那么原来的a数组就被销毁了
6.中间加个条件判断,那样就可以控制增加的元素的个数了
代码:
public static void main(String[] args) {
Scanner my=new Scanner(System.in);
int[] a= {1,2,3};
do {
int[] b=new int[a.length+1];
for(int i=0;i<a.length;i++) {
b[i]=a[i];
}
System.out.print("请输入你要添加的元素:");
int num=my.nextInt();
b[b.length-1]=num;
a=b;
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
System.out.println();
System.out.print("是否继续添加元素(y/n):");
char key=my.next().charAt(0);
if(key=='n') {
break;
}
}while(true);
}
运行结果:
请输入你要添加的元素:4
1 2 3 4
是否继续添加元素(y/n):n