数组:
数组特性: 内存中连续存储,并且下标从0开始(内存地址偏移)
数组长度一旦确定长度不能更改,也就意味着数组是不能添加和利除的
除非新建一个数组,把原数据复制到新数组中,在复制的过程当中可以进行添加和删除操作
所以数组的查询和更改效率是很高的,但是添加和删除效率较低
数组都有一个内置属性length保存了数组的长度
在java中有一个java.util.Arrays类提供了一-些数组操作
数据声明
1、静态声明:已知每个元素
数据类型[] 变量名 = {值,值,值}; 简写
数据类型[] 变量名 = new 数据类型[] {值,值,值};
int a = 2;
int[] arr={1,2,4,6};
int[][] arrs = {
{},{},{}
}; //二维数组
2、动态声明:不知道数组中每个元素
数据类型[] 变量名 = new 数据类型[长度];
int[] arr = new int[长度];
arr.length 数组长度
动态声明,保存的是对应类型的默认值比如上面程序中会保存5个0
整数0,小数0.0,布尔false,字符\u0000,引用类型null
数组使用方法:
常见异常
1、下标越界
2、空指针异常
/数组自变量传递方式
m2(new int[] { 1, 2, 3 });
引用传递:
数组上引用类型,用new创建,储存在堆里,每次传递的是数组在堆中的地址。
所以更改的都是堆中数组的内容,对数组本身操作不需要返回值
基本数据类型:
而基本数据类型传递都是对原参数空间内的数的复制,存到新开辟的存储空间中。原参数空间值不变
数组复制:
二维数组:
存储方式:一个数组里面嵌套N个数组。数组里面的数组也是引用类型
二维数组遍历:
// 遍历——二维表
public static void index(int[][] arr) {
// 外圈遍历找数组下标
for (int i = 0; i < arr.length; i++) {
// 内圈遍历找数组内的数的下标
for (int j = 0; j < arr[i].length; j++) {
// 每次找一个就输出一个
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
// 锯齿状
public static void index_1(int[][] arr) {
// 初始化每一个数组的内容,将其变成第一行一个、第二行两个、、、、、
for (int i = 0; i < arr.length; i++) {
arr[i] = new int[i + 1];
}
// 遍历
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
数据交换:
public static void main(String[] args) {
int x = 10;
int y = 11;
// 1 中间变量(开发常用)
int temp = x;
x = y;
y = temp;
System.out.println("x=" + x + ",y=" + y);
// 2 位移运算(面试用)
x = 2; // 0000 0010
y = 3; // 0000 0011
// 转换为对应的二进制,每位异或,相同取0,不同取1
x = x ^ y; // 0000 0001
y = x ^ y; // 0000 0010
x = x ^ y; // 0000 0011
System.out.println("x=" + x + ",y=" + y);
// 3 加减运算
x = 10;
y = 20;
x = x + y;
y = x - y;
x = x - y;
System.out.println("x=" + x + ",y=" + y);
}