zoukankan      html  css  js  c++  java
  • Java编程基础——数组和二维数组

    Java编程基础——数组和二维数组

    摘要:本文主要对数组和二维数组进行简要介绍。

    数组

    定义

    数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器。

    数组是一种引用类型,用于保存一组相同类型的数据。

    数组定义的类型可以为任意类型,意思是我们可以定义int类型的数组,也可以定义String类型的数组,或其他任何类型的数组。

    数组实际在内存的存储和基本类型不同,实际上是在堆中申请空间保存一组数,栈中只是有一个地址的引用

    声明数组

    语法:

    1 类型[] 数组名;
    2 类型 数组名[];

    举例:

    1 int[] sum;
    2 int color[];

    说明:

    此时只是声明了一个数组变量,并没有在内存中开辟空间。

    开辟空间

    语法:

    1 数组名 = new 类型[长度];

    举例:

    1 sum = new int[5];

    说明:

    数组开辟空间时,必须要设置开辟的空间长度。

    这时会根据类型对数组里的数据设置默认值。

    数组赋值

    语法:

    1 数组名[下标] = 值;

    举例:

    1 sum[0] = 10;

    说明:

    在对数组进行赋值时,注意下标不要超过数组的长度范围,否则会产生错误。

    使用数组

    语法:

    1 数组名[下标]

    举例:

    1 System.out.println(sum[0]);

    说明:

    同样需要注意下标不要超过数组的长度范围。

    其他赋值方式

    除了上面通过下标赋值,还可以在声明时开辟空间并赋值,或者在开辟空间时赋值。

    语法:

    1 数组名 = new 类型[]{值, 值};
    2 类型[] 数组名 = {值, 值};

    举例:

    1 int[] sum = {1, 2};
    2 sum = new int[]{1, 2, 3};

    说明:

    这两种方式都需要在确定数组大小和值的内容的时候使用。

    在开辟空间时赋值,不需要在中括号里面填写数组长度。

    注意

    数组不赋值也有默认值。

    数组中每个元素的赋值和访问都是通过“数组名[下标]”实现的,不能直接使用数组名。

    “数组名.length”代表的是数组的长度,经常用在循环中,提高代码的维护性。

    数组的下标从 0  ~  数组名.length - 1 ,如果不是这个范围,会导致一个数组下标越界的异常:ArrayIndexOutOfBoundsException。

    数组没有开辟空间,直接使用,会导致一个空指针异常:NullPointerException。

    进阶使用

    数组的复制

    ◆ 引用类型的赋值:复制的是一个地址号,二者共同引用一个地址,其中一个对数组做了更改,都会影响另一个。

    ◆ 基本类型的赋值:复制的是数值内容,实际上是一个备份,其中一个对它更改,不会影响另一个。

    复制引用地址:

    复制的是一个地址号,二者共同引用一个地址,其中一个对数组做了更改,都会影响另一个。

    1 int[] a1 = {1, 2, 3};
    2 int[] a2;
    3 a2 = a1;
    4 System.out.println(a2[0]);
    5 a1[0] = 100;
    6 System.out.println(a2[0]);

    结果:

    1 1
    2 100

    复制数组数据:

    1 int[] a1={1, 7, 8};
    2 int[] a2 = new int[a1.length];
    3 for (int i = 0; i < a1.length; i++) {
    4     a2[i] = a1[i];
    5 }
    6 System.out.println(a2[0]);
    7 a2[1]=100;
    8 System.out.println(a2[0]);

    结果:

    1 1
    2 1

    数组的排序

     1 int[] nums = {1, 9, 3, 5, 2, 8, 4};
     2 for(int i = 0; i < nums.length - 1; i++) {// 控制轮数
     3     for(int j = 0; j < nums.length - 1 - i; j++) {
     4         if (nums[j] < nums[j + 1]) {// 交换
     5             int temp = nums[j];
     6             nums[j] = nums[j + 1];
     7             nums[j + 1] = temp;
     8         }
     9     }
    10 }

    数组的倒置

    1 int[] nums = {1, 9, 3, 5, 2, 8, 4};
    2 for(int i = 0; i < nums.length / 2; i++) {
    3     int temp = nums[i];
    4     nums[i] = nums[nums.length - 1 - i];
    5     nums[nums.length - 1 - i] = temp;
    6 }

    工具类

    排序: Arrays.sort(nums); 

    填充: Arrays.fill(nums, 1); 

    转成字符串以便打印: Arrays.toString(nums); 

    比较: Arrays.equals(a1, a2); 

    二维数组

    定义

    二维数组可以看做是一个数组,里面存放的元素是一维数组。

    声明数组

    1 int[][] nums;
    2 int nums[][];
    3 int[] nums[];

    开辟空间

    1 nums = new int[3][];// 行固定,列不固定。
    2 nums = new int[3][2];// 行固定,列固定。

    数组赋值

    动态初始化,使用时赋值,需要指明行和列:

    1 nums[0][1] = 1;

    静态初始化,声明时赋值,不必也不能指明行和列,否则会提示错误:

    1 int[][] nums = new int[][]{{1}, {9, 3, 5, 2}, {7, 6}};
    2 int[][] nums = {{1}, {9, 3, 5, 2}, {7, 6}};

    注意

    如果在动态初始化时明确了二维数组的行数和列数,那么一维数组的长度就是固定的列数。

    如果在动态初始化时仅仅明确了行数,或者通过静态初始化赋值,那么一维数组可以有不同的长度。

    数组排序

    冒泡排序

    思路

    属于交换排序。

    从第一个元素开始,比较两个相邻的元素,如果两个元素位置不正确,则进行交换,否则继续比较下面相邻的两个元素。

    代码

     1 public void test() {
     2     int[] arr = new int[]{1, 7, 3, 8, 5};
     3     int len = arr.length;
     4     for (int i = 0; i < len - 1; i++) {
     5         for (int j = 0; j < len - i - 1; j++) {
     6             if (arr[j] > arr[j + 1]) {
     7                 int temp = arr[j];
     8                 arr[j] = arr[j + 1];
     9                 arr[j + 1] = temp;
    10             }
    11         }
    12     }
    13     for (int i = 0; i < arr.length; i++) {
    14         System.out.println(arr[i]);
    15     }
    16 }

    快速排序

    思路

    属于交换排序。

    任取序列的某个元素作为界点,将序列分为两个子序列,左子序列的元素小于界点,右子序列的元素大于界点,然后递归每个子序列,直到每个子序列只有一个元素。

    代码

     1 public void test() {
     2     int[] arr = new int[]{8, 3, 11, 4, 9, 5, 1};
     3     sort(0, arr.length - 1, arr);
     4     for (int i = 0; i < arr.length; i++) {
     5         System.out.println(arr[i]);
     6     }
     7 }
     8 public void sort(int left, int right, int[] arr){
     9     int l = left;
    10     int r = right;
    11     int pivot = arr[(left + right)/2];//找中间值
    12     int temp = 0;
    13     while(l < r){
    14         while(arr[l] < pivot) l++;
    15         while(arr[r] > pivot) r--;
    16         if(l >= r) break;
    17         temp = arr[l];
    18         arr[l] = arr[r];
    19         arr[r] = temp;
    20         if(arr[l] == pivot) --r;
    21         if(arr[r] == pivot) ++l;
    22     }
    23     if(l == r){
    24         l++;
    25         r--;
    26     }
    27     if(left < r) sort(left, r, arr);
    28     if(right > l) sort(l, right, arr);
    29 }

    直接选择排序

    思路

    属于选择排序。

    每次都选取最小值放在起始位上,一共通过n-1次。

    代码

     1 public void test() {
     2     int[] arr = new int[]{3, 2, 6, 10, 1, 9, 8};
     3     for (int i = 0; i < arr.length - 1; i++) {
     4         int index = i;
     5         for (int j = i + 1; j < arr.length; j++) {
     6             if (arr[index] > arr[j]) {
     7                 index = j;
     8             }
     9         }
    10         int temp = arr[i];
    11         arr[i] = arr[index];
    12         arr[index] = temp;
    13     }
    14     for (int i = 0; i < arr.length; i++) {
    15         System.out.println(arr[i]);
    16     }
    17 }
  • 相关阅读:
    你不知道的javascript -- 数据类型
    draft.js开发富文本编辑器
    webpack4配置react开发环境
    使用yarn代替npm
    promise基础和进阶
    express route的写法
    理解es6箭头函数
    Mocha测试
    js 实现继承
    Unity3D使用经验总结 缺点篇
  • 原文地址:https://www.cnblogs.com/shamao/p/10109777.html
Copyright © 2011-2022 走看看