零度非安全 发表于 2017-1-11 16:21:52

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

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

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

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

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

数组的复制

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

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

1> arraycopy 方法
一个方法就是利用循环把一个数组的元素的值赋值给另一个数组中的元素(C 语言中经常使用的方法{:10_268:})。在这里介绍 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.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 = 100,b = 200,b = 300,b = 400,b = 0。即 b 的长度为 5,最后一个元素 b 取默认值 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 = 300,b = 400,b = 500。

下面这个例子使用 copyOf 和 copyOfRange 方法复制数组,运行效果如下图所示:


例子代码如下:
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));
      }
}


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


点我前往上一讲

006~009课后大作业

点我前往下一讲



彩蛋
**** Hidden Message *****

781318059 发表于 2017-1-11 17:23:30

{:9_218:}

464318257 发表于 2017-1-22 15:25:38

{:9_228:}

464318257 发表于 2017-1-22 15:55:40

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

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

零度非安全 发表于 2017-1-22 16:36:26

464318257 发表于 2017-1-22 15:55
1> arraycopy 方法前面一段话
有时想把一个数组的元素中的值复制到另一个数组的元素中,后者元素值得改变 ...

错别字已修正

464318257 发表于 2017-1-23 09:36:43

注意注意!
Arrays.toString(a) 得到的字符串是:


这个地方出错了吧
应该得到的是

464318257 发表于 2017-1-23 10:12:50

如果 number 和数组 a 中的某个元素的值相同,那么int binarySearch(double[] a,double number) 方法返回(得到)该元素{:10_245:}的索引,否则返回一个负数。
如果相同,且该元素是重复多个的,比如45有两个,或者九个,那么返回的索引是该元素任意一个索引.{:10_256:}

零度非安全 发表于 2017-1-23 13:21:33

464318257 发表于 2017-1-23 09:36
注意注意!
Arrays.toString(a) 得到的字符串是:



已修正

feng114 发表于 2017-1-28 21:45:56

通俗易懂,谢谢

零度非安全 发表于 2017-1-28 21:53:27

feng114 发表于 2017-1-28 21:45
通俗易懂,谢谢

谢谢支持,进索引帖有惊喜!

kristine 发表于 2017-3-2 17:08:45

看看彩蛋{:9_241:}

子月 发表于 2017-3-6 13:42:45

我是专门看彩蛋的。

jackie-L 发表于 2017-3-13 16:04:18

看看

skj 发表于 2017-3-16 11:10:41

谢谢~好好学习java~

CarpLyy 发表于 2017-3-20 11:11:24

查看彩蛋

weiyang__ 发表于 2017-4-10 22:02:22

又有彩蛋了{:9_228:}

weiyang__ 发表于 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);

零度非安全 发表于 2017-4-10 23:31:20

weiyang__ 发表于 2017-4-10 22:06
倒数第2段代码

是不是应该改一下啊?

感谢指正,已更正!!!

文润 发表于 2017-4-20 22:22:59

{:5_106:}

ShaunSS 发表于 2017-5-4 18:38:11

009 打卡
页: [1] 2 3
查看完整版本: 【Java 教程(原创)】009.Java的数组(下)(有彩蛋)