Java:94-103【内存:管理、分配】【数组:作为方法传递、数组的复制】

  • 内存管理
  • 内存分配

package 第五章;
/* Shift+F6选中可以同时改变所有相同数组名、变量名等
  内存管理:
     1.内存是计算机重要原件,临时存储区域,作用是运行程序,编写的程序存放在硬盘里,
       硬盘中的程序不会运行,必须放进内存中才能运行,运行完毕后清空内存
     2.JVM的内存划分为:寄存器、本地方法栈、方法区、堆内存、栈内存
     3.方法区:存储可以运行的class文件【包含方法的信息】
     4.堆内存:存储对象或数组,new来创建的,都存在堆内存
     5.栈内存:方法运行时使用的内存,例如main方法运行,进入方法栈中运行
     注:堆内存中的内容,都有一个使用16进制表示的地址值,并且里面存储的数据都有默认值 
        栈内存存放的是局部变量 (方法内部声明的变量,方法的参数) ,方法运行也在栈中完成
  内存分配:
     1.从上到下-从左到右
     2.分配图如下:
 */
public class Demo4_Array {
    public static void main(String[] args) {
        run();
    }
    public static void run(){
        //使用动态创建数组方式
        int[] arry1 = new int[3];
        System.out.println(arry1[0]); //0
        System.out.println(arry1[1]); //0
        System.out.println(arry1[2]); //0
        System.out.println(arry1); //堆中的地址
        //修改数组中的元素
        arry1[0]=1;
        arry1[2]=3;
        System.out.println(arry1[0]); //1
        System.out.println(arry1[1]); //0
        System.out.println(arry1[2]); //3
        System.out.println(arry1); //堆中的地址

        //第一种:
        int[] arry2 = new int[3];
        System.out.println(arry2[0]); //0
        System.out.println(arry2[1]); //0
        System.out.println(arry2[2]); //0
        System.out.println(arry2); //堆中的地址

        arry2[0]=1;
        arry2[2]=3;
        System.out.println(arry2[0]); //1
        System.out.println(arry2[1]); //0
        System.out.println(arry2[2]); //3
        System.out.println(arry2); //堆中的地址

        System.out.println("================");

        //第二种:
        int[] arr2 = arry1;
        System.out.println(arr2[0]); //1
        System.out.println(arr2[1]); //0
        System.out.println(arr2[2]); //3
        System.out.println(arr2); //堆中的地址

        arr2[0]=1;
        arr2[2]=3;
        System.out.println(arr2[0]); //1
        System.out.println(arr2[1]); //0
        System.out.println(arr2[2]); //3
        System.out.println(arr2); //堆中的地址
    }
}
  • 0
    0
    0
    [I@1b6d3586
    1
    0
    3
    [I@1b6d3586
    0
    0
    0
    [I@4554617c
    1
    0
    3
    [I@4554617c
    ================
    1
    0
    3
    [I@1b6d3586
    1
    0
    3
    [I@1b6d3586
    
    Process finished with exit code 0
    
  • 只有arry1:
  • 第一种:
  • 第二种:

  •  数组作为方法传递
    
        package 第五章;
    /*
      (1)数组作为方法的参数传递------传递的为地址,而不是值
      (2)数组作为方法的返回值:
           1.方法一:求最大值
           2.方法二:求最小值
           3.方法三:最大值、最小值、平均值
     */
    public class Array_Transmit {
        public static void main(String[] args) {
            int[] arr = {17,52,83,48};
            method(arr);
            int max = getMax(arr);
            System.out.println("最大值为:"+max);
            int min = getMin(arr);
            System.out.println("最小值为:"+min);
            int[] a = Method(arr);
            System.out.println("最大值、最小值、平均值为:"+arr);
            //System.out.println("最大值、最小值、平均值为:"+Arrays.toString(a));
            //Arrays表示是数组的操作类,内部含有一个输出所有内容的方法toString
        }
        public static void method(int[] arr){
            System.out.println("数组传递的为地址:"+arr);
        }
        //方法一:m
        public static int getMax(int[] arr){
            int max = arr[0];
            for(int i=1;i<arr.length;i++){
                if(max<arr[i]){
                    max = arr[i];
                }
            }
            return max;
        }
        //方法二:
        public static int getMin(int[] arr){
            int min = arr[0];
            for(int i=1;i<arr.length;i++){
                if(min>arr[i]){
                    min = arr[i];
                }
            }
            return min;
        }
        //方法三:
        public static int[] Method(int[] arr){
            int max = getMax(arr);
            int min = getMin(arr);
            int sum = 0;
            for(int i=0;i<arr.length;i++){
                sum+=arr[i];
            }
            int a = sum/arr.length;
            arr = new int[]{max,min,a};
            return arr;
        }
    }
    
  • 数组传递的为地址:[I@1b6d3586
    最大值为:83
    最小值为:17
    最大值、最小值、平均值为:[I@1b6d3586
  • 数组的复制
    package 第五章;
    /*
      封装方法快捷键:选中要封装的内容,然后Ctrl+Alt+M键
      数组的复制:
         (1)传统方式---采用倒手的动作
         (2)System.arraycopy
             |-----修饰词---------|返回值|--方法名-|----------------------------参数列表----------------------------|
             public static native void arraycopy(Object src, int  srcPos, Object dest, int destPos, int length);
          其中:native是修饰词,表示该方法是一个本地方法【即跟jvm交互的方法】,使用了java代码调用了非java的功能接口
               src:原数组arr1
               srcPos:原数组的起始位置0开始复制
               dest:目标数组arr2
               destPos:目标数组的起始位置
               length:要复制的长度
         (3)Arrays.copyOf
             /----修饰词---/返回值/-方法名/-----------参数列表------------/
             public static int[] copyOf(int[] original, int newLength) {
          其中:original:表示的是要被复制的数组arr1
               newLength:新的长度【如果新的长度比原长度大,则表示扩容;如果新长度比原长度小,则表示缩容】
         注:【数组长度一旦创建声明,在运行期是不可以改变的!】 
            【所谓的扩容实际上指创建一个更大的新数组并将原有数组的内容复制到其中】
     */
    import java.util.Arrays;
    public class Array_Copy {
        public static void main(String[] args) {
            int[] arr1 = {1,2,3,4,5,6};
            System.out.println("传统方式");
            method1(arr1);  //传统方式
            System.out.println("==========================");
            System.out.println("System.arraycopy");
            method2(arr1);
            System.out.println("==========================");
            System.out.println("Arrays.copyOf");
            method3(arr1);
            System.out.println("不定义新数组");
            arr1 = Arrays.copyOf(arr1,arr1.length+5); //不定义新数组,利用arr1指向新数组
            arr1[arr1.length-5] = 5555; //扩容
            arr1[arr1.length-4] = 4444;
            arr1[arr1.length-3] = 3333;
            System.out.println(Arrays.toString(arr1));
        }
    
        public static void method3(int[] arr1) {
            int[] arr2 = Arrays.copyOf(arr1, arr1.length+3); //定义一个新数组扩容3个
            System.out.println("method-3:"+Arrays.toString(arr2));
        }
    
        public static void method2(int[] arr1) {
            int[] arr2 = new int[arr1.length+1];  //System.arraycopy
            System.arraycopy(arr1,0,arr2,0, arr1.length);
            arr2[arr2.length-1]=100; //给最后一个赋值
            System.out.println("method-2:"+Arrays.toString(arr2));
        }
    
        public static void method1(int[] arr1) {
            int[] arr2 = new int[arr1.length+1];
            System.out.println(Arrays.toString(arr1));
            System.out.println(Arrays.toString(arr2));
            System.out.println("==============");
            for(int i = 0; i< arr1.length-1; i++){
                arr2[i]= arr1[i];  //将arr1的元素复制到arr2
            }
            arr2[arr2.length-1]=10; //将arr2最后一个元素赋值
            System.out.println(Arrays.toString(arr1));
            System.out.println("method-1:"+Arrays.toString(arr2));
        }
    }
    
    
传统方式
[1, 2, 3, 4, 5, 6]
[0, 0, 0, 0, 0, 0, 0]
==============
[1, 2, 3, 4, 5, 6]
method-1:[1, 2, 3, 4, 5, 0, 10]
==========================
System.arraycopy
method-2:[1, 2, 3, 4, 5, 6, 100]
==========================
Arrays.copyOf
method-3:[1, 2, 3, 4, 5, 6, 0, 0, 0]
不定义新数组
[1, 2, 3, 4, 5, 6, 5555, 4444, 3333, 0, 0]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值