Java数组的基本操作

  1. 数组的长度时固定的,集合的长度是可变的,

  2. 数组用来存放基本类型数据,集合用来存放对象的引用,

  3. 常用的集合有List集合、Set集合和Map集合,其中List与Set继承了Collection接口,各接口还提供了不同的实现类。

数组的初始化

大致分为两种:静态初始化动态初始化

  1. 动态初始化格式:
    数据类型 [ ] 数组名称 = new 数据类型[数组长度]
  2. 静态初始化格式:
    数据类型 [ ] 数组名称 = new 数据类型[ ]{元素1,元素2,元素3…}
  3. 静态初始化省略格式:
    数据类型 [ ] 数组名称 = {元素1,元素2,元素3…}

其中,数据类型可以是8种基本的数据类型,也可以是引用数据类型

数据类型默认初始化
byte、short、int、long0
foat、double0.0
char一个空字符,即 ‘\u0000’
booleanfalse
引用数据类型null,表示变量不引用任何对象

注意:

  1. 通过数组下标索取来取得元素,下标默认从0开始。数组下标超出数组长度,数组越界异常(运行时异常)。

  2. 数组属于引用数据类型,在使用之前一定要开辟空间(实例化),否则就会产生”NullPoninterException”。

  3. 同一块堆内存空间可以被不同的栈内存所指向。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class Study02{
    public static void main(String[] args){
    int[] arr = new null;
    int[] temp = null; // 声明对象
    arr = new int[3]; // 开辟一个长度为3的数组
    System.out.println(arr.length);
    arr[0] = 1; // 数组第一个元素
    arr[1] = 2; // 数组第二个元素
    arr[2] = 3; // 数组第三个元素
    for(int i = 0; i < arr.length; i++)
    {
    //通过循环控制索引下标更改
    System.out.println(arr[i]);
    }
    temp = arr; // 发生引用传递,不能出现[]
    temp[0] = 55; // 修改数据
    System.out.println(arr[0]);
    }
    }

数组的遍历

通常可以使用for循环。在不需要对数组进行操作的情况下,使用foreach语句会更简单。

1
2
3
// type:数据类型; var:变量名; iterable:数组的变量名
for (type var : iterable) {
}

数组元素替换

可通过Arrays类的静态方法fill()来对数组中的元素进行替换。该方法通过各种重载形式可完成对任意类型的数组元素的替换。fill()方法有两种参数类型。

  1. fill(int[ ]a,int value)

    该方法可将指定的int值分配给int型数组的每一个元素

    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {
    int[]arr=new int[5];
    Arrays.fill(arr, 6);
    for (int i = 0; i < arr.length; i++) {
    System.out.println("第"+i+"个元素是:"+arr[i]);
    }
    }

    输出:

    1
    2
    3
    4
    5
    第0个元素是:6
    第1个元素是:6
    第2个元素是:6
    第3个元素是:6
    第4个元素是:6
  2. fill(int []a, int fromIndex, int toIndex, int val)

    该方法将指定的int值分配给int型数组指定范围中的每个元素。填充的范围从索引fromIndex(包括)一直到索引toIndex(不包括)。如果fromIndex==toIndex,则填充范围为空。

    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {
    int arr[]=new int[]{1,2,3,4};
    Arrays.fill(arr, 1, 2, 5);
    for (int i = 0; i < arr.length; i++) {
    System.out.println("第"+i+"个元素是"+arr[i]);
    }
    }

    输出:

    1
    2
    3
    4
    第0个元素是1
    第1个元素是5
    第2个元素是3
    第3个元素是4

    如果指定的索引位置大于或等于要进行填充的数组的长度,则会报ArrayIndexOutOfBoundsException(数组越界异常)异常。

数组排序

通过Arrays类的静态sort()方法可以实现对数组的排序。sort方法提供了多种重载形式,可对任意类型的数组进行升序排序。

1
2
3
4
5
6
7
public static void main(String[] args) {
int arr[]=new int[] {1,5,3,9,8};
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}

复制数组

Arrays类的copyOf()方法与copyOfRange()方法可以实现对数组的复制。

copyOf()方法是复制数组至指定长度。copyOfRange()方法是将指定数组的指定长度复制到一个新数组中。

  1. copyOf()

    该方法提供了多种重载形式,用于满足不同类型数组的复制

    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {
    int arr[]=new int[] {1,2,3};
    int newArr[]=Arrays.copyOf(arr, 5);
    for (int i = 0; i < newArr.length; i++) {
    System.out.println(newArr[i]);
    }
    }

    输出:

    1
    2
    3
    4
    5
    1
    2
    3
    0
    0
  2. copyOfRange()

    多种重载

    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {
    int arr[]=new int[] {1,2,3,4,5,6};
    int newArr[]=Arrays.copyOfRange(arr, 0, 3);
    for (int i = 0; i < newArr.length; i++) {
    System.out.println(newArr[i]);
    }
    }

数组查询(搜索)

Arrays类的binarySearch()方法,可使用二分搜索法来搜索指定数组 ,以获得指定对象。该方法返回要搜索元素的索引值。binarySearch()方法提供了多种重载形式,用于满足各种类型数组的查找需要。binarySearch()方法有两种参数类型。

  1. binarySearch(Object [ ],Object key)

    1
    2
    3
    4
    5
    6
    public static void main(String[] args) {
    int arr[]=new int[] {4,25,10};
    Arrays.sort(arr); // 注意此处进行了排序操作
    int index=Arrays.binarySearch(arr, 0,1,8);
    System.out.println(index);
    }

    输出:

    1
    -2

    上面的代码中变量index的值是元素8在数组arr中索引在0~1内的索引位置。由于在指定的范围内并不存在元素8,index的值是“-”(插入点)。如果对数组进行排序,元素8应该在25的前面,因此插入点应是元素25的索引值2,所以index的值是-2。

    如果数组中的所有元素都小于指定的键,则为arr.length。

    必须在进行此调用之前对数组进行排序(通过sort()方法)。如果没有对数组进行排序,则结果是不确定的。如果数组包含多个带有指定索引值的元素,则无法保证找到的是哪一个。

  2. binarySearch(Object [ ],int fromIndex,int toIndex,Object key)

    该方法在指定的范围内检索某一元素。

    1
    2
    3
    4
    5
    6
    public static void main(String[] args) {
    String str[]=new String[] {"ab","cd","ef","yz"};
    Arrays.sort(str);
    int index=Arrays.binarySearch(str, "cd");
    System.out.println("cd的索引位置是:"+index);
    }

    输出:

    1
    cd的索引位置是:1

    在使用此方法之前同样对数组进行排序,来获取准确的索引值。如果要搜索的元素key在指定的范围内,则返回搜索键的索引;否则返回-1或“-”(插入点)。如果范围中的所有元素都小于指定的键,则为toIndex。

    如果指定的范围大于或等于数组的长度,则会报出ArrayIndexOutOfBoundsException异常。

向数组添加元素

一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度。

  1. 声明为ArrayList

    定义一个ArrayList数组,然后用add(element)方法往里添加元素即可,还可add(index,element)往指定下标处添加元素。

    1
    List<Integer> list=new ArrayList<Integer>();
  2. 先把array转化为list,用list的add()方法添加元素,再把list转化为array

    这儿会有一个陷阱盲区,在把array转化为list的过程中,使用的asList()方法会返回一个final的,固定长度的ArrayList类,并不是java.util.ArrayList,直接这样利用它进行add()或remove()是无效的。

    1
    2
    3
    List<Integer> list=new ArrayList<Integer>();
    list=Arrays.asList(sz);
    list.add(5);

    这里应该在定义list的时候就直接对array进行转化,代码如下:
    (注意这儿Array类型是包装类,若是一般数据类型记得转化)

    1
    2
    3
    4
    5
    6
    Integer []sz={3,2};
    List<Integer> list=new ArrayList(Arrays.asList(sz));//**须定义时就进行转化**
    list.add(1,5);
    Integer[] nsz=new Integer[list.size()];
    list.toArray(nsz);
    System.out.println(Arrays.toString(nsz));
  3. 使用上面所说的copyOf()方法,新元素的大小为旧元素的大小+1,再在新元素里添加即可。

参考链接

  1. 下雨听风:JAVA中数组的初始化
  2. lemon_fightJava中数组的定义及初始化
  3. 跟着BOSS有肉吃Java数组的基本操作
  4. hepburnsJava中集合类和数组的区别

土豪将鼓励我继续创作和搬运!