Java数组

Java基础

数组的使用

动态初始化之一


//a.length = 5

int[] a = new int[5];

标记:

  • 不同于int a = 5;这种语句,前者数组名a代表着一个地址,后者变量名a代表着一个数字5

  • 上面int[5]是开辟了一个大块的空间,大块空间中是5块连续的小块,它们的地址也是连续的

  • 开辟出来的空间如果未在这块地址中赋值,那么默认为该数据类型的默认值

动态初始化之二


//a.length=???

int[] a;

//......

//calculate b+c=d

//b=???,c=???,d=???

int b = new Scanner(System.in).nextInt();

int c = new Scanner(System.in).nextInt();

int d = b + c;

//a.length = d;

a = new int[d];

标记:

  • 先声明a是一个数组,不指向堆中任何一块空间

  • 知道了具体要开辟多大内存空间后,再初始化数组对象,使a指向初始化的对象

静态初始化


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

标记:

  • 连续的六块地址中都从一开始被填入了元素

  • 适用于你把数组中的数字全都确定了

数组使用注意事项和细节

  1. 数组只能存相同的数据类型,无论是引用数据类型还是基本数据类型

  2. 开辟出的每一块地址中,如果没有放入数值,就是类型默认数值

  3. 数组名指向一个对象,基本数据类型变量名等于一个数字/字符/字符串

数组赋值机制

数组在默认情况下是引用传递,赋的值是地址


//arr1 = &arr1[0]

int[] arr1 = {1,2,3};

//arr2 = arr1 = &arr1[0]

int [] arr2 = arr1;

标记:

  • 上面这波操作是让arr2也指向arr1指向的那片地址,操作arr2指向的地址里的东西也就等价于arr1指向的地址里的东西

图解:
在这里插入图片描述

数组拷贝

int[] array2 = new int[array1.length];
for(int i = 0;i<array1.length;i++){
	array2[i] = array1[i];
}

标记:

  • 这样的话修改array2的值不会影响到array1,因为array2是一块新的空间

数组翻转

1.通过双指针翻转

int[] a = {1,2,3,4,5,6};
//头指针
int head = 0;
//尾指针
int tail = a.length-1;
//开始遍历
while(true){
	if(tail<=head){
		break;
	}
	a[head] = a[head]^a[tail];
	a[tail] = a[head]^a[tail];
	a[head] = a[head]^a[tail];
	tail--;
	head++;
}

2.新数组逆序赋值

这个个人感觉不用再写了,就略过了。

数组扩容

新建一个比原来数组容量大n个空间的数组,然后把原来的数组每个值赋值进去,再最后写上你要添加的数组,再使原来的数组指向新数组的地址

数组缩减

思路同上,就是地址的来回指

冒泡排序

…这真不是我眼高手低,这真的略了

二分查找(已经排好序)

//目标值
int goal = 100;
//定义初始指针位置
int index = array.length/2;
//整个的范围
int left = 0;
int right = array.length;
//开始查找
while(true){
	if(array[index]==goal){
		break;
	}
	else if(array[index]>goal){
		left = index;
		index = (left+right)/2;
	}
	else{
		right = index;
		index = (left+right)/2;
	}
}

二维数组内存布局

int[][] a = new int[3][2];

标记:

  • a在栈中的值为一个地址,这个地址指向堆中的一个大空间,堆中有3个连续空间,这两个空间中所存都是地址,这3个地址分别又指向堆中的一个新空间(2个小空间)

图解:
图片引用自围巢111

二维数组使用

动态初始化之一

int[][] a = new int[3][2]

标记:

  • a的值是一个地址,这个地址指向堆中的一个空间,这个空间中连续的存着三个地址,三个地址又指向另外的空间

动态初始化之二

int[][] a;
a = new int[3][2];

动态初始化之单独开辟一维数组

int[][] a = new int[3][];
for(int i = 0;i<a.length;i++){
	a[i] = new int[i+1];
}

标记:

  • Line1中我们只开辟了3个存放地址的空间,而未在这个空间中放任何地址,所以此时等价于一维数组,默认值为0
  • for循环中,我们给3个空间中的每一个空间都赋上一个地址值,这样就变成了三个长度不用的一维数组所组成的二维数组

静态初始化

int[][] a = {{1,2},{3},{5,9,0,7}};

标记:

  • a中有三个一维数组(三块空间存地址),第一个指向一维数组有两个元素,第二个指向一维数组有一个元素,第三个指向一维数组有四个元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值