1.案例引入:
如果需要定义多个变量,那么我们建议使用容器,一次性保存多个数据,统一操作。
2.容器:
是将多个数据存储到一起,每个数据称为该容器的元素。
3.Java中容器: 数组,集合
数组:是一个长度固定的容器,而且容器中的元素的数据类型要一致
4.数组的三种定义方式
//格式一:(静态初始化)
int[] arr1=new int[]{1,2,3};//int arr1[]=new int[]{1,2,3} 效果一样的
//格式二:简化版(静态初始化)
int[] arr2={1,2,3};
//格式三:动态初始化
int[] arr3=new int[3];
1.什么是内存
程序运行时,所占的那部分空间,断电丢失
2.Java的内存五大区
栈区(stack): 保存局部变量(我们目前学的所有变量,都在这个区)
堆区(heap): 保存对象(也就是new出来东西)
方法区(method area): 保存.class文件
本地方法区(native):和操作系统有关
程序计数器区/寄存区:和CPU相关
3.数组的内存图(见下图)
a.单个数组的内存图
b.两个或多个数组的内存图
c.两个数组名指向同一个数组的内存图
tip:“同居原理”即:两个数组同用一个相同的地址,其中一方数组的元素发生改变,另一方 也同时发生改变(两个人共用一张白纸,一个人画完后,另一个人再拿这张纸还是白的吗?)
4.数组的常见异常
1.数组越界异常(ArrayIndexOutOfBoundsException)
访问了不存在的索引的元素
2.空指针异常(NullPointerException)
数组名中的地址清空后,继续访问数组的某个元素
常用的两个方法
String s = Arrays.toString(数组);//把数组中每个元素取出,拼接一个完整的字符串给你
Arrays.sort(数组);//把数组中元素进行升序排序
排序数组:
如果是数值类型,按照值的大小升序排序
如果是字符类型,按照字符的ASCII码值升序排序
如果是字符串类型,按照字符串的首字母升序排序,首字母一样按照第二个字母升序排序,...
1.数组获取最大值元素
求出数组中最大的那个元素
//1.数组
int[] nums = {32,54,3,754,6,13,4,53,6,34,645,7,568};
//2.求数组的最大值
//定义一个擂主变量
int max = nums[0];
//依次取出每个元素(遍历),不要第一个
for(int i = 1;i < nums.length;i++) {
//选手元素 nums[i]
if (max < nums[i]) {
max = nums[i]; //选手 大于 擂主 那么选手要成为新的擂主
}
}
//所有元素都比较完毕之后,max中保存的就是最大值
//3.打印
System.out.println("最大值是:"+max);
2.数组反转
//数组反转方法一:
//重新定义新数组,令a数组的首个索引等于b数组的最后索引
private static void Arrays2() {
int[] arrs = {1, 2, 3, 4, 5, 6, 7};
int[] arrs2 = new int[arrs.length];
for (int i = 0; i < arrs.length; i++) {
arrs2[arrs.length - i - 1] = arrs[i]; //arrs和arrs2数组长度一致,都为7,所以arrs[首]+arrs2[末]=数组长度-1,
//即(arrs)[0]+(arrs2)[6]=7-1 (arrs)[1]+(arrs2)[5]=7-1
}
for (int a : arrs2) {
System.out.println(a);
}
}
//数组反转方法二:指针索引交换
private static void Arrays3() {
int arr[] = {1, 2, 3, 4, 5};
int maxOfIndex = arr.length - 1;
int minOfIndex = 0;
//while循环
while (maxOfIndex > minOfIndex) { //当最大索引<=最小索引时停止
int temp = arr[maxOfIndex];
arr[maxOfIndex] = arr[minOfIndex];
arr[minOfIndex] = temp;
maxOfIndex--;
minOfIndex++;
}
/*
for循环遍历
for (int maxOfIndex=arr.length-1,minOfIndex=0;maxOfIndex>minOfIndex; minOfIndex++, maxOfIndex-- ) {
int temp=arr[maxOfIndex];
arr[maxOfIndex]=arr[minOfIndex];
arr[minOfIndex]=temp;
}*/
//增强for遍历
for (int foreach : arr) {
System.out.println(foreach);
}
// Arrays.toString 工具类Arrays可直接打印
System.out.println(Arrays.toString(arr));
}
3. 求数组平均值
private static void No2(){
//求数组平均值,要求保留一位小数
int[] arr1={1,2,3,4,5};
int sum=0;
for (int num:arr1){
sum+=num;
}
System.out.println(sum);
int i = sum / arr1.length;
Double avg = Double.valueOf(i); //这里Double是double的包装类,等复习到的时候再说
double avg2=i; //类型转换:范围小——>范围大 无需强转
System.out.println(avg);
System.out.println(avg2);
}
4.利用数组打印扑克牌
//这里没有大小王,等复习到集合的时候用集合做“斗地主”游戏比较方便
private static void No5(){
String[] color={"♣","♠","♦","♥"};
String[] number={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
for (int i = 0; i < color.length; i++) {
for (int i1 = 0; i1 < number.length; i1++) {
System.out.print(color[i]+number[i1]+"\t");
}
System.out.println();
}
}
5.判断数组是否对称
private static String arrIsOrNotSymmetry(int[] arr){
int max=arr.length-1;
int min=0;
for (int i = 0; i < arr.length; i++) {
if(arr[min]==arr[max]){
max--;
min++;
}else{
return "不对称";
}
//有没有这个if的效果是一样的,因为数组本身对称
if(max<=min){
break;
}
}
return "对称";
}
6.数组排序
//最简单的方法,利用Arrays工具类
int[] arr={1,8,6,3,5};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
//这里Arrays.sort()只能正序排序,想倒叙就在搞下上面的数组反转(⊙⊙)!
冒泡排序、插入排序什么的单独整一篇