主要点说明:
- 数组元素替换,数组元素插入值
- 杨辉三角,二维数组动态声明锯齿状
- 交换变量值的三种方法
- 给Main函数传值
数组
1.定义:
数组是引用数据类型,用来保存多个数据
1.1数据结构:
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
1.2数组特性:
连续存储,下标从0开始,数组一旦创建,长度无法修改;
查询、修改效率极高,添加删除效率较低(并且数组没有提供添加和删除功能)
如果想实现添/删除功能,只能复制源数组到新数组中,在复制的过程中进行增加/删除操作
1.3数组声明:
1.3.1静态声明:
一维数组的静态声明:
数据类型[] 数组名 = {值,值,值,值......}
int[] arr ={1,2,3,4,5};
二维数组的静态声明:
数据类型[][] 数组名 ={{值,值,值..},{值,值,值..},{值,值,值..}...}
int[][] arr = {{1,2,3},{11,12,13},{111,112,113}};
1.3.2动态声明:
一维数组的动态声明:
int[] arr = new int[length];
//length是这个数组的长度,必须规定一下
二维数组的动态声明:
int[][] arr = new int[length1][length2];
//length1是一维数组的个数,length2是每个一维数组中的个数
1.4数组在内存中的形式
1.4.1一维数组:
1.4.2二维数组:
1.5数组的使用
1.5.1一维数组使用
获取数据
// 查询 数组[下标] 下标从0开始
System.out.println(arr1[0]);
System.out.println(arr1[3]);
// 最后一个数据
System.out.println(arr1[arr1.length-1]);
// 长度
System.out.println(arr1.length);
更改数据
// 修改 数组[下标] = 值
arr1[2] = 25;
遍历
// 遍历
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
1.5.2二维数组使用
获取数据
// 查询 数组[下标]
int i = arr1[2];
int[] arr3_0 = arr3[0];
int arr3_0_1 = arr3_0[1];
// 第0个一维数组中的第1个数据(下标)
// 二维数组[下标][下标]
arr3_0_1 = arr3[0][1];
// 第一个一维数组中的第一个元素
System.out.println(arr3[0][0]);
// 最后一个一维数组中的最后一个元素
System.out.println(arr3[2][3]);
int[] arr3_2 = arr3[arr3.length-1];
int arr3_2_3 = arr3_2[arr3_2.length-1];
System.out.println(arr3_2_3);
System.out.println(arr3[arr3.length-1][arr3[arr3.length-1].length-1]);
更改数据
arr4[2][3] = 29;
遍历
// 遍历
for (int j = 0; j < arr4.length; j++) {
// int[] arri = arr4[j];
for (int k = 0; k < arr4[j].length; k++) {
System.out.print(arr4[j][k] + " ");
}
System.out.println();
}
1.6数组传递
public static void main(String[] args) {
int i = 1;
m1(i);
m1(1);
int[] arr = { 1, 3, 4 };
m1(arr);
// 字面量写法
m1(new int[] { 1, 3, 4 });
}
public static void m1(int a) {
}
public static void m1(int[] arr) {
}
1.7给Main方法传参
1.8传值和传址
传值是说基本数据类型,比如:
public static void main(String[] args) {
int i = 10;
m1(i);
System.out.println(i);
}
public static void m1(int i) {
i++;
System.out.println(i);
}
}
这个打印结果应该是11,10
11是m1方法的打印结果;10是main方法打印结果(这些变量值是存在每个方法的栈帧里的,互不影响)
传值是引用类型传递,因为是传递的地址,所以两个变量会指向同一个堆内存对象数据
public static void main(String[] args) {
int[] arr = {1,2};
m2(arr);
System.out.println(arr[0]);
}
public static void m2(int[] arr){
arr[0] = 11;
System.out.println(arr[0]);
}
这个打印结果是11,11
本质区别就是数据储存的地方不同,数组储存在堆内存中,栈帧的方法名只是储存了数组的地址而已,所以某一个地方把对象中数据进行修改,则所有进行访问该对象的数据时,都是修改之后的
1.9数组替换复制
public static void main(String[] args) {
int[] src = { 1, 2, 3, 4, 5, 6, 7, 8 };
int[] dest = { 11, 12, 13, 14, 15, 16, 17, 18 };
// 源数组,源数组起始位置(包含),目标数组,目标数组起始位置(包含),复制个数
// System.arraycopy(src, 1, dest, 1, 3);
arraycopy(src, 1, dest, 1, 3);
for (int i = 0; i < dest.length; i++) {
System.out.println(dest[i]);
}
}
public static void arraycopy(int[] src, int srcIndex, int[] dest,
int destIndex, int length) {
for (int i = 0; i < length; i++) {
dest[destIndex] = src[srcIndex];
destIndex++;
srcIndex++;
}
}
2.0数组插入复制
public static void main(String[] args) {
int[] src = { 1, 2, 3, 4, 5, 6, 7, 8 };
int[] dest = { 11, 12, 13, 14, 15, 16, 17, 18 };
dest = arraycopy(src, 1, dest, 2, 3);
for (int i = 0; i < dest.length; i++) {
// 11, 12,2, 3, 4, 13, 14, 15, 16, 17, 18
System.out.println(dest[i]);
}
}
/**
* 数组插入式复制
*
* @param src
* 源数组
* @param srcIndex
* 源数组 起始索引(包含)
* @param dest
* 目标数组
* @param destIndex
* 目标数组 起始索引(插入到该索引之后)
* @param length
* 插入个数
* @return 返回新的数组,因为数组长度一旦确定,长度不可更改,既然是插入数据,肯定会扩大长度,所以只能新建数组,用于容纳更多的元素
* 并把新数组地址返回给调用处
*/
public static int[] arraycopy(int[] src, int srcIndex, int[] dest,
int destIndex, int length) {
// 1 确定新数组长度,并创建新数组
// 新长度为 dest.length + length
int[] newDest = new int[dest.length + length];
// 2 把目标数组起始位置之前的数据,全部拿到新数组中(包含)
for (int i = 0; i <= destIndex; i++) {
newDest[i] = dest[i];
}
// 3 把源数组起始位置(包含)开始,复制到新数组中,复制 length个
// 因为后面还要用到目标数组起始位置,所以destIndex的值暂时不能修改
// 所以把destIndex的值赋值给index,可以对index进行修改
// index 表示 新数组中,最后一个添加元素的下标
int index = destIndex;
for (int i = srcIndex; i < srcIndex + length; i++) {
// 新数组起始位置为 : 目标数组起始索引 + 1
index++;
newDest[index] = src[i];
}
// 4 把目标数组起始位置之后的数据,添加到新数组中
for (int i = destIndex + 1; i < dest.length; i++) {
index++;
newDest[index] = dest[i];
}
return newDest;
}
2.1动态声明锯齿状(杨辉三角)
int[][] arr = new int[15][];
// 初始化数组
for (int i = 0; i < arr.length; i++) {
// 第一个一维数组长度为1
// 第二个一维数组长度为2
arr[i] = new int[i + 1];
}
// 数组赋值
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
// 首尾都是1
if (j == 0 || j == arr[i].length - 1) {
arr[i][j] = 1;
} else {
// i行j列 = i-1行j-1列 + i-1行j列
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
}
// 遍历
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();
}
2.2交换变量的值
int a = 10;
int b = 5;
// 1 开发常用,中间变量,简单易懂
int c = b;
b = a;
a = c;
// 2 相加
a = 10;
b = 5;
a = a + b;
b = a - b;
a = a - b;
// 2 异或运算,面试常用
a = 10;
b = 5;
// a= 0000 1010
// b= 0000 0101
// a= 0000 1111
a = a ^ b;
// b= 0000 1010
b = a ^ b;
// a= 0000 0101
a = a ^ b;
System.out.println(a + " : " + b);