蓝桥杯JAVA-2.数组操作

蓝桥杯JAVA-2.数组操作


请不要相信胜利就像山坡上的蒲公英一样唾手可得

数组

1.1声明并创建数组

//首选
int[] a=new int[10];
//c/c++形式 效果和上面的相同,不是最佳选择
int aa[]=new int[10];
//创建并初始化
int[] b={2,5,6,54,7};

1.2二维数组

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。

//可以将二维数组看做,每一个元素又是一个一维数组
int[][] arr=new int[2][3];

1.2.1固定空间

int[][] b=new int[5][2];

1.2.2动态分配

//动态分配
        double d[][]=new double[5][2];//double可以替换成其他类型
        d[0]=new double[2];//为最高分配引用空间,为最高限制其保存数据的最长的长度
        d[1]=new double[3];
        d[0][0]=1;
        d[0][1]=2;
        d[1][0]=3;
        d[1][1]=4;
        System.out.println(d[0][0]);
        System.out.println(d[0][1]);
        System.out.println(d[1][0]);
        System.out.println(d[1][1]);

1.3数组的复制

1.数组的clone()方法

源码:***

protected native Object clone() throws CloneNotSupportedException;
/*
看到了修饰符native,说明是由c或者c++实现的,它的优点是速度快,它返回了object对象,所以使用的时候需要用对象接收返回值。native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。
*/

调用:

int[] a={2,4,2,9,1,3,6,5,65,56,4,5,6,5}
int[] b= new int[50];
b = a.clone();
System.out.println(Arrays.toString(b));

输出结果:

//[2, 4, 2, 9, 1, 3, 6, 5, 65, 56, 4, 5, 6, 5]

2.System.arraycopy()方法(重点)

源码:

public static native void arraycopy(Object src,int srcPos,Object dest,int desPos,int length);
   

 /*
 src 源数组 srcPos源数组的下标  
 dest目标数组 desPos目标数组下标
 length 复制数组元素的个数
 */

新的数组多余的会自动补0。且System.arraycopy()比clone()方法快。

使用:

int[] a={2,4,2,9,1,3,6,5,65,56,4,5,6,5};
int[] b = new int[20];
        System.arraycopy(a,0,b,0,10);
        System.out.println(Arrays.toString(b)); //
        
        System.arraycopy(a,0,b,0,a.length);
        System.out.println(Arrays.toString(a)); //
        System.out.println(Arrays.toString(b)); //
        
        System.out.println(b.length);


结果:

/*
[2, 4, 2, 9, 1, 3, 6, 5, 65, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[2, 4, 2, 9, 1, 3, 6, 5, 65, 56, 4, 5, 6, 5]
[2, 4, 2, 9, 1, 3, 6, 5, 65, 56, 4, 5, 6, 5, 0, 0, 0, 0, 0, 0]
20(包括了多余的0,即等于数组开的大小)
*/

3.Arrays类的copyOf()方法和copyOfRange()方法*

1.copyOf()方法:

源码:

public static int[] copyOf(int[] original, int newLength) {
     //original 源数组 newLength新数组长度
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

使用:

int[] a={2,4,2,9,1,3,6,5};
int[] b = new int[303];
        b = Arrays.copyOf(a,5);
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.toString(b));
        
        b = Arrays.copyOf(a,15);
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.toString(b));
        System.out.println(b.length);


结果:

/*
[2, 4, 2, 9, 1, 3, 6, 5]
[2, 4, 2, 9, 1]

[2, 4, 2, 9, 1, 3, 6, 5]
[2, 4, 2, 9, 1, 3, 6, 5, 0, 0, 0, 0, 0, 0, 0]
15(包括了多余的0)
*/

很显然,如果newLength小于源数组的长度,则将源数组的前面若干个元素复制到目标数组。如果newLength大于源数组的长度,则将源数组的所有元素复制到目标数组(这种方式的数组需要注意,见样例)。它在方法内部调用了System.arraycopy(),只是相当于重写了一下,换了一个名字。

2.copyOfRange()方法:

源码:

public static int[] copyOfRange(int[] original, int from, int to) {
     //original 源数组  from指定复制元素在源数组中的起始下标 to结束下标
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        int[] copy = new int[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }

使用:

int[] a={2,4,2,9,1,3,6,5,43,34,2,1};
int[] b = new int[303];
        b = Arrays.copyOfRange(a,1,8);
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.toString(b));

结果:

/*
[2, 4, 2, 9, 1, 3, 6, 5, 43, 34, 2, 1]
[4, 2, 9, 1, 3, 6, 5]
*/

1.4数组的操作

package com.util;

import java.util.Arrays;

public class MyArray {
    //用于存储数据的数组
    //这里存放的是int类型的数据类型 如果希望存放的是任意数据类型可以选这object
    private int[] elements;   

    public MyArray() {
       elements = new int[0];
    }
    //获取数组长度的方法
    public int size(){
        return elements.length;
    }
    //往数组的末尾添加一个元素
    public void add(int element){
        int[] newArr=new int[elements.length+1];
        //把原数据复制中的元素复制到新数组中
        for (int i = 0; i < elements.length; i++) {
            newArr[i]=elements[i];
        }
        //把添加的元素放入新数组中
        newArr[elements.length]=element;
        //使用新数组替换旧数组
        elements=newArr;
    }

    //打印所有元素到控制台
    public void  show(){
        System.out.println(Arrays.toString(elements));
    }

    //删除数组中的元素
    public void delete(int index){
        //判断下表是否越界
        if (index<0||index>elements.length-1){
            throw new RuntimeException("下标越界");
        }
        //创建一个新的数组,长度为原数组长度-1
        int[] newArr = new int[elements.length-1];
        //复制原有数据到新数组
        for (int i = 0; i < newArr.length; i++) {
            //想要删除元素前面的元素
            if (i<index){
                newArr[i]=elements[i];

            }
            else { //想要删除的元素后面的元素
                newArr[i]=elements[i+1];
            }
        }
        //新数组替换旧数组
        elements=newArr;
    }
    //取出指定位置的元素
    public int get(int index){
        return elements[index];
    }

    //插入一个元素到指定位置
    //插入一个元素到指定位置
    public void insert(int index, int element) {
        if (index < 0 || index > elements.length) {
            throw new RuntimeException("Index out of bounds");
        }
        //创建一个新数组
        int[] newArr = new int[elements.length + 1];
        //将原数组的元素放入新数组中
        for (int i = 0; i < index; i++){
            newArr[i] = elements[i];
        }

        //插入新的元素
        newArr[index] = element;
        //将原数组剩余的元素放入新数组中
        for (int i = index; i < elements.length; i++) {
            newArr[i + 1] = elements[i];
        }
        //新数组替换旧数组
        elements = newArr;
    }

    //替换指定位置的元素
    public void set(int index,int element){
        elements[index]=element;
    }
}

测试类:

package com.zxl;

import com.util.MyArray;

public class TestMyArray {
    public static void main(String[] args) {
        //创建一个可变的数组
        MyArray m = new MyArray();
        //获取长度
        int size= m.size();
        System.out.println(size);
        //打印所有元素(未添加元素)
        m.show();
        //往可变数组中添加一个元素
        m.add(99);
        m.add(98);
        m.add(97);
        //显示数组所有元素到控制台
        m.show();
        //删除某个元素
        m.delete(1);
        m.show();
        //取出指定位置的元素
        int element=m.get(1);
        System.out.println(element);
        System.out.println("=======================");
        m.add(90);
        m.add(93);
        m.add(94);
        m.insert(0,92);
        m.show();
        System.out.println("=========================");
        m.set(0,100);
        m.show();
    }
}

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值