java数组

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中类库中预置了很多对数组进行操作的函数,可以实现对数组的复制,,比较,搜索数组中的元素,对数组进行排序,填充数组等操作,接下来主要介绍上述的操作。

  1. 复制数组
    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)查看地址值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值