1、数组
引用数据类型
定义:用来保存多个数据
1.1 数据结构
定义:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
操作:增删改查
1.2 数组特性
内存中连续存储,并且下标从0开始
数组长度一旦确定 长度不能更改 也就意味着数组不能添加和删除
除非新建一个数组 ,把原来数据复制到新数组中,在复制过程中可以进行添加和删除操作
所以数组的查询和更改 效率很高 但是添加和删除效率很低
数组有一个内置属性 length 保存了数组的长度
在Java中有一个java.util.arrays类 提供了一些数据操作
1.3 数组声明
1 静态声明:在已知每个元素是什么的时候,使用静态声明
——数据类型 变量名=值;
——int i =2;
数据类型[] 变量名 ={值,值,值};简写方式
数据类型[] 变量名=new 数据类型[]{值,值,值};比如对数组进行二次赋值,就需要这样写
——int [] arr={1,1,1,122,0};
——int [][] arr={
{1,1,2} {2,5,6} };
2 动态声明:不知道数组中每个元素的时候,使用动态声明
数据类型[]变量名=new 数据类型[长度];
int[] arr=new int [5];
int[][] arr=new int[2][3];
动态声明,保存的是对应类型的默认值比如下面程序中 会保存五个0
整数 0 小数 0.0, 布尔 false, 字符\u0000, 引用类型 null
例如
1.4存储方式
1.5数组使用
1.4.1获取数据
1.5.2更改数据
1.5.3遍历
1.5.4常见异常
1、空指针
2、下标越界
1.5.5数组传递
1.5.6Main方法传参
1.6 传值和传址
1、传值 指的是传递基本类型的值,相互不影响,因为指向不同的空间
2、传址/传引用 指的是传递引用类型的值 ,相互有影响,指的是同一堆内存对象空间
1.7 数组复制
public static void main(String[] args) {
int[] src = { 2, 3, 4, 5, 6, 7, 8 };
int[] dest = { 11, 12, 13, 14, 15, 16, 17, 18 };
// int[] dest = { 11, 12, 13, 14,4, 5, 6, 15, 16, 17, 18 };
int[] result = copy(src, 2, dest, 3, 3);
for (int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
}
/**
* 插入复制
*
* @param src
* 源数组
* @param srcPos
* 源数组起始位置
* @param dest
* 目标数组
* @param destPos
* 目标数组起始位置
* @param length
* 插入个数
* @return
*/
public static int[] copy(int[] src, int srcPos, int[] dest, int destPos,
int length) {
// 因为是插入复制,所以肯定会更改数组长度,因为数组长度不能更改,所以我们只能新建数组,并通过返回值把数组返回
/**
* 0 创建一个新数组,长度为 dest.length + length
*
* 1 目标数组中 从0开始 到 起始位置结束(包含),复制到新数组中
*
* 2 源数组中 从起始位置开始(包含) 复制 length个 到 新数组中
*
* 3 目标数组中 从起始位置+1开始(包含) 到最后 所有的数据 复制到新数组中
*/
// 0 创建一个新数组,长度为 dest.length + length
int[] newDest = new int[dest.length + length];
// 1 目标数组中 从0开始 到 起始位置结束(包含),复制到新数组中
for (int i = 0; i <= destPos; i++) {
newDest[i] = dest[i];
}
// 2 源数组中 从起始位置开始(包含) 复制 length个 到 新数组中
// 现在需要用到目标数组的起始位置并且需要更改,但是 后面还要用到目标数组的起始位置,所以我们不能更改
// 所以 这里把目标数组起始位置 赋值给一个新变量index,可以更改index
int index = destPos;
for (int i = srcPos; i < srcPos + length; i++) {
index++;
newDest[index] = src[i];
}
// 3 目标数组中 从起始位置+1开始(包含) 到最后 所有的数据 复制到新数组中
for (int i = destPos + 1; i < dest.length; i++) {
index++;
newDest[index] = dest[i];
}
return newDest;
}
2.二维数组
2.1声明方式
2.2 存储方式
2.3 使用方式
2.3.1 获取数据
2.3.2 更改数据
2.3.3 遍历
2.3.4 动态声明锯齿状
3. 变量的值
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);