java数组

数组的定义

  • 数组是相同类型数据的有序集合。

  • 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。

  • 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。


数组声明创建

  • 首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语句:

数据类型[] 数组名; // 首选的方法 数据类型 数组名[]; // 效果相同,但不是首选项方法

  • 数组的元素是通过索引访问的,数组索引从0开始。

  • 获取数组长度:arrays.length

数组初始化:

在内存中创建一个数组,并且向其中赋予一些默认值。

 两种常见的初始化方式:
 1.动态初始化(指定长度)
 2.静态初始化(指定内容)
 
 动态初始化数组的格式:
 数据类型[] 数组名称 = new 数据类型[数组长度];
 静态舒适化数组的格式:
 数据类型[] 数据名称 = new 数据类型[] {元素1,2,3……}
 注:静态初始化数组的长度根据{}中的元素各数决定
 访问数组元素的格式:数组名称[索引值] (ins[3])
 注:索引值从0开始,一直到”数组的长度-1“ 为止。
  数组一旦创建,程序运行期间,长度不可改变。
 使用动态初始化数组的时候,元素拥有默认值,规则如下:
 整数型 0;
 浮点型 0.0;
 字符型 '/u0000'; // 不可见
 布尔型 false;
 引用型 null;
 
 注:起始静态初始化也有默认值只是,系统自动将其替换为{}中的内容

栈和堆

 

  • java 的内存需要划分成为5个部分

  1. 栈(Stack):存放的都是方法中的变量。方法的运行一定要在栈当中运行。 局部变量:方法的参数,或者是方法{}内部的变量。 作用域:一旦超出作用域,立刻从栈内存当中消失。

  2. 堆(Heap):凡是new出来的东西,都在堆当中。

    堆内存里面的东西都有一个内存地址值:16进制, ​ 堆内存里面的数据都有默认值。规则: 整数型 0; 浮点型 0.0; 字符型 '/u0000'; 布尔型 false; 引用型 null;

  3. 方法区(Method Area):存储.class相关信息,包括方法的信息。

  4. 本地方法栈(Native Method Stack):与操作系统相关。

  5. 寄存器(PC Register):与CPU相关

    :方法区中存放的是方法(public static void main(String[] args) ),但要真正的运行要把方法中的信息加载到栈,并且单独为信息(main(String[] args)) 开辟一个单独的内存空间,这个过程叫做“进栈”。栈中的变量(int[] arrayG)通过堆中new出来的代码(new int[4];)的内存地址进行索引。

image-20210415214653141


爱宠28

数组的四个基本特点

  • 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。

  • 其元素必须是相同类型,不允许出现混合类型。

  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型。

  • 数组白能量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于改对象的成员变量。

    数组本身就是对是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。


多维数组

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。 例如:

 int[][] arrays= new int[2][5];
 // 解析:以上二维数组可以看成是一个两行五列的数组。
 // 遍历所有子元素
 int[][] arrays= {{1,2},{3,4},{5,6},{7,8}};
 for (int i = 0; i < arrays.length; i++) {
  for (int j = 0; j <arrays[i].length; j++) {
  System.out.println(arrays[i][j]);
  }
 }

Arrays 类

  • 数组的工具类java.util.Arrays .

  • 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。

  • 查看JDK帮助文档。

  • Arrays 类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,儿“不用”使用对象来调用(注意:不是“不能”。)

具有以下功能:

  • 给数组赋值:通过 fill 方法。

  • 对数组排序:通过 sort 方法,按升序。

  • 比较数组:通过 equals 方法比较数组中元素值是否相等。

  • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。

 int[] a = {2,4,5,778,3,32,5};
 int[] b = {2,4,5,778,4,32,5};
 Arrays.sort(a);// 数组进行排序:升序
 System.out.println(Arrays.toString(a));
 // [2, 3, 4, 5, 5, 32, 778]
 Arrays.fill(a,2,4,0); // 下标为 [2]到[4] 区间的被 0 替换
 System.out.println(Arrays.toString(a));
 // [2, 3, 0, 0, 5, 32, 778]
 Arrays.fill(a,0); // 全部替换为 0
 System.out.println(Arrays.toString(a));
 // [0, 0, 0, 0, 0, 0, 0]
 System.out.println(Arrays.equals(a,b)); // 判断两个数组的数据类型,返回值 布尔型
 System.out.println(Arrays.binarySearch(b,5)); // 通过key查找到元素下标

冒泡排序

  • 冒泡排序是最为出名的排序算法之一,总共有八大排序

  • java 代码实现:

     public static void main(String[] args) {
  int[] c = {6, 3, 1, 8, 4, 9, 2, 0};
  int[] mao = mao(c);
  System.out.println(Arrays.toString(mao));
  }
  public static int[] mao(int[] array) {
  // 外层循环控制程序走多少次
  int tmp = 0;
  for (int i = 0; i < array.length - 1; i++) {
  boolean falg = false; // 通过flag标志位减少没有意义的比较,优化代码
  // 内层循环比大小,比较判断两个数,如果第一个数,比第二个数大/小则交换位置
  for (int j = 0; j < array.length - 1 - i; j++) {
  // "-i" 是第i次之后,已经产生了i个最大或最小值,不需要再进行比较
  if (array[j + 1] < array[j]) {
  tmp = array[j];
  array[j] = array[j + 1];
  array[j + 1] = tmp;
  falg = true;
  }
  }
  if (falg == false) {
  break;
  }
  }
  return array;
  }

稀疏数组

  • 稀疏数组可以简单的看作为是压缩,在开发中也会使用到。比如将数据序列化到磁盘上,减少数据量,在IO过程中提高效率等等。

  • 为什么要进行压缩?

    -由于稀疏矩阵中存在大量的“空”值,占据了大量的存储空间,而真正有用的数据却少之又少

    -且在计算时浪费资源,所以要进行压缩存储以节省存储空间和计算方便。

     public static void main(String[] args) {
  int[][] a = new int[10][11];
  a[2][3] = 5;
  a[3][4] = 7;
  a[4][6] = 3;
 
  for (int[] ints : a) {
  for (int anInt : ints) {
  System.out.print(anInt);
  }
  System.out.println();
  }
  /*
 00000000000
 00000000000
 00050000000
 00007000000
 00000030000
 00000000000
 00000000000
 00000000000
 00000000000
 00000000000
  */
  System.out.println("-----》 二维数组转稀疏数组");
  int sum = 0;
  for (int i = 0; i < a.length; i++) {
  for (int j = 0; j < a.length; j++) {
  if (a[i][j] != 0) {
  sum++;
  }
  }
  }
  // 创建稀疏数组
  int[][] ints = new int[sum+1][3];
  // 给稀疏数组赋值
  ints[0][0] = 10;
  ints[0][1] = 11;
  ints[0][2] = sum;
 
  // 将非零的数放入数
  // count 标记第几个数非零
  int count = 0;
  for (int i = 0; i < a.length; i++) {
  for (int j = 0; j < a[i].length; j++) {
  if (a[i][j]!=0){
  count++;
  ints[count][0] = i;
  ints[count][1] = j;
  ints[count][2] = a[i][j];
  }
  }
  }
  for (int i = 0; i < ints.length; i++) {
  System.out.println(ints[i][0]+"\t"+ints[i][1]+"\t"+ints[i][2]);
  }
  /*
  稀疏数组:
  10 11 3
  2 3 5
  3 4 7
  4 6 3
  */
  System.out.println("-----》 稀疏数组转二维数组");
  // 创建读取稀疏数组
  int[][] ints1 = new int[ints[0][0]][ints[0][1]];
  for (int i = 1; i < ints.length; i++) {
  ints1[ints[i][0]][ints[i][1]] = ints[i][2];
  }
  for (int[] ints2 : ints1) {
  for (int anInt : ints2) {
  System.out.print(anInt);
  }
  System.out.println();
  /*
 00000000000
 00000000000
 00050000000
 00007000000
 00000030000
 00000000000
 00000000000
 00000000000
 00000000000
 00000000000
  */
  }
  }

 

posted @ 2021-04-19 19:41  C_Long  阅读(149)  评论(0)    收藏  举报