JAVA基础总结(五)JAVA 数组、以及初识JAVA内存堆和栈知识

一、JAVA 数组

  • 数组的定义
1. 数组是存储同一种数据类型的多个元素的集合。也可以看成是一个容器。
2. 数组中只能存储相同类型的若干个数据,根据先后存储的顺序排列组合而成。
3. 数组中,每一个数据都称作数组元素,每一个数组元素都有自己的下标,可以通过这个下标来访问这些数组元素。
4. 数组既可以存储基本数据类型,也可以存储引用数据类型。

注:想要使用数组,必须要声明和创建数组变量。

  • 声明创建数组变量的格式:
数据类型[] 数组变量名 = new 数据类型[定义数组长度];

注:在[]中定义数组长度这一步叫数组元素初始化,数组必须先初始化,然后才可以进行使用。

代码示例:int[]   nums  =  new  int[10];
//解释:定义了一个int类型的数组,这个数组中可以存放10个int类型的值。

数组初始化方式有两种:

	1.动态初始化:格式:数据类型[] 数组名 = new 数据类型[数组长度];
      数组长度其实就是数组中元素的个数。
      
    2.静态初始化:格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
         代码示例:int[] arr = new int[]{1,2,3};
		//解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。			
		//现在我们经常用下面这简化写法
		int[] arr = {1,2,3};
  • 数组遍历
数组的遍历就是依次输出数组中的每一个元素。
数组提供了一个属性length,用于获取数组的长度。
格式:数组名.length

Demo代码示例:

			public class ArrayDemo01 {
			
			
			    public static void main(String[] args) {
			
			        //声明创建数组
			        int[] nums = new int[10];
			        //给数组的下标赋值
			        nums[0] = 1;
			        nums[1] = 2;
			        nums[2] = 3;
			        nums[3] = 4;
			        nums[4] = 5;
			        nums[5] = 6;
			        nums[6] = 7;
			        nums[7] = 8;
			        nums[8] = 9;
			        nums[9] = 10;
			
			        int sum = 0;
			
			        //length方法:获取数组的长度
			        for (int i = 0; i < nums.length; i++) {
			
						//数组每一个下标代表的数字相加之和
			            sum = sum + nums[i];
			
			        }
			        System.out.println(sum);
			    }
			}

代码运行结果是55。

二、初识JAVA的内存

在这里插入图片描述

       我们在使用数组之前,需要先声明这个数组,这个时候,Java虚拟机会将声明的数组放入栈中,现在的数组中什么都没有,只是一个空的数组。我们要使用的话就需要创建数组对象,并将数组初始化。在我们完成创建和初始化操作之后,Java虚拟机会将我们创建好的数组对象放入堆中,并根据初始化的数组长度在堆中开辟出相同数量的空间。
  • 下标越界异常
       创建数组时,Java虚拟机会根据初始化定义的数组长度,来在堆中开辟出相同数量的空间与之对应。
       如果我们在编写代码时,所使用的下标是超出数组整体长度的,就会报一个下标越界的错误。
     错误提示:
     			Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2  
     意思是数组下标越界

三、数组的使用

  • 数组当作参数使用
    找出数组中的最大值和最小值
		public class ArrayTest2 {
		    public static void main(String[] args) {
		        //定义一个数组
		        int[] arr = {34,98,10,25,67};
		
		        //调用方法
		        int max = getMax(arr);
		        System.out.println("max:"+max);
		
		        //请获取数组中的最小值
		        int min = getMin(arr);
		        System.out.println("min:"+min);
		    }
		    /*
		        需求:获取数组中的最大值
		        两个明确:
		            返回值类型:int
		            参数列表:int[] arr
		    */
		    public static int getMax(int[] arr) {
		        //从数组中任意的找一个元素作为参照物
		        int max = arr[0];
		        //然后遍历其他的元素
		        for(int x=1; x<arr.length; x++) {
		            //依次获取和参照物进行比较,如果大就留下来,如果小,就离开。
		            if(arr[x] > max) {
		                max = arr[x];
		            }
		        }
		        //最后参照物里面保存的就是最大值。
		        return max;
		    }
		    public static int getMin(int[] arr) {
		        //从数组中任意的找一个元素作为参照物
		        int min = arr[0];
		        //然后遍历其他的元素
		        for(int x=1; x<arr.length; x++) {
		            //依次获取和参照物进行比较,如果小就留下来,如果大,就离开。
		            if(arr[x] < min) {
		                min = arr[x];
		            }
		        }
		        //最后参照物里面保存的就是最小值。
		        return min;
		    }
		}

在这里插入图片描述

  • 当作方法返回值使用
		public class ArrayDemo01 {
		
		    public static void main(String[] args) {
		
		        //声明创建数组
		        int[] nums = {12,96,8,445,4,44,94};
		
		        int[]  reverse = reverse(nums);
		        printArray(reverse);
		    }
		//将数组中的元素反转过来
		    public static int[] reverse(int[] nums){
		
		        int[] result = new int[nums.length];
		
		        for (int i = 0, j = result.length-1; i < nums.length; i++,j--) {
		            result[j] = nums[i];
		        }
		        return result;
		    }
		//打印数组元素方法
		    public static void printArray(int[] nums){
		
		        for (int i = 0; i < nums.length; i++) {
		            System.out.println(nums[i]+"");
		        }
		    }
		}

运行结果:
在这里插入图片描述

四、二维数组

概述:一个数组元素为一维数组的数组,由多个一维数组组成。
  • 有三种格式
格式1、数据类型[][] 变量名 = new 数据类型[m][n];
       m表示这个二维数组有多少个一维数组
        n表示每一个一维数组的元素个数

格式2:数据类型[][] 变量名 = new 数据类型[m][];

格式3:数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
  • 举例
	     int[][] arr = new int[3][2];
			定义了一个二维数组arr
			这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]
			每个一维数组有2个元素,可以通过arr[m][n]来获取,
			表示获取第m+1个一维数组的第n+1个元素

遍历二维数组:

遍历数组就是获取数组中的每一个元素,通常遍历数组都是使用for循环来实现。使用双层for循环,通过数组length属性可以获得数组的长度
  • 案例一
		   public class Gushi {
		
			public static void main(String[] args) {
		     /* ******横向输出******
		       	床	前	明	月	光
		        疑	是	地	上	霜
		        ******纵向输出******
		        床	疑
		        前   是
		        明	地
		        月	上
		        光	霜*/
				// TODO Auto-generated method stub
				String[][] ss=new String[][]{{"床","前","明","月","光"},{"疑","是","地","上","霜"}};
				System.out.println("******横向输出******");
				for(int i=0;i<ss.length;i++) {
					for(int j=0;j<ss[i].length;j++) {
						System.out.print(ss[i][j]+"\t");
					}System.out.println();
				}
				System.out.println("******纵向输出******");
				for(int row=0;row<ss[0].length;row++) {
					for(int col=0;col<ss.length;col++) {
						System.out.print(ss[col][row]+"\t");
					}System.out.println();
				}
			}
		
		}
  • 案例二
			//将原有积分进行备份,然后赠送每位会员500积分,编写程序输出积分情况
			/*请输入5位会员的积分
			第1位会员积分:1859
			第2位会员积分:235
			第3位会员积分:468
			第4位会员积分:452
			第5位会员积分:23
			1859
			序号	历史积分	新年积分
			1	1859		2359
			2	235			735
			3	468			968
			4	452			952
			5	23			523*/
			public class Jifen {
			
				public static void main(String[] args) {
					// TODO Auto-generated method stub
					Scanner sc=new Scanner(System.in);
					System.out.println("请输入5位会员的积分");
					int[][] fen=new int[2][5];
					for(int i=0;i<fen[0].length;i++) {
						System.out.print("第"+(i+1)+"位会员积分:");
						fen[0][i]=sc.nextInt();
						fen[1][i]=fen[0][i]+500;
					}
					System.out.println(fen[0][0]);
					//遍历数组
					System.out.println("序号\t历史积分\t新年积分");
					for(int row=0;row<fen[0].length;row++) {
						System.out.print(row+1);
						for(int col=0;col<fen.length;col++) {
							System.out.print("\t"+fen[col][row]);
						}System.out.println();
					}
					sc.close();
				}
			
			}

关于二维数组我们平时用的地方不是很多,但是数组我们还是会经常用到的,所以要熟练掌握。

五、冒泡排序

        相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处.同理,即可得到排好序的数组。

			 //数组排序之冒泡排序
			    public class ArrayDemo {
			    public static void main(String[] args) {
			        // 定义一个数组
			        int[] arr = { 24, 69, 80, 57, 13 };
			        System.out.println("排序前:");
			        printArray(arr);
			
			        bubbleSort(arr);
			        System.out.println("排序后:");
			        printArray(arr);
			    // 遍历功能
			    public static void printArray(int[] arr) {
			        System.out.print("[");
			        for (int x = 0; x < arr.length; x++) {
			            if (x == arr.length - 1) {
			                System.out.print(arr[x]);
			            } else {
			                System.out.print(arr[x] + ", ");
			            }
			        }
			        System.out.println("]");
			    }
			
			    //冒泡排序代码
			    public static void bubbleSort(int[] arr){
			        for (int x = 0; x < arr.length-1; x++) {
			            for (int y = 0; y < arr.length-1-x; y++) {
			                if (arr[y] > arr[y + 1]) {
			                    int temp = arr[y];
			                    arr[y] = arr[y + 1];
			                    arr[y + 1] = temp;
			
			                }
			            }
			        }
			    }
			}

程序运行结果
在这里插入图片描述

冒泡排序原理:

        在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。
       在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数)将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

六、Arrays类类概述及其常用方法

针对数组进行操作的工具类。为数组提供了排序,查找等功能。
  • 成员方法
	public static String toString(int[] a):把数组转成字符串<br>
    public static void sort(int[] a):对数组进行排序

代码示例:

		public class ArraysDemo {
		    public static void main(String[] args) {
		        // 定义一个数组
		        int[] arr = { 24, 69, 80, 57, 13 };
		
		        // public static String toString(int[] a) 把数组转成字符串
		        System.out.println("排序前:" + Arrays.toString(arr));
		
		        // public static void sort(int[] a) 对数组进行排序
		        Arrays.sort(arr);//底层是快速排序,了解就可以了
		        System.out.println("排序后:" + Arrays.toString(arr));
		    }
		}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值