QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

VIP至尊会员

Rank: 15Rank: 15Rank: 15

积分
2191
查看: 1658|回复: 24

[系列教程] 【Java 教程(原创)】009.Java的数组(下)(有彩蛋)

[复制链接]
最佳答案
42 
累计签到:941 天
连续签到:1 天
零度非安全 发表于 2017-1-11 16:21:52 165824 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 零度非安全 于 2017-4-10 23:32 编辑

【Java 教程(原创)】索引帖

是不是觉得看完上一讲不过瘾,在开始聊数组的复制之前,先说下数组的表示格式。
学习过 C 语言或其他语言的鱼油,一定非常熟悉使用循环输出数组元素的值。在这里介绍 JDK1.5 版本以后提供的一个简单的输出数组元素的值的方法。让 Arrays 类调用 public static String toString(int[] a) 方法,可以得到参数指定的一维数组 a 的如下格式的字符串表示:
  1. [a[0],a[1],a[2],......,a[a.length - 1]]
复制代码

例如,对于数组:
  1. int[] a = {1,2,3,4,5,6};
复制代码

Arrays.toString(a)
得到的字符串是:
  1. [1,2,3,4,5,6]
复制代码

注:有关使用类调用方法的知识会在以后讲到。


数组的复制

通过上集的学习,我们已经知道,数组属于引用类型。也就是说,如果两个类型相同的数组具有相同的引用,那么它们就有完全相同的内存单元。例如,对于:
  1. int a[] = {1,2},b[];
复制代码

如果执行:
  1. b = a;
复制代码

那么 a 和 b 的值就相同,即 a 的引用与 b 的引用相同。这样,a[0] 和 b[0] 是相同的内存空间,同样,a[1] 和 b[1] 也是相同的内存空间。

有时想把一个数组的元素中的值复制到另一个数组的元素中,后者元素值的改变不会影响到原数组元素的值,反之也是如此。如果想实现这样的目的,显然不能使用数组引用赋值的方法。

1> arraycopy 方法
一个方法就是利用循环把一个数组的元素的值赋值给另一个数组中的元素(C 语言中经常使用的方法)。在这里介绍 Java 提供的更简练的数组之间的快速复制,即让 System 类调用方法:
  1. public static void arraycopy(sourceArray,int index1,copyArray,int index2,int length)
复制代码

可以将数组 sourceArray 从索引 index1 开始的 length 个元素中的数据复制到数组 copyArray 中,即将数组 sourceArray 中的索引值从 index1 到 index1 + length - 1 元素中的数据复制到数组 copyArray 的某些元素中,copyArray 数组从 index2 元素开始存放这些数据。如果数组 copyArray 不能存放下复制的数据,程序运行将发生异常。

下面这个例子演示了 arraycopy 方法,运行效果如下图所示:
arrayCopyUse.png

例子代码如下:
arrayCopyUse.java
  1. import java.util.Arrays;

  2. public class arrayCopyUse{
  3.         public static void main(String args[]){
  4.                 char[] a = {'a','b','c','d','e','f'},b = {'1','2','3','4','5','6'};
  5.                 int[] c = {1,2,3,4,5,6},d = {10,20,30,40,50,60};
  6.                 System.arraycopy(a,0,b,0,a.length);
  7.                 System.arraycopy(c,2,d,2,c.length - 3);
  8.                 System.out.println("数组a的各个元素中的值:");
  9.                 System.out.println(Arrays.toString(a));
  10.                 System.out.println("数组b的各个元素中的值:");
  11.                 System.out.println(Arrays.toString(b));
  12.                 System.out.println("数组c的各个元素中的值:");
  13.                 System.out.println(Arrays.toString(c));
  14.                 System.out.println("数组d的各个元素中的值:");
  15.                 System.out.println(Arrays.toString(d));
  16.         }
  17. }
复制代码

2> copyOf 和 copyOfRange 方法

前面介绍的方法
  1. public static void arraycopy(sourceArray,int index1,copyArray,int index2,int length)
复制代码

有一个缺点,那就是事先必须创建参数 copyArray 指定的数组。JDK1.6 版本以后,Java 又提供了 copyOf 和 copyOfRange 方法。例如,Arrays 类调用方法:
  1. public static double[] copyOf(double[] original,int newLength)
复制代码

可以把参数 original 指定的数组中从索引 0 开始的 newLength 个元素复制到一个新数组中,并返回这个新数组,且该新数组的长度为 newLength。如果 newLength 的值大于 original 的长度,copyOf 方法返回的新数组的第 newLength 索引后的元素取默认值。类似的方法还有:
  1. public static float[] copyOf(float[] original,int newLength)
  2. public static int[] copyOf(int[] original,int newLength)
  3. public static char[] copyOf(char[] original,int newLength)等
复制代码

例如,对于:
  1. int[] a = {100,200,300,400};
  2. int[] b = Arrays.copyOf(a,5);
复制代码

那么 b[0] = 100,b[1] = 200,b[2] = 300,b[3] = 400,b[4] = 0。即 b 的长度为 5,最后一个元素 b[4] 取默认值 0。

另外,还有一个方法,可以把数组中部分元素的值复制到另一个数组中,例如:
  1. public static double[] copyOfRange(double[] original,int from,int to)
复制代码

这个方法可以把参数 original 指定的数组中从索引 from 至 to - 1 的元素复制到一个新数组中,并返回这个新数组,即新数组的长度为 to - from。如果 to 的值大于数组 original 的长度,新数组的第 original.length - from 索引开始的元素取默认值。类似的方法还有:
  1. public static float[] copyOfRange(float[] original,int from,int to)
  2. public static int[] copyOfRange(int[] original,int from,int to)
  3. public static char[] copyOfRange(char[] original,int from,int to)等
复制代码
例如,对于:
  1. int[] a = {100,200,300,400,500,600};
  2. int[] b = Arrays.copyOfRange(a,2,5);
复制代码
那么数组 b 的长度为 3,b[0] = 300,b[1] = 400,b[2] = 500。

下面这个例子使用 copyOfcopyOfRange 方法复制数组,运行效果如下图所示:
copyOf_RangeUse.png

例子代码如下:
copyOf_RangeUse.java
  1. import java.util.*;

  2. public class copyOf_RangeUse{
  3.         public static void main(String args[]){
  4.                 int[] a = {10,20,30,40,50,60},b,c,d;
  5.                 b = Arrays.copyOf(a,10);
  6.                 System.out.println("数组a的各个元素中的值:");
  7.                 System.out.println(Arrays.toString(a));
  8.                 System.out.println("数组b的各个元素中的值:");
  9.                 System.out.println(Arrays.toString(b));
  10.                 c = Arrays.copyOfRange(a,3,5);
  11.                 System.out.println("数组c的各个元素中的值:");
  12.                 System.out.println(Arrays.toString(c));
  13.                 d = Arrays.copyOfRange(a,3,9);
  14.                 System.out.println("数组d的各个元素中的值:");
  15.                 System.out.println(Arrays.toString(d));
  16.         }
  17. }
复制代码



【特别注意】贴子中的栗子希望鱼油们能自觉的手动敲上去,不要单纯的复制粘贴保存,然后编译运行。







彩蛋

游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

楼层
跳转到指定楼层
最佳答案
0 
累计签到:268 天
连续签到:14 天
781318059 发表于 2017-1-11 17:23:30 | 显示全部楼层
最佳答案
0 
累计签到:99 天
连续签到:1 天
464318257 发表于 2017-1-22 15:25:38 | 显示全部楼层
最佳答案
0 
累计签到:99 天
连续签到:1 天
464318257 发表于 2017-1-22 15:55:40 | 显示全部楼层
1> arraycopy 方法前面一段话
有时想把一个数组的元素中的值复制到另一个数组的元素中,后者元素值得改变不会影响到原数组元素的值,反之也是如此。如果想实现这样的目的,显然不能使用数组引用赋值的方法。

其中,后者元素值得改变不会影响到原数组元素的值.    值得改为值的

评分

参与人数 1荣誉 +5 收起 理由
零度非安全 + 5 感谢指出错别字

查看全部评分

最佳答案
42 
累计签到:941 天
连续签到:1 天
零度非安全  楼主| 发表于 2017-1-22 16:36:26 | 显示全部楼层
464318257 发表于 2017-1-22 15:55
1> arraycopy 方法前面一段话
有时想把一个数组的元素中的值复制到另一个数组的元素中,后者元素值得改变 ...

错别字已修正
最佳答案
0 
累计签到:99 天
连续签到:1 天
464318257 发表于 2017-1-23 09:36:43 | 显示全部楼层
注意注意!
Arrays.toString(a) 得到的字符串是:
[1,2,3,4,5]

这个地方出错了吧
应该得到的是
[1,2,3,4,5,6]

评分

参与人数 1贡献 +1 收起 理由
零度非安全 + 1 感谢指出

查看全部评分

最佳答案
0 
累计签到:99 天
连续签到:1 天
464318257 发表于 2017-1-23 10:12:50 | 显示全部楼层
如果 number 和数组 a 中的某个元素的值相同,那么int binarySearch(double[] a,double number) 方法返回(得到)该元素的索引,否则返回一个负数。
如果相同,且该元素是重复多个的,比如45有两个,或者九个,那么返回的索引是该元素任意一个索引.
最佳答案
42 
累计签到:941 天
连续签到:1 天
零度非安全  楼主| 发表于 2017-1-23 13:21:33 | 显示全部楼层
464318257 发表于 2017-1-23 09:36
注意注意!
Arrays.toString(a) 得到的字符串是:
[1,2,3,4,5]

已修正
最佳答案
0 
累计签到:25 天
连续签到:1 天
feng114 发表于 2017-1-28 21:45:56 | 显示全部楼层
通俗易懂,谢谢

评分

参与人数 1鱼币 +4 收起 理由
零度非安全 + 4 热爱鱼C^_^

查看全部评分

最佳答案
42 
累计签到:941 天
连续签到:1 天
零度非安全  楼主| 发表于 2017-1-28 21:53:27 | 显示全部楼层
feng114 发表于 2017-1-28 21:45
通俗易懂,谢谢

谢谢支持,进索引帖有惊喜!
最佳答案
0 
累计签到:1 天
连续签到:1 天
kristine 发表于 2017-3-2 17:08:45 | 显示全部楼层
看看彩蛋
最佳答案
0 
累计签到:87 天
连续签到:1 天
子月 发表于 2017-3-6 13:42:45 | 显示全部楼层
我是专门看彩蛋的。
最佳答案
1 
累计签到:45 天
连续签到:1 天
jackie-L 发表于 2017-3-13 16:04:18 | 显示全部楼层
看看
最佳答案
0 
累计签到:1 天
连续签到:1 天
skj 发表于 2017-3-16 11:10:41 | 显示全部楼层
谢谢~好好学习java~
最佳答案
0 
累计签到:52 天
连续签到:1 天
CarpLyy 发表于 2017-3-20 11:11:24 | 显示全部楼层
查看彩蛋
最佳答案
3 
累计签到:121 天
连续签到:2 天
weiyang__ 发表于 2017-4-10 22:02:22 | 显示全部楼层
又有彩蛋了
最佳答案
3 
累计签到:121 天
连续签到:2 天
weiyang__ 发表于 2017-4-10 22:06:02 | 显示全部楼层
倒数第2段代码
  1. int[] a = {100,200,300,400,500,600};
  2. int[] b = Arrays.copyOf(a,2,5);
复制代码

是不是应该改一下啊?
  1. int[] a = {100,200,300,400,500,600};
  2. int[] b = Arrays.copyOfRange(a,2,5);
复制代码

评分

参与人数 1鱼币 +6 贡献 +2 收起 理由
零度非安全 + 6 + 2 感谢指正,已更正!!!

查看全部评分

最佳答案
42 
累计签到:941 天
连续签到:1 天
零度非安全  楼主| 发表于 2017-4-10 23:31:20 | 显示全部楼层
weiyang__ 发表于 2017-4-10 22:06
倒数第2段代码

是不是应该改一下啊?

感谢指正,已更正!!!
最佳答案
0 
累计签到:24 天
连续签到:1 天
文润 发表于 2017-4-20 22:22:59 | 显示全部楼层
最佳答案
0 
累计签到:131 天
连续签到:9 天
ShaunSS 发表于 2017-5-4 18:38:11 | 显示全部楼层
009 打卡

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /2 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-12-18 03:36

快速回复 返回顶部 返回列表