明天也有晚霞嘛 发表于 2021-3-19 01:32

Day10——数组

# Day10——数组

## 1、数组

**1. 数组概述:**

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

通常使用**数组下标**来区分或指定每一个**数组元素**,数组下标从0开始(假设一个数组有4个数,那么数组下标就是0、1、2、3)。

   >使用数组避免了定义多个变量的麻烦,并且会让程序变的简单。

**2. 数组的声明、创建**

声明、创建数组格式:

```java
声明:
dataType[] array;//声明一个dataType类型的数组,名称为array
dataType array[];//与1同义,常用于C、C++语言
创建:
array = new dataType;//创建array数组长度为length
声明+创建:
dataType[] array = new dataType;
    //声明并创建一个dataType类型的数组,名称为array,长度为length
```

【例1】:

```java
声明:
int[] nums;//声明整型数组,亦可写作int nums[];    后者为C、C++写法
创建:
nums = new int;//创建长度为10的整型数组(即数组元素有十个)
声明+创建:
int[] nums = new int;// 声明 + 创建一个长度为10的整型数组
```

获取数组长度:数组名.length

数组的元素是通过索引访问的。数组索引从 0 开始,所以索引值从 0 到 (数组名.length-1)。

**3. 内存分析**

Java内存分析:



1. 声明数组,数组会被放在**栈**中,此时数组并没有被真正的创建
2. 创建数组时,数组被放入堆中,此时数组元素还未进行初始化,基本数据类型的数组元素默认值为0,String数组默值认为null

- 三种初始化

1. 静态初始化:

除了用new关键字来创建数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。

    int[] a = {1,2,3};

    2. 动态初始化:   即声明数组后,用new创建数组,并维数组赋值的操作(分开进行)。

    3. 数组的默认初始化:

数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实 例变量同样的方式被隐式初始化。基本数据类型的数组元素默认值为0,String数组默值认为null。

   ### 数组的使用

1. For-Each循环:

   JDK 1.5 引进了一种新的循环类型,被称为 For-Each 循环或者加强型循环,它能在不使用下标的情况下 遍历数组。

   语法格式:

   ```java
   type array = new type;
   //声明并创建一个type型,array数组,长度为length
   for(type element: array){//没有数组下标
           System.out.println(element);//输出element数组的元素
   }
   ```

   在IDEA中【缩写】nums.for = for (type i : nums){}

   其中,nums为数组名,type为数组类型,i为任意名称、代指数组中元素。

2. 数组作为方法的参数:

   【例2】写一个输出数组的方法printArray

   ```java
   public static void printArray(int[] arrays){
       for( i = 0; i < arrays.length; i++ ){
         System.out.println(arrays+" ")
       }
   }
   ```

   或者写做:

   ```java
   public static void printArray(int[] arrays){
       for(int i: array){
         System.out.println(i);
       }
   }
   ```

3. 数组作为返回值:

   【例3】写一个方法反转数组,并让数组作为返回值

   ```java
   public static void main(String[] args) {
       int[] arrays = {1,2,3,4,5};
       int[] a = printRe(arrays);
       //5.反转arrays数组,赋值给a数组
       for(int i: a){
         System.out.print(i+" ");
       }//6.For-Each循环打印出反转后的数组
   }
   public static int[] printRe(int[] arrays){
       //1.返回值为整型数组,所以printRe为数组类型方法,用int[]
       int[] result = new int;
       //2.创建一个,与arrays数组长度相等的数组result用于储存反转后的数组元素
       for (int i = 0; i < arrays.length; i++){
            result = arrays;
       }//3.反转数组元素
       return result;//4.返回反转后的数组
   }
   ```

   若题目条件没有限制,上述代码可简化为:

   ```java
   public static void main(String[] args) {
       int[] arrays = {1,2,3,4,5};
       reserve(arrays);//调用方法reserve()
   }
   public static void reserve(int[] arrays){
       //此方法没有返回值,因使用void类型
       for (int i = arrays.length - 1; i >= 0; i--) {
         System.out.print(arrays+" ");
       }//反转数组并输出
   }
   ```

   

## 2、二维数组

二维数组是特殊的一维数组,其每一个元素都是一个一维数组。

- 二维数组的动态初始化:

```java
type[][] typeName = new type
//二维数组类型为type,名称为typeName,有length1行,length2列
      【例】
int[][] nums = new int
//声明并创建了int类型的二维数组nums,该数组有3行5列
//该二维数组元素从nums到nums共3*5=15个数
```

- 获取数组长度:

nums.length获取的长度是 行数,nums.lenght获取的长度是第i行的元素个数

上述例子中,nums.length = 5;nums.lenght = 3。

- 二维数组的输出:

```java
for (int i = 0; i < arrays.length; i++) {
      for (int j = 0; j < arrays.length; j++) {
          System.out.print(arrays+" ");
      }
      System.out.println();//输入完一行就换行
}
```

## 3、Arrays类

数组的工具类java.util.Arrays,使用之前需要导包即import java.util.Arrays;

输出数组元素:通过 toString 方法,打印数组。

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

【例4】

```java
import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
      int[] a = {1,9,8,3,5,2,7};
      System.out.println(Arrays.toString(a));//打印数组
      Arrays.sort(a);//对数组排序
      System.out.println(Arrays.toString(a));
    }
}//
//
```

## 4、冒泡排序

对于一组数,依次比较相邻两数的大小(1和2,2和3,3和4...),并将较大(小)的数交换到后面,重复执行该组数的(个数-1)次后,就能得到一组顺序(逆序)排列的数列。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),故名“冒泡排序”。

【例5】代码实现:排序一组数

```java
public static void sort(int[] arrays){
    for (int i = 0; i < arrays.length-1; i++) {
      for (int j = 0; j < arrays.length-1; j++) {
            if( arrays > arrays){
                int x = arrays;
                arrays = arrays;
                arrays = x;//5~7行,交换j和j+1的数字的位置
            }
      }
    }
}//内循环用于比较和调位置,外循环用于重复
```

【思考】以上代码,对于任何数组,都要执行( length-1 )^2次,对于本身就是顺序排列(或者调位次数很少就能完成排序)的数组,这样显然很浪费时间。

因此可以引入判断标志flag,在外循环里声明int flag=0,并在内循环的 if 中改变flag的值(flag=1),这样可以判断:

1、如果flag值改变,说明经历了if中的调位(调换位置)过程,说明正在排序,

2、反之,如果flag的值没有改变,说明经历了**完整**的内循环(从头到尾的相邻比较),并没有出现调位过程,即,数组已经排序完毕,可以提前推出排序过程,从而减少不必要的比较过程。

> 这段确实很难理解,我已经尽力描述的通俗易懂了。。。

代码修改后:

```java
public static void sort(int[] arrays){
    for (int i = 0; i < arrays.length-1; i++) {
      int flag = 0;
      for (int j = 0; j < arrays.length-1; j++) {
            if( arrays > arrays){
                int x = arrays;
                arrays = arrays;
                arrays = x;
                flag = 1;
            }
      }
      if(flag == 0){//在内循环完成后判断是否改变了flag的值
            break;//如果flag没有改变,即数组已经排序完毕,退出外循环
      }
    }
}
```

## 稀疏数组(扩展)

[稀疏数组](https://blog.csdn.net/baolingye/article/details/99943083)

fjhscpc 发表于 2021-3-19 01:38

不错的基础教程,正好复习下

明天也有晚霞嘛 发表于 2021-3-19 03:14

fjhscpc 发表于 2021-3-19 01:38
不错的基础教程,正好复习下

感谢支持:loveliness:

CPSAndy 发表于 2021-3-19 06:40

很好的教程!

286179688 发表于 2021-3-19 08:32

{:301_997:}不错不错

rock_guo 发表于 2021-3-19 09:02

C+ 对我来说太难了.python 很合适.python 列表的花式切片也很好用.感谢分享

goodista 发表于 2021-3-19 09:12

一定要坚持,多动手

龙服信仰 发表于 2021-3-19 10:11

Java从入门到入坟/从入门到删库跑路

关注了,学习ing

明天也有晚霞嘛 发表于 2021-3-19 13:45

龙服信仰 发表于 2021-3-19 10:11
Java从入门到入坟/从入门到删库跑路

关注了,学习ing

哈哈哈哈哈哈

PpaPingggg 发表于 2021-3-30 21:28

大佬不更新了吗? 没坚持住??哈哈
页: [1] 2
查看完整版本: Day10——数组