Java基础知识每日总结(7)---Java数组

数组

1.简介
数组是一种数据结构,是用来存储同一类型值的集合。数组是通过整型下标来访问其中的值的,如a是一个整型数组,a[i]就是下标为i的整数。
在声明数组时要指出数组的数据类型和数组的名字,如int[] a;,但这只是声明并没有创建数组,创建数组要使用new运算符,因为数组也是对象,如int[] a=new int[10];,数组的长度不要求是常量,可以是变量如i。
下面声明数组的方法是正确的:

int[] a;  //建议使用这种
int a[];
int  []a;

当创建一个数组但没有赋值时,这个数组的所有元素都初始化为该数组数据类型的默认值。
在Java中想要获得数组的长度可以使用array.length,例a.length

2.for each 循环
for each是Java中一种功能很强的循环结构,它可以依次处理数组中的每个元素,语法格式:

for(元素变量x : 遍历对象obj){
   引用了x的Java语句;
}

在这个循环中元素变量x会遍历obj中的每个元素。
如果想打印数组中的所有值,可以使用Arrays类的toString方法,它会返回一个包含数组元素的字符串,这些元素会被放到括号内且被逗号分开。例,

int[] a;	
a=new int[]{1,2,3,4,5,6};
System.out.println(Arrays.toString(a));  //输出[1, 2, 3, 4, 5, 6]

注:Arrays类是java.util类库中的,所以在使用时要在程序最前面加上:import java.util.Arrays;

3.数组初始化和匿名数组
在创建数组时初始化:

int[] a=new int[]{1,2,3,4,5,6};
int[] a={1,2,3,4,5,6};
int[] a;	
a=new int[]{1,2,3,4,5,6};
String[] a= {new String("ma"),new String("ma"),new String("ma")};

创建匿名数组:new int[] {1,2,3,4,5}
Java允许数组长度为0,但数组长度为0和null不同。
数组对象也存放在内存中的堆区,并且数组对象在堆区中是一块连续的内存空间,这其中的每一小块空间都可以存放我们要保存的一个数据(元素)。

4.数组拷贝
在Java中允许将一个数组变量拷贝给另一个数组变量,这时两个变量将指向同一个内存地址。
如果希望将数组中的所有值拷贝到另一个新的数组,可以使用Arrays类的copyOf方法。例,

int[] b;
b=Arrays.copyOf(a, a.length);

此方法的第二个参数是新数组的长度且此长度可以增加,增加后多余的部分按照数据类型的默认值定。若新数组的长度比原数组的长度小,则只取最前面的数据元素。例,

int[] b;
b=Arrays.copyOf(a, 3*a.length);
System.out.println(Arrays.toString(b));  //输出[1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

还有一种数组拷贝的方法是System类库的arraycopy方法。

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

arraycopy方法的第一个参数是拷贝哪个数组,第二个参数是从该数组的哪个位置开始拷贝,第三个参数是拷贝到哪个数组,第四个参数是在哪个位置开始拷贝,第五个参数是复制的大小(此处的大小应<=第一个参数.length-第二个参数)。
两者的区别在于,Arrays.copyOf()不仅仅只是拷贝数组中的元素,在拷贝元素时,会创建一个新的数组对象。而System.arrayCopy只拷贝已经存在数组元素。
其实,Arrays.copyOf()的底层还是调用了System.arrayCopyOf()方法。

public static int[] copyOf(int[] original, int newLength) {
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                   Math.min(original.length, newLength));
        return copy;
    }

5.数组的算法
①数组的比较
Arrays类提供了重载后的equals()方法,用来比较整个数组。此方法中数组相等的条件是元素个数必须相等,且对应位置的元素也相等。例,

int[] a=new int[10];
int[] b=new int[10];
Arrays.fill(a, 6);
Arrays.fill(b, 6);
System.out.println(Arrays.equals(a, b));  //结果是true
b[3]=3;
System.out.println(Arrays.equals(a, b));  //结果是false

上面的例子中使用了Arrays类的fill方法,这个方法的作用十分有限,它的第一个参数是数组名,第二个参数是符合该数组数据类型的值,然后这个值将填满这个数组。
②数组元素的排序
Arrays类的sort方法使用了优化的快速排序算法,效率比较高。例,Arrays.sort(a);
注:这些方法的修饰符为static,所以不需要实例化类对象来调用这些方法,直接使用类名.方法名来调用即可。
③数组元素的查找
Arrays类的binarySearch方法采用二分搜索算法查找值,如果查找成功返回该值的下标,否则返回一个负数值。
binarySearch(数组名,起始下标,终止下标,要查找的值),包含起始下标,不包含终止下标

6.二维数组
二维数组的声明:

int[][] a;  //建议使用这种
int b[][];
int[] c[];

二维数组的初始化:

int[][] a=new int[3][4];
int b[][]=new int[][] {{1,2,3},{2,3,4}};
int[] c[]=new int[][] {{1,2,3},{2,3,4}};
int[][] d=new int[3][];

注:二维数组创建的时候一定要将第一维数组的长度表示出来,如上面第四个表达式,此时第二维数组的长度可以自定义,即可以根据实际情况的变化而变化。

二维数组的遍历输出:

for(int i=0;i<b.length;i++) {
		for(int j=0;j<b[i].length;j++) {
			System.out.println(b[i][j]);
		}
	}

7.字符串转数组
将字符串中的每一个字符取出来组成一个数组,利用java.lang.String类里的toCharArray方法。例,

String s="qwertyuioplkjhgfdsazxcvbnm0123456789";
char[] a=s.toCharArray();
System.out.println(Arrays.toString(a));  //输出[q, w, e, r, t, y, u, i, o, p, l, k, j, h, g, f, d, s, a, z, x, c, v, b, n, m, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

注:java.lang里的所有类和方法都是自动加载到每一个程序里的,不需要用import引入。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值