linkin大话数据结构--数组

  • 数组概述:如何正确理解数组?数组也是一种类型

数组是多个相同类型数据的组合,实现对这些数据的统一管理。数组属引用类型,数组型数据是对象(Object),数组中的每个元素相当于该对象的成员变量数组中的元素可以是任何数据类型,包括基本类型和引用类型。注意了:1,数组元素的类型是唯一的,即一个数组里只能存储一种数据类型的数据,而不能存储多种数据类型的数据。       2,一旦数组的初始化完成,数组的长度将不能改变。

优缺点:查询快,增删慢(链表,查询慢,增删快)

关于数组元素时引用类型看下图就理解底层了:



  • 一维数组声明
维数组的声明方式: type[]  var 或 type  var[]。推荐使用第一种方式,至少我用的是这种。

Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5];    //非法


  • 数组元素的引用

Java中使用关键字 new  创建数组对象,定义并用运算符 new 为之分配空间后,才可以引用数组中的每个元素;数组元素的引用方式:数组名[数组元素下标]。 数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 - n-1;如int a[]=new int[3];  可引用的数组元素为a[0]、a[1]、a[2]。每个数组都有一个属性 length 指明它的长度,例如:a.length 指明数组 a 的长度(元素个数)。数组和循环,和集合差不多的也是2种:

public class Linkin 
{
    public static void main(String[] args) 
    {
        int[] arr = new int[5];
        //for循环
        for(int i = 0;i<arr.length;i++)
        {
            System.out.println(arr[i]);
        }
        //增强的for循环
        for (int i : arr) {
            System.out.println(i);
        }
    }

}

关于上面的第2种,增强的for循环多说几句:一种使用这种增加的for循环,只是来循环迭代数组里面的元素,并不能改变数组元素的值,所以不要对foreach的循环变量赋值。原理:使用foreach来迭代循环数组的时候,foreach中的循环变量相当于一个临时变量,系统会把数组元素依次赋值给这个临时变量,而这个临时变量并不是数组元素,他只是保存了数组元素的值。代码如下:

public class Linkin 
{
    public static void main(String[] args) 
    {
        String[] names = new String[3];
        names[0] = "Linkin";
        names[1] = "park";
        names[2] = "binger";
        //增强的for循环
        for (String name: names) {
            System.out.println(name);//是刚开始的初始化的值
            name = "huhu";//将上面数组的3个元素依次赋值给临时变量
            System.out.println(name);;//临时变量都成了huh了
        }
        System.out.println(names[0]);//还是原来的linkin
    }

}

  • 数组元素的默认初始化
1:静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统来决定需要数组的长度。
int[] arr1 = new int[]{1,2,3};这种有点繁琐的,建议使用后面这种        int[] arr2 = {1,2,3}。

2:动态初始化:初始化时只指定数组的长度,由系统为数组元素分配初始值。int[] arr = new int[5]。

数组元素的默认初始值:

 

  • 多维数组
Java提供了支持多维数组的语法,但是从数组底层的运行机制来讲,Java里面没有多维数组。这个用的也不多,反正记住就好了:二维数组是一维数组,其数组元素是一维数组,三维数组也是一维数组,其数组元素的二维数组,四维数组也是一维数组,其数组元素是三维数组。。。。。
静态初始化:

  intintArray[][] ={{1,2},{2,3},{3,4,5}};

  int intArray1[3][2] = {{1,2},{2,3},{4,5}};   

  //illegal,等号左边不能指定维数

动态初始化:

  int a[][] = new int[4][5];

  int b[][] = new int[3][]

  b[0] = new int[2];

  b[1] = new int[3];

  b[2] = new int[5];

操作数组的工具类:Java.util.Arrays

此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。 具体的方法用的时候查API。

asList(T... a) 返回一个受指定数组支持的固定大小的列表。关于这个方法有必要多说几句:JDK1.6中是这么说的:

  

上面是用了长度可变的参数,并且用了泛型,所以要是引用类型的话,就会分别拆开然后转换到一个list里面去,但是要是是基本类型的话,那么这个基本类型的数组就被当成了一个参数传入了那个list。代码如下:


package tz.web.main;

import java.util.Arrays;
import java.util.List;
public class Linkin
{
	public static void main(String[] args)
	{
		int[] array1 = {1,2,3};
		String[] array2 = {"1","2","3"};
		//基本类型的数组被当成了一个参数,其实他的类型是object
		Object array11 = array1;
		//编译都报错  cannot convert from int[] to Object[]
		//Object[] array12 = array1;
		List<int[]> huhu = Arrays.asList(array1);
		//引用类型的数组被当成了好多个参数,其实他的类型就是object[]的
		Object[] array21 = array2;
		List<String> haha = Arrays.asList(array2);
		System.out.println(huhu);//[[I@5d0c5d0c]
		System.out.println(haha);//[1, 2, 3]
	}
}


copyOf(byte[] original, int newLength) 复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。

sort(short[] a) 对指定的 short 型数组按数字升序进行排序。

sort(T[] a, int fromIndex, int toIndex,Comparator<? super T> c) 根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。



原文地址:https://www.cnblogs.com/LinkinPark/p/5233131.html