Java核心技术第3章(7)

3.10    数组

    数组是一种数据结构,用来存储同一类型值的集合.
    当声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字.如下所示:
int[] a;
    这条语句 只声明了变量a,并没有将a初始化为一个真正的数组.应该使用 new 运算符创建数组:
int[] a = new int[100];
    这条语句创建了一个可以存储100个整数的数组.
    要想 获得数组中的元素个数,可以使用array.length.例如
for (int i = 0; i < a.length; i++)
    System.out.print(a[i]);
 

3.10.1  for each 循环

    Java有一个功能很强的循环结构,可以用来依次处理数组中的每个元素而不必为指定下标值而分心.    这种增强的 for 循环的语句格式为:
for (variable : collection)
    statement;
    定义一个变量用于暂存集合中的每一个元素,并执行相应的语句.collection这一集合表达式必须是一个数组或实现了Iterable接口的类对象.
    例如,
for (int element : a)
    System.out.println(element);
    打印数组a的每一个元素.
    这种循环读作"循环a中的每一个元素"(for each element in a).
    传统的 for 循环也可以获得同样的效果:
for (int i = 0; i < a.length; i++)
    System.out.println(a[i]);

3.10.2  数组初始化以及匿名数组

    在Java中,提供了一种创建数组对象并同时赋予初始值的简化书写方式.如下所示:
int[]  smallPrimes = {2, 3, 5, 1};
    注意,在使用这种语句时,不需要调用 new .
    甚至还可以初始化一个匿名的数组:
new int[] {1, 3, 5, 7}
    这种表示法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数.使用这种语法形式可以在不创建变量的情况下重新初始化一个数组.例如:
smallPrimes = new int[] {1, 3, 5, 7};
    这是下列语句的简写形式:
int[] anonymous = {1, 3, 5, 7};
smallPrimes = anonymous;
    注释:在Java中,允许数组长度为0.下面这条语句创建一个长度为0的数组:
new elementType[0];

3.10.3  数组拷贝

    在Java中,允许将一个数组变量拷贝给另一个数组变量.这时,两个变量将引用同一个数组:
int[] luckyNumbers = smallPrimes;
luckyNumbers[3] = 2;    // now smallPrimes[2] is also 2
    如果希望将一个数组额所有值拷贝到一个新的数组中去,就要使用Arrays类的copyTo方法:
int[] copiedLuckyNumbers = Arrays.copyTo(luckyNumbers, luckyNumbers.length):
    第2个参数是新数组的长度,这个方法通常用来增加数组的大小.
luckyNumbers = Arrays.copyTo(luckyNumbers, 2 * luckyNumbers.length);
    如果数组元素是数值型,那么多余的元素将被赋值为0;如果数组元素是布尔型,则将赋值为 false .相反,如果长度小于原始数组的长度,则只拷贝最前面的数据元素.
    注释:  Java数组与C++数组在堆栈上有很大不同,但基本上与分配在堆上的数组指针一样,也就是说,
int[] a = new int[100]; // Java
    不同于
int a[100];             // C++
    而等同于
int* a = new int[100];  // C++
    Java中的[]运算符被预定义为检查数组边界,而且没有指针运算,即不能通过a+1 得到数组的下一个元素.

3.10.4  命令行参数

    前面已经看到多个使用Java数组的示例,每一个Java应用程序都有一个带String arg[]参数的main方法.这个参数表明main方法将接收一个字符串数组,也就是命令行参数.
    例如,看一看下面这个程序:
public class Message
{
    public static void main(String[] args)
    {
        if (args[0].equals("-h"))
            System.out.print("hello,");
        else if(args[0].equals("-g"))
            System.out.print("Goodbye,");
        // print the other command-line arguments
        for (int i = 1; i < args.length; i++)
            System.out.print(" " + args[i]);
        System.out.println("!");
    }
}
    如果使用下面这种形式运行这个程序:
Java Message -g cruel world
    args数组将包含下列内容:
    args[0]: "-g"
    args[1]: "cruel"
    args[2]: "world"
    这个程序将显示下列信息:
    Goodbye, cruel world!
    注释:在Java应用程序的main方法中,程序名并没有存储在args数组中,例如,当使用下列命令运行程序时
java Message -h world
    args[0]是"-h",而不是"Message"或"Java".

3.10.5  数组排序

    要想对数值型数组进行排序,可以使用Arrays类中的sort方法:
int[] a = new int[1000];
...
Arrays.sort(a);
    这个方法使用了优化的快速排序算法.
    下面这个程序用到了数组,它产生一个抽采游戏中的随机数值组合.
<pre name="code" class="java">import java.util.*;
public class LotteryDrawing
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        
        System.out.print("how many numbers do you need to draw?");
        int k = in.nextInt();

        System.out.print("what is the highest numbers you can draw?");
        int n = in.nextInt();

        // fill an array with numbers 1 2 3 ... n
        int[] numbers = new int[n];
        for (int i = 0; i < numbers.length; i++)
            numbers[i] = i + 1;

        // draw k numbers and put them into a second array
        int[] result = new int[k];
        for (int i = 0; i < result.length; i++)
        {
            // make a random index between 0 and n-1
            int r = (int)(Math.random() * n);
            // pick the element at the random location
            result[i] = numbers[r];

            // move the last element into the random location
            numbers[r] = numbers[n - 1];
            n--;
        }
        // print the sorted array
        Arrays.sort(result);
        System.out.println("Bet the following combination.It'll make you rick!");
        for (int r : result)
            System.out.println(r);
    }
}

    注意,抽取出来的数字是不能重复的.
    Java.util.Arrays的方法:
static String toString(type[] a)
    返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔
    参数:   a       类型为 int,short,long,double,float,char,byte,boolean的数组
static type copyOf(type[] a, int length)
static type copyOf(type[] a, int start, int end)
    返回与a类型相同的一个数组,其长度为length或end-start,数组元素为a的值
    参数:   a       类型为...的数组
            start   起始下标(包含这个值)
            end     终止下标(不包含这个值),这个值可能大于a.length.此时,结果为0或false
            length  拷贝的数据元素长度.
static void sort(type[] a)
    采取优化的快速排序算法对数组进行排序
static int binarySearch(type[] a, type v)
static int binarySearch(type[] a, int start, int end, type v)
    采取二分查找算法查找值v
static void fill(type[] a, type v)
    将数组的所有数据元素值设置为v
static boolean equals(type[] a, type[] b)
    如果两个数组大小相同,并且下标相同的元素都对应相等,返回 true .
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值