1、为什么需要数组
- 变量的概念 在内存中开辟的用于存储某一固定数据类型数据的空间
- 数组 在内存开辟的一连串的用于存储同一数据类型数据的空间
2、数组的基本使用语法
声明 类型[] 数组名;
分配空间 数组名=new 类型[长度];
赋值 数组名[下标]=数据值; 下标从0开始 用于比数组的元素个数少1
使用 数组名[下标];
3、数组的其他使用语法
类型[] 数组名={数值列表}; 声明 分配空间 赋初值
类型[] 数组名=new 类型[]{数值列表};
- 类型[] 数组名;
- 数组名=new 类型[]{数值列表};
4、数组的十大操作
- 新增
单个元素的赋值 数组名[下标]=值;
数组所有元素的赋值
int[] nums=new int[5];
for(int i=0;i<nums.length;i++){
nums[i]=??;
}
- 追加式的新增
//创建一个原数组
int[] nums={1,2,3,4};
//向 原数组中新增一个10
//扩容操作
//备份原数组
int[] tNums=nums;
//强制开辟空间的方式 进行原数组的扩容操作
nums=new int[nums.length+1];
//还原数据 将备份数组中的数据 存回到 扩容之后的原数组中
for (int i = 0; i < tNums.length; i++) {
nums[i]=tNums[i]; //将备份数组i下标的元素值 存放到 对应的扩容数组 对应下标位置
}
//新增数据
nums[nums.length-1]=10;
- 修改
先找出下标位置,再进行替换操作
- 删除
先找出下标位置,备份,重置原数组
- 单查 打标记
int flag=-1; //没找到 是否找到元素的标志 如果找到了用于保存找到元素所在的下标位置
for(int i=0;i<nums.length;i++){
if(nums[i]==num){
flag=i;
break;
}
}
if(flag==-1){
//没找到
}else{
//找到了 在 flag 下标位置
}
- 全查
int[] nums={1,2,3,4,5};
for(int i=0;i<nums.length;i++){
System.out.println(nums[i]);
}
- 求最大
先设一个存放最大值的变量(数组下标0),再循环
- 求最小
- 求平均
- 求总和
- 排序
5、值类型和引用类型
1)值类型 变量空间中存值 引用类型 变量空间中存地址
2)值类型包含
整形 byte short int long
浮点数 float double
字符 char
布尔 boolean
枚举 enum
3)除9大值类型外所有的类型均为引用类型
字符串 String
数组 任意类型的数组
系统定义的类 Scanner Arrays Random 等等
自定义的类 Test1 Test2 Test3..
注:null是引用类型特有的缺省值
4)当 值类型 引用类型 和 字符串 进行赋值改值操作时的差异性
- 值类型数据操作 赋值完成后 两个变量再无关系 任意变量的值发生改变 都不影响另一个变量
int num=10;
int num1=num;
num=20;
System.out.println(num1);// 20
- 引用类型数据 操作 赋值复制的是地址 两个变量拥有同样的地址 指向同一个存值空间 任意一方对数据进行更改 另一方都会同时受影响
int[] nums={10};
int[] nums1=nums;
nums[0]=20;
System.out.println(nums1[0]);
- 字符串属于引用类型 但字符串池具有不可更改性 所以 当字符串变量重新赋值时 并非改变存值空间的数据 而是改变变量本身存储的地址 表现出类似于值类型的效果
String str1="abc";
String str2=str1;
str1="def";
System.out.println(str2);
- 值类型数据作为参数传递时,传递的是值,在方法内所做的所有修改不影响原变量值。
- 引用类型数据作为参数传递时,传递的是地址,所以在方法中进行的任意修改都会影响原数据。
- 字符串虽然是引用类型,但具有不可更改性。