Java 数组

143 阅读4分钟

数组概念

       数组是相同类型数据的有序集合。其中每个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。

基本特点

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

    2. 其元素的类型必须是相同类型。 

    3. 数组类型可以是任何数据类型,包括基本类型和引用类型。

    4. 数组变量属于引用类型,数组也是对象,数组中的元素相当于对象的属性;

创建数组和初始化 

      数组声明方式 (以 一维数组 为例)

    type[] arr_name;
    type arr_name[]; 

注意事项:

  1. 声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM 才分配空间,这时才与长度有关。

  2. 声明一个数组的时候并没有数组真正被创建。

  3. 构造一个数组,必须指定长度。

初始化

数组的初始化方式总共有三种: 静态初始化、动态初始化、默认初始化 ;

  1. 静态初始化,除了用new 关键字来产生数组以外,还可以直接在定义数组的同时为数组元素分配空间并赋值。 `

    int[] a = { 10,20,30,40};

  2. 动态初始化 数组定义与为数组元素分配空间并赋值的操作分开进行;

  3. 数组的默认初始化 数组是引用类型,它的元素相当于类的实例属性,因此数组一经分配空间,其中的每个元素也就被按照实例变量同样的方式被隐式初始化。

数组的常用操作

数组的遍历

数组元素下表的合法区间: [0,length -1] ,我们可以通过下标来遍历数组中的元素,遍历时可以读取元素的值或者修改元素的值。

for-each循环

for-each 专门用于读取数组或集中所有的元素。

注意事项

  1. for-each 增强for 循环在遍历数组过程中不能修改数组中某元素的值;

  2. for-each 仅适用于遍历,不涉及有关索引(下标)的操作。

数组的拷贝

 System.arrayCopy(object stc,int srcpos,object dest,int destpos,int length) 

该方法可以将src数组里的元素值赋给dest 数组的元素,其中srcpos指定从数组的第几个元素开始赋值,length参数指定将src数组的多少个元素给dest数组的第几个元素开始赋值。

多维数组

多维数组可以看称以数组为元素的数组,可以有二维、三维、甚至更多维数组,但实际上开发中用的非常少。最多到而二维数组 (学习容器后,我们一般使用容器)

Comparable 接口 (定义比较策略

多个对象做比较,就要有比较 规则,然后实现排序;

事实上,java中排序算法的底层页依赖COmparable接口

Comparable接口只有一个方法:

 public int compareTo(Object o)   // o为要比较的对象

被比较或排序的对象类实现该接口,按照自己的排序规则;

compareTo 方法的代码也比较固定

public int compareTo(Object o) {
    Man man = (Man) o; 
    if(this.age < man.age) return -1; 
    if(this.age > man.age) return 1; return 0; 
}

常见算法

冒泡排序的基础算法

冒泡排序算法重复的走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端;

  1. 比较相邻的元素,如果第一个比第二个大,就交换他们两个;

  2. 对每个相邻元素作同样的工作,从开始第一对到结尾的最后一对。最后的元素应该会时最大的数

  3. 针对所有的元素重复以上的步骤,除了最后一个;

  4. 持续每次堆越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    public static void maopao(int[] _arr) { int temp; for (int i = 0; i < _arr.length; i++) { boolean flag = true; for (int j = 0; j < _arr.length - 1 - i; j++) { if (_arr[j] > _arr[j + 1]) { temp = _arr[j]; _arr[j] = _arr[j + 1]; _arr[j + 1] = temp; flag = false; } } if (flag) { break; } } }

二分法查找

二分法检索 又称折半检索。

基本思想是设数组中的元素从小到大有序地存放在数组中,首先将给定值key与数组中间位置上元素的关键码比较,如果相等,则检索成功;

否则,若key小,则在数组前半部分继续进行二分法检索;

若key大,则在数组后半部分继续进行二分法检索; 这样经过一次比较就缩小一般的检索区间,直到成功或失败;

二分法检索是一种效率较高的检索方法;

public static int binarySearch(int[] arr, int value) {
   int low = 0;
   int high = arr.length - 1; 
   while (low <= high) {
      int middle = (low + high) / 2; 
      System.out.println(middle + "middle===="); 
      if (value == arr[middle]) { return middle; } 
      if (value > arr[middle]) { low = middle + 1; }
      if (value < arr[middle]) { high = middle - 1; } 
   } 
   return -1;
 }