鱼C论坛

 找回密码
 立即注册
查看: 13685|回复: 54

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

[复制链接]
发表于 2017-1-11 16:21:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

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

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

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

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

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


数组的复制

通过上集的学习,我们已经知道,数组属于引用类型。也就是说,如果两个类型相同的数组具有相同的引用,那么它们就有完全相同的内存单元。例如,对于:
int a[] = {1,2},b[];
如果执行:
b = a;
那么 a 和 b 的值就相同,即 a 的引用与 b 的引用相同。这样,a[0] 和 b[0] 是相同的内存空间,同样,a[1] 和 b[1] 也是相同的内存空间。

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

1> arraycopy 方法
一个方法就是利用循环把一个数组的元素的值赋值给另一个数组中的元素(C 语言中经常使用的方法)。在这里介绍 Java 提供的更简练的数组之间的快速复制,即让 System 类调用方法:
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
import java.util.Arrays;

public class arrayCopyUse{
        public static void main(String args[]){
                char[] a = {'a','b','c','d','e','f'},b = {'1','2','3','4','5','6'};
                int[] c = {1,2,3,4,5,6},d = {10,20,30,40,50,60};
                System.arraycopy(a,0,b,0,a.length);
                System.arraycopy(c,2,d,2,c.length - 3);
                System.out.println("数组a的各个元素中的值:");
                System.out.println(Arrays.toString(a));
                System.out.println("数组b的各个元素中的值:");
                System.out.println(Arrays.toString(b));
                System.out.println("数组c的各个元素中的值:");
                System.out.println(Arrays.toString(c));
                System.out.println("数组d的各个元素中的值:");
                System.out.println(Arrays.toString(d));
        }
}
2> copyOf 和 copyOfRange 方法

前面介绍的方法
public static void arraycopy(sourceArray,int index1,copyArray,int index2,int length)
有一个缺点,那就是事先必须创建参数 copyArray 指定的数组。JDK1.6 版本以后,Java 又提供了 copyOf 和 copyOfRange 方法。例如,Arrays 类调用方法:
public static double[] copyOf(double[] original,int newLength)
可以把参数 original 指定的数组中从索引 0 开始的 newLength 个元素复制到一个新数组中,并返回这个新数组,且该新数组的长度为 newLength。如果 newLength 的值大于 original 的长度,copyOf 方法返回的新数组的第 newLength 索引后的元素取默认值。类似的方法还有:
public static float[] copyOf(float[] original,int newLength)
public static int[] copyOf(int[] original,int newLength)
public static char[] copyOf(char[] original,int newLength)等
例如,对于:
int[] a = {100,200,300,400};
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。

另外,还有一个方法,可以把数组中部分元素的值复制到另一个数组中,例如:
public static double[] copyOfRange(double[] original,int from,int to)
这个方法可以把参数 original 指定的数组中从索引 from 至 to - 1 的元素复制到一个新数组中,并返回这个新数组,即新数组的长度为 to - from。如果 to 的值大于数组 original 的长度,新数组的第 original.length - from 索引开始的元素取默认值。类似的方法还有:
public static float[] copyOfRange(float[] original,int from,int to)
public static int[] copyOfRange(int[] original,int from,int to)
public static char[] copyOfRange(char[] original,int from,int to)等
例如,对于:
int[] a = {100,200,300,400,500,600};
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
import java.util.*;

public class copyOf_RangeUse{
        public static void main(String args[]){
                int[] a = {10,20,30,40,50,60},b,c,d;
                b = Arrays.copyOf(a,10);
                System.out.println("数组a的各个元素中的值:");
                System.out.println(Arrays.toString(a));
                System.out.println("数组b的各个元素中的值:");
                System.out.println(Arrays.toString(b));
                c = Arrays.copyOfRange(a,3,5);
                System.out.println("数组c的各个元素中的值:");
                System.out.println(Arrays.toString(c));
                d = Arrays.copyOfRange(a,3,9);
                System.out.println("数组d的各个元素中的值:");
                System.out.println(Arrays.toString(d));
        }
}


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







彩蛋

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-11 17:23:30 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-22 15:25:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-22 15:55:40 | 显示全部楼层
1> arraycopy 方法前面一段话
有时想把一个数组的元素中的值复制到另一个数组的元素中,后者元素值得改变不会影响到原数组元素的值,反之也是如此。如果想实现这样的目的,显然不能使用数组引用赋值的方法。

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-1-22 16:36:26 | 显示全部楼层
464318257 发表于 2017-1-22 15:55
1> arraycopy 方法前面一段话
有时想把一个数组的元素中的值复制到另一个数组的元素中,后者元素值得改变 ...

错别字已修正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-23 09:36:43 | 显示全部楼层
注意注意!
Arrays.toString(a) 得到的字符串是:
[1,2,3,4,5]

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-23 10:12:50 | 显示全部楼层
如果 number 和数组 a 中的某个元素的值相同,那么int binarySearch(double[] a,double number) 方法返回(得到)该元素的索引,否则返回一个负数。
如果相同,且该元素是重复多个的,比如45有两个,或者九个,那么返回的索引是该元素任意一个索引.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-23 13:21:33 | 显示全部楼层
464318257 发表于 2017-1-23 09:36
注意注意!
Arrays.toString(a) 得到的字符串是:
[1,2,3,4,5]

已修正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-28 21:45:56 | 显示全部楼层
通俗易懂,谢谢

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-28 21:53:27 | 显示全部楼层
feng114 发表于 2017-1-28 21:45
通俗易懂,谢谢

谢谢支持,进索引帖有惊喜!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-2 17:08:45 | 显示全部楼层
看看彩蛋
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-6 13:42:45 | 显示全部楼层
我是专门看彩蛋的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-13 16:04:18 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-16 11:10:41 | 显示全部楼层
谢谢~好好学习java~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-20 11:11:24 | 显示全部楼层
查看彩蛋
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 22:02:22 | 显示全部楼层
又有彩蛋了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 22:06:02 | 显示全部楼层
倒数第2段代码
int[] a = {100,200,300,400,500,600};
int[] b = Arrays.copyOf(a,2,5);
是不是应该改一下啊?
int[] a = {100,200,300,400,500,600};
int[] b = Arrays.copyOfRange(a,2,5);

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 23:31:20 | 显示全部楼层
weiyang__ 发表于 2017-4-10 22:06
倒数第2段代码

是不是应该改一下啊?

感谢指正,已更正!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-20 22:22:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-4 18:38:11 | 显示全部楼层
009 打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 21:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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