关于数组的一些问题的讨论

本文详细介绍了Java中的数组,包括其作为数据结构的定义、特性、声明方式、存储方式、操作方法如增删改查,以及数组的使用中可能遇到的异常如空指针和下标越界。文章还讨论了数组的传递、传值与传址的区别,并展示了数组复制的示例代码。此外,提到了二维数组的声明和使用,以及变量交换的几种方法。
摘要由CSDN通过智能技术生成

1、数组

引用数据类型

定义:用来保存多个数据

1.1 数据结构

定义:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

操作:增删改查

1.2 数组特性

内存中连续存储,并且下标从0开始

数组长度一旦确定 长度不能更改 也就意味着数组不能添加和删除

除非新建一个数组 ,把原来数据复制到新数组中,在复制过程中可以进行添加和删除操作

所以数组的查询和更改 效率很高 但是添加和删除效率很低

数组有一个内置属性 length 保存了数组的长度

在Java中有一个java.util.arrays类 提供了一些数据操作

1.3 数组声明

1 静态声明:在已知每个元素是什么的时候,使用静态声明

——数据类型 变量名=值;

——int i =2;

数据类型[] 变量名 ={值,值,值};简写方式

数据类型[] 变量名=new 数据类型[]{值,值,值};比如对数组进行二次赋值,就需要这样写

——int [] arr={1,1,1,122,0};

——int [][] arr={

               {1,1,2} {2,5,6}       };

2 动态声明:不知道数组中每个元素的时候,使用动态声明

数据类型[]变量名=new 数据类型[长度];

int[] arr=new int [5];

int[][] arr=new int[2][3];

动态声明,保存的是对应类型的默认值比如下面程序中  会保存五个0

整数  0  小数 0.0,  布尔  false, 字符\u0000, 引用类型 null  

例如

 

1.4存储方式

 

 

1.5数组使用

1.4.1获取数据

 

1.5.2更改数据

 

1.5.3遍历

 

1.5.4常见异常

1、空指针

 

 

2、下标越界

 

 

1.5.5数组传递

 

1.5.6Main方法传参

 

 

1.6 传值和传址

1、传值  指的是传递基本类型的值,相互不影响,因为指向不同的空间

 2、传址/传引用 指的是传递引用类型的值 ,相互有影响,指的是同一堆内存对象空间

 

1.7 数组复制

 

public static void main(String[] args) {

                  int[] src = { 2, 3, 4, 5, 6, 7, 8 };

                  int[] dest = { 11, 12, 13, 14, 15, 16, 17, 18 };

                  // int[] dest = { 11, 12, 13, 14,4, 5, 6, 15, 16, 17, 18 };

                  int[] result = copy(src, 2, dest, 3, 3);

                  for (int i = 0; i < result.length; i++) {

                          System.out.println(result[i]);

                  }

         }

         /**

          * 插入复制

          *

          * @param src

          *            源数组

          * @param srcPos

          *            源数组起始位置

          * @param dest

          *            目标数组

          * @param destPos

          *            目标数组起始位置

          * @param length

          *            插入个数

          * @return

          */

         public static int[] copy(int[] src, int srcPos, int[] dest, int destPos,

                          int length) {

                  // 因为是插入复制,所以肯定会更改数组长度,因为数组长度不能更改,所以我们只能新建数组,并通过返回值把数组返回

                  /**

                   * 0 创建一个新数组,长度为 dest.length + length

                   *

                   * 1 目标数组中 从0开始 到 起始位置结束(包含),复制到新数组中

                   *

                   * 2 源数组中 从起始位置开始(包含) 复制 length个 到 新数组中

                   *

                   * 3 目标数组中 从起始位置+1开始(包含) 到最后 所有的数据 复制到新数组中

                   */

                  // 0 创建一个新数组,长度为 dest.length + length

                  int[] newDest = new int[dest.length + length];

                  // 1 目标数组中 从0开始 到 起始位置结束(包含),复制到新数组中

                  for (int i = 0; i <= destPos; i++) {

                          newDest[i] = dest[i];

                  }

                  // 2 源数组中 从起始位置开始(包含) 复制 length个 到 新数组中

                  // 现在需要用到目标数组的起始位置并且需要更改,但是 后面还要用到目标数组的起始位置,所以我们不能更改

                  // 所以 这里把目标数组起始位置 赋值给一个新变量index,可以更改index

                  int index = destPos;

                  for (int i = srcPos; i < srcPos + length; i++) {

                          index++;

                          newDest[index] = src[i];

                  }

                  // 3 目标数组中 从起始位置+1开始(包含) 到最后 所有的数据 复制到新数组中

                  for (int i = destPos + 1; i < dest.length; i++) {

                          index++;

                          newDest[index] = dest[i];

                  }

                  return newDest;

         }

2.二维数组

2.1声明方式

2.2 存储方式 

 

 2.3  使用方式

2.3.1  获取数据

2.3.2  更改数据

 

2.3.3  遍历

 

2.3.4  动态声明锯齿状

 

 3.  变量的值

int x = 10;

                  int y = 11;

                  // 1 中间变量(开发常用)

                  int temp = x;

                  x = y;

                  y = temp;

                  System.out.println("x=" + x + ",y=" + y);

                  // 2 位移运算(面试用)

                  x = 2; // 0000 0010

                  y = 3; // 0000 0011

                  // 转换为对应的二进制,每位异或,相同取0,不同取1

                  x = x ^ y; // 0000 0001

                  y = x ^ y; // 0000 0010

                  x = x ^ y; // 0000 0011

                  System.out.println("x=" + x + ",y=" + y);

                  // 3 加减运算

                  x = 10;

                  y = 20;

                  x = x + y;

                  y = x - y;

                  x = x - y;

                  System.out.println("x=" + x + ",y=" + y);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值