蓝桥杯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();
}
}