java修行之路(二)

8.数组

(1)概念
    a、数组是多个相同类型数据的组合,实现对这些数据的统一管理
    b、数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型
    c、数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量
    d、数组一旦初始化,其长度是不可变的
(2)数组的定义
    数组的声明:
    String[] names 或 String names[]     
    初始化:
    a、静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
       new String[]{"xue","chen"};
    b、动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行
        int[] arr = new int[3];
        arr[0] = 3;
        arr[1] = 9;
        arr[2] = 8;
(3)数组的默认值
    a、对于byte,short,int,long 类型的数组而言,默认值为0
    b、对于float double 类型的数组而言,默认值为0.0
    c、对于String 类型的数组而言,默认值为null。(数据类型为引用数据类型)
    d、对于char 类型的数组而言,默认值为空格
    栗子:
    int[] names = new int[3];
    for (int i = 0; i < names.length; i++) {
        System.out.println(names[i]);  // 0 0 0
    }
(4)一维数组的内存结构
   图8-1
注:0x5435为地址名,创建此数组是在堆中开辟空间,初始化后的变量md是此数组地址的引用。

这里写图片描述
图8-1

9.二维数组

(1)静态初始化
    例子:int[][] num = new int[][]{{12},{20},{14}};
(2)动态初始化
    a、int[][] scores = new int[5][6]; //初始化5个组,每个组有6个人
    b、int[][] scores1 = new int[5][];  //   初始化5个组,动态设置每个组里边的人数
       scores1[0] =new int[3];
       scores1[1] =new int[3];
       scores1[2] =new int[4];
       scores1[3] =new int[3];
       scores1[4] =new int[6];
       scores1[5] =new int[8];
(3)二维数组值的设置的及长度
    int[][] scores1 = new int[3][];
    scores1[0] =new int[]{2,5,6};
    //scores1[0][0] = 2;
    //scores1[0][1] = 5;
    //scores1[0][2] = 6;
    a、二维数组的长度 scores1.length
    b、二维数组元素的长度 scores1[0].length
(4)二维数组的循环
    int[][] nums = new int[][]{{1,2,3},{4,5},{6}};
    for (int m = 0; m < nums.length; m++) {
        for (int n = 0; n < nums[m].length; n++) {
            System.out.print(nums[m][n] + " ");
        }
        System.out.println();
    }

10.数组中涉及的常见算法

(1)求数组元素的最大值、最小值、平均数、总和等
    //求数组的最大值
    int[] arr = new int[]{1, 5, -2, 8, -28, 47, 16};
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
        if (max < arr[i]) {
            max = arr[i];
        }
    }
    System.out.println("最大值为:" + max);

   //求数组的最小值
    int[] arr = new int[]{1, 5, -2, 8, -28, 47, 16};
    int  min= arr[0];
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] < min) {
            min = arr[i];
        }
    }
    System.out.println("最小值为:" + min);

    //求数组的和与平均值
    int[] arr = new int[]{1, 5, -2, 8, -28, 47, 16};
    int sum = 0;
    for (int i = 0; i < arr.length ; i++) {
        sum += arr[i];
    }
    int avg = sum / arr.length;
    System.out.println("数组的和为:" + sum +" 平均值为:"+avg);

(2)数组的复制、反转
    //数组的复制 错误示例(下面例子将arr1赋值给arr2,当arr2的值改变时,arr1的值也会发生改变)
    int[] arr1,arr2;
    arr1 = new int[]{1, 5, -2, 8, -28, 47, 16};
    //遍历arr1
    for (int i = 0; i < arr1.length ; i++) {
        System.out.print(arr1[i] + "\t");

    }
    System.out.println();
    arr2 = arr1; //将arr1赋值给arr2
    for (int i = 0; i < arr2.length ; i++) {
        arr2[i] = arr2[i]+1; //改变arr2的值
    }
    //再次遍历arr1
    for (int i = 0; i < arr1.length ; i++) {
        System.out.print(arr1[i] + "\t");  //2  6   -1  9   -27 48  17

    }
    原因:数组其实是空间地址的引用,例子中是将arr2复制了arr1的地址,arr2值的改变就会导致arr1值的改变,然而地址是没有变的。

    //正确示例
    int[] arr1,arr2;
    arr1 = new int[]{1, 5, -2, 8, -28, 47, 16};
    //遍历arr1
    for (int i = 0; i < arr1.length ; i++) {
        System.out.print(arr1[i] + "\t");

    }
    System.out.println();
    arr2 = new int[arr1.length]; //创建新的数组,长度为arr1数组的长度
    for (int i = 0; i < arr2.length ; i++) {
        arr2[i] = arr1[i]+1; //将arr1的值赋给arr2,
    }
    //再次遍历arr1
    for (int i = 0; i < arr1.length ; i++) {
        System.out.print(arr1[i] + "\t");

    }
    System.out.println();
    //数组的反转
    int[] arr1 = new int[]{1, 5, -2, 8, -28, 47, 16};
    or (int i = 0; i < arr1.length /2 ; i++) { //只需循环的次数
        int temp = arr1[i];
        arr1[i] = arr1[arr1.length - 1 -i]; //后面的值给前面的
        arr1[arr1.length - 1 -i] = temp;  //前面的值赋给后面的
    }
    for (int i = 0; i < arr1.length ; i++) {
        System.out.print(arr1[i] + "\t");  // 16    47  -28 8   -2  5   1
    }

(3)数组的排序
   //冒泡排序
   int[] arr = new int[]{1, 58, 6, 4, 25, -15, 3};
   for (int i = 0; i < arr.length - 1; i++) {
        for (int j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j + 1] < arr[j]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + "\t");

    }
    具体原理参照 http://blog.csdn.net/jianyuerensheng/article/details/51254271

    //使用Arrays类的方法
    import java.util.Arrays;
    Arrays.sort(arr);
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + "\t");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值