1.声明数组
在java中声明数组有两种形式:
- 数组元素类型名[] 数组名;
- 数组元素类型名 数组名 [];
例如:
int[] array;
int array[];
2.初始化数组
按照上例那样声明数组,并不会为数组分配内存,要真正使用数组还要对数组进行初始化,为它分配空间。
可以在声明数组时完成对数组的初始化,对数组进行赋值时,值要用大括号 ‘{}’括起来,此时编译器也会为数组分配内存,形式如下:
int a[] = {1,2,3,4,5,6};
int[] b = {1,2,3,4,5,6};
注意:如果是二维数组,在没有完全初始化的情况下,java会忽略未初始化的单元,直接输出下一个单元。
例:
public class array {
public static void main(String args[]) {
int[][] a1 = {{1,2},{4,5,6}};
for(int i = 0;i < a1.length;i++)
for(int j = 0;j < a1[i].length;j++){
System.out.println(a1[i][j]);
}
System.out.close();
}
}
输出结果如示:
提示:java果真是纯正的面向对象的语言啊,万物皆对象,都可以直接使用二维数组的长度了
也可以使用new运算符为数组分配空间,也可以在分配空间时初始化数组,例:
int[] a = new int[8];//这其实是创建数组,并未初始化,在使用new时,必须显示或者隐示地确定数组的长度,这里是显示确定
int[] a = new int[]{1,2,3,4,5,6,7,8};//这是隐示确定
//当然也可以在声明数组后再对数组进行初始化
int[] b;
b = new int[]{1,2,3};
//不可如下初始化数组
int[] c = new int[3];
c = {1,2,3};//这是错误的,在eclipse中的错误提示是"Array constants can only be used in initializers",即c已经是一个数组常量了,只能在分配空间时对其初始化,要区分c和c[i]
注意:在使用一个数组前必须为其分配内存!
3.操作数组
java中类库中预置了很多对数组进行操作的函数,可以实现对数组的复制,,比较,搜索数组中的元素,对数组进行排序,填充数组等操作,接下来主要介绍上述的操作。
- 复制数组
System.arraycopy(Object arg0, int arg1, Object arg2, int arg3, int arg4);
arg0:源数组的名称
arg1:源数组的起始位置
arg2:目标数组的名称
arg4:要复制的元素个数
例如:
int[] a = new int[]{1,2,3,4,5,6,7,8,9};//必须指定数组长度 啊
int[] b = new int[9];
System.arraycopy(a,0,b,0,a.length);
2.比较数组
比较数组就是检查两个数组是否相同,如果相同,则返回一个true,如果不相同则返回false。
Arrays.equals(Object arg0,Object arg1);
arg0:数组1
arg1:数组2
例如:
System.out.println(Arrays.equals(a,b));
注意:在比较数组时,要引入软件包Arrays,要加上 import java.util.Arrays;
3.搜索数组中的元素
int Arrays.binarySearch(Object arg0,key)
arg0:要查询的数组名
key:要查询的值
如果查询到则返回这个值在数组中的下标,未查询到时则返回一个负值。例如:
Arrays.binarySearch(a,'f')
4.排序数组
Arrays.sort(Object array);
例如:
Arrays.binarySearch(a,2);
5.填充数组
可以用某一个值对数组进行填充,例如:
char[] c = new char[8];
Arrays.fill(c,'*');
上述函数的集合在一起的代码如示:
import java.util.Arrays;
public class array {
public static void main(String args[]) {
int[]a= new int[] {2,3,42,1,34,5,5,232,5};
int[]b= new int[9];
char[] c = new char[8];
System.out.print("c: ");
Arrays.fill(c,'*'); //填充函数
System.out.println(c);
Arrays.sort(a); //排序函数
System.out.print("a: ");
for(int i = 0;i < a.length;i++) {
System.out.print(a[i]);
System.out.print(' ');
}
System.out.print('\n');
System.arraycopy(a,0,b,0,a.length); //复制函数
System.out.print("equals(a,b): "); //比较函数
System.out.println(Arrays.equals(a,b));
System.out.print("binarySearch(a,2): ");//查找函数
System.out.println(Arrays.binarySearch(a,2));
System.out.print("binarySearch(a,5): ");
System.out.println(Arrays.binarySearch(a,5));
System.out.close();
}
}
运行结果如示:
如图所示,可以去验证一下各个函数的功能。
4.动态数组
动态数组即长度可变的数组,在java中较常用的动态数组是ArrayList。ArrayList是javaAPI自带的java.util.ArrayList。例如:
ArrayList al = new ArrayList();
ArrayList是java.util中的类,一般常用的方法有:
add():可以向ArrayList末尾添加元素,也可以在指定位置添加元素
clear():清除所有的元素
clone():进行潜复制,并返回一个这个潜复制的Object对象,课用强制类型转换转换成想要的类型
get():获得指定下标的值
remove():移除制定下标处的值,或者移除某个值(如果有多个这样的值,则移除第一个)
indexOf():返回某个值的下标,如果有多个值的话,则返回第一个的下标
isEmpty():判断是否为空
set():将制定下标设定为某个值
size():返回ArrayList的长度
遍历数组新方法—foreach
foreach语句是从Java1.5开始出现的新特性之一,可用于遍历数组和集合。foreach是for语句的简化版本,foreach不能完全替代for语句,但任何的foreach语句都可以转化为for语句。foreach并不是一个关键字,习惯上将特殊的for语句成为foreach,foreach语句的语法格式如下:
for(type 元素变量x:遍历对象obj){
引用了x的语句;
}
例如:
String[] books = {"aaa","bbb","ccc","ddd"};
for(String book:books){
System.out.println(book);
}
使用ArrayList以及相关方法的代码如下:
public class array {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String args[]) {
ArrayList al0 = new ArrayList();
al0.add("aaa");
al0.add("bbb");
al0.add("ccc");
al0.add("ddd");
Object[] s = al0.toArray(); //toArray()返回的是一个Object对象
System.out.println("al0.size(): " +al0.size());
for(Object book:s) { //foreach语句遍历数组
System.out.println(book);
}
ArrayList al1 = (ArrayList)al0.clone();
System.out.println("al1.size(): " +al1.size());
al1.remove(1); //remove()
for(int i =0;i < al1.size();i++)
System.out.println(al1.get(i));
System.out.println("al1.indexOf(\"aaa\"): " +al1.indexOf("aaa")); //indexOf()
System.out.println("al1.indexOf(\"abc\"): " +al1.indexOf("abc"));
System.out.println("al1.isEmpty(): " +al1.isEmpty()); //isEmpty()
al1.set(1,"bbb"); //set()
System.out.println("al1.get(1): " +al1.get(1)); //get()
System.out.close();
}
}
程序运行结果如示:
5.深入数组
在声明数组的时候,我们会获得数组名,还有各个数组元素的索引(即各个数组元素),但是数组名和数组元素是两个不同的概念。
数组是一种引用数据类型,数组名只是一个引用。数组元素和数组名是内存里分开来存放的。
数组名这个引用(相当于C语言里的指针)要指向了有效地内存区域后才能被使用,才能使用数组名访问数组元素。
数组名作为一个引用类型的变量时存放在栈内存中的;数组元素被存储在堆内存中。
例如:
int[] a; //这时仅在栈内存中定义了一个空引用,未指向任何有效内存
a = new int[5]; // 在动态初始化后,a获得有效内存地址系统为数组在堆内存
//中分配内存,并设置默认值0,可用Syytem.out.println(a)查看地址值