精华内容
下载资源
问答
  • 只是复制了引用地址数组内的对象还是和旧数组一样的? 看了他的问题,我也有点迷惑了,以前都没想过这个。既然如此,我就有如下的测试,以解心中之疑惑。 看了图和运行结果,可以看出来,这分明就是2个不相干...

    在看别人的关于 CopyOnWriteArrayList 这个类的时候,看到有人提出了关于:数组拷贝的方法Arrays.copyOf() 的问题,如下:
    只是复制了引用地址,数组内的对象还是和旧数组一样的?

    看了他的问题,我也是有点迷惑了,以前都没想过这个。既然如此,我就有如下的测试,以解心中之疑惑。

    看了图和运行结果,可以看出来,这分明就是2个不相干的数组吗。两者是没关系。
    然后再看看源码里面,是怎么在那复制数组的。

        public static <T> T[] copyOf(T[] original, int newLength) {
            return (T[]) copyOf(original, newLength, original.getClass());
        }
    
        public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
            T[] copy = ((Object)newType == (Object)Object[].class)
                ? (T[]) new Object[newLength]
                : (T[]) Array.newInstance(newType.getComponentType(), newLength);
            System.arraycopy(original, 0, copy, 0,
                             Math.min(original.length, newLength));
            return copy;
        }

    可以看到,他是在方法内部,新建了一个相同类型的数组,然后调用系统方法
    System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));

    original - 源数组。 
    0 - 源数组中的起始位置。 
    copy - 目标数组。 
    0 - 目标数据中的起始位置。 
    Math.min(original.length, newLength) - 要复制的数组元素的数量。

    2018.08.03 更新

    看到不少老铁对这个测试存在很大疑问,so,师兄我就再测试一下。

    大师兄最帅

    不是有老铁说我的第一个测试使用的是有争议的数字和字符串嘛,大师兄我就再弄个对象的。看代码名字,就是从其他地方获得三个student对象到这个数组里面,打印没复制之前的数组信息。然后修改新新数组的第0个学生的名字。然后再输出copy出来的数组和源数组,看看啥情况。

    结果:

    啪啪啪的打脸啦。(哎哟,,,,疼,,,,疼,,,,疼,,,,疼,,,,疼,,,)

    虽然copy出来的是新数组没错。

    但是新旧数组都是指向同一个引用滴,哦 my god 。

    所以:

    最后的结论是:Java 拷贝数组方法 Arrays.copyOf() 是地址传递。

    感谢留言的小伙伴,不然师兄我就误人子弟啦。

    展开全文
  • java day011 数组操作 1.数组地址转移 class Test { public static void main(String[] args) { int[] arr1 = new int[5]; int[] arr2 = new int[5]; arr1[0] = 10; arr2[0] = 20; System.out....

    java day011 数组操作

    1.数组地址转移

    class Test {
    	public static void main(String[] args) {
    		int[] arr1 = new int[5];
    		int[] arr2 = new int[5];
    		
    		arr1[0] = 10;
    		arr2[0] = 20;
    		
    		System.out.println(arr1[0]);
    		System.out.println(arr2[0]);
    		
    		arr2 = arr1;
    		
    		arr1[2] = 15;
    		arr2[2] = 60;
    		arr2[0] = 50;
    		
    		System.out.println(arr1[2]);
    		System.out.println(arr2[2]);
    		System.out.println(arr1[0]);
    	}
    }
    /*
    输出结果:
    D:\MyJavaCode\java day011 数组操作>java Test
    10
    20
    60
    60
    50
    */
    

    为什么arr1[2]里面的元素变成了和arr2[2]一样的60,arr1[0]里的元素变成了50呢?

    是因为 arr2 = arr1 这个语句;

    这句的含义是将arr1所指向数组的首地址的值赋值给了arr2,这样arr2也指向了arr1所指向的数组。

    地址传递示意图

    在这里插入图片描述

    2.数组在方法中的传递

    class Test {
        public static void main(String[] args) {
            int[] array = {9, 10, 88, 229, 110, -4, -5};
            int find = 10;
            
            int index = indexOf(array, find);
            
            if (index >= 0) {
                System.out.println("index:" + index);
            } else {
                System.out.println("Not Found!");
            }
        }
        /**
        * 接受int类型的数组并寻找为find的元素,若没有找到返回-1.找到返回下标
        *
        * @param arr 接受int类型的数组
        * @param find 寻找指定int类型元素
        * @return 找到元素返回下标否则返回-1
        */
        public static int indexOf(int[] arr, int find) {
            int index = -1;
            
            for (int i = 0; i < arr.length; i++) {
                if (find == arr[i]) {
                    index = i;
                    break;
                }
            }
            
            return index;
        }
    }
    

    方法运行内存示意图

    在这里插入图片描述

    总结

    1. 数组作为方法参数的格式

      数据类型[] 数组参数名

    2. 数组作为方法的实际参数格式:(数组名)
      lv3hXk-1587735048457)]

    总结

    1. 数组作为方法参数的格式

      数据类型[] 数组参数名

    2. 数组作为方法的实际参数格式:(数组名)

    3. 数组名做方法的参数,实际传递的还是数组首地址,与数组地址转移问题相同

    展开全文
  • 这好像经常听到的一个坑 首先 严格的来说Java里明确规定 只有值传递。...首先Java里明确规定的只有值传递,至于数组传递的 归根到底也是传递数组地址值。 个人见解 欢迎大神评论里留言分享 不要白嫖哈...

    这好像是经常听到的一个坑
    首先 严格的来说Java里明确规定 只有值传递。

    那有人问 如果一个变量数组当作参数的时候,不是数组的引用吗?

    那我问你,变量的却是数组的引用,那变量存的是什么,是数组的地址值 对不对?
    所以 说,还是一个值。

    所有你要这么回答:
    首先Java里明确规定的是只有值传递,至于数组传递的 归根到底也是传递的数组地址值。

    个人见解
    欢迎大神评论里留言分享
    不要白嫖哈,点个赞~~

    展开全文
  • 学习内容:一、数组作为方法参数二、数组作为...此时当我们调用方法的时候,向方法的小括号进行传参,传递进去的其实是数组地址值。 代码举例说明: public class Demo01ArrayParam { public static void m...

    一、数组作为方法参数

    在定义一个方法时,我们要用到参数,除了基本数据类型之外,那么数组可以作为方法的参数吗?答案是可以的。此时当我们调用方法的时候,向方法的小括号进行传参,传递进去的其实是数组的地址值。

    代码举例说明:

    public class Demo01ArrayParam {
    
        public static void main(String[] args) {
            int[] array = {10, 20, 30, 40, 50};
    
            System.out.println(array);// 地址值
    
            printArray(array); //传递进去的就是array当中保存的地址值
            System.out.println("---------AAA----------");
            printArray(array);
            System.out.println("---------BBB----------");
            printArray(array);
        }
        /*
        三要素
        返回值类型:只是进行打印而已,不需要进行计算,也没有结果,用void
        方法名称:printArray
        参数列表:必须给我数组,我才能打印其中的元素。int[] array
         */
        public static void printArray(int[] array) {
    
            System.out.println("printArray方法收到的参数是:");
            System.out.println(array); //地址值
            for (int i = 0; i < array.length; i++) {
                System.out.println(array[i]);
            }
        }
    }
    
    

    二、数组作为返回值

    我们知道,一个方法可以有多个参数,但却不能有多个返回值,那么如果我们希望一个方法中产生了多个结果数据进行返回,该怎么办呢?此时我们只需要利用一个数组来作为方法的返回值类型,然后把希望返回的值放入数组当中即可,此时返回值返回的也是数组的内存地址。

    任何的数据类型都能作为方法的参数类型或者返回值类型。

    代码举例说明:

    public class Demo02ArrayReturn {
    
        public static void main(String[] args) {
    
            int[] result = calculate(10, 20, 30);
    
            System.out.println("main方法接收到的返回值数组是:");
            System.out.println(result);
    
            System.out.println("总和" + result[0]);
            System.out.println("平均数" + result[1]);
        }
    
        public static int[] calculate (int a, int b, int c) {
            int sum = a + b + c; //总和
            int avg = sum / 3; //平均数
            //两个结果都希望进行返回
    
            //需要一个数组,也就是一个塑料兜,数组可以保存多个结果
            /*int[] array = new int[2];
            array[0] = sum; //总和
            array[1] = avg; //平均数
            return array;*/
    
            int[] array = {sum ,avg};
            System.out.println("calculate方法内部数组是:");
            System.out.println(array); //地址值
            return array;
        }
    
    }
    
    

    三、一个编程练习

    题目:对一个数组进行反转,并输出反转后的数组。

    思路:让处于对称位置上的元素进行换位。

    代码说明:

    public class Demo07ArrayReverse {
    
        public static void main(String[] args) {
            int[] array = { 10, 20, 30, 40, 50};
    
            //遍历打印数组本来的样子
            for (int i = 0; i < array.length; i++) {
                System.out.println(array[i]);
            }
            System.out.println("-----------------------");
    
            /*
            初始化语句:int min = 0,max = array.length - 1
            条件判断:min < max
            步进表达式:min++, max--
             */
            for (int min = 0, max = array.length - 1;min < max; min++, max--) {
                int temp = array[min];
                array[min] = array[max];
                array[max] = temp;
            }
    
            //再次打印遍历输出数组后来的样子
            for (int i = 0; i < array.length; i++) {
                System.out.println(array[i]);
            }
        }
    
    }
    
    
    展开全文
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    学生提问:构造器创建Java对象的途径,是不是说构造器完全负责创建Java对象? 141 5.5.2 构造器的重载 142 学生提问:为什么要用this来调用另一个重载的构造器?我把另一个构造器里的代码复制、粘贴到这个构造器...
  • 6.3 小结:Java其实个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 154 7.1.1 引出问题:开动汽车 154 7.1.2 那么,...
  • java面试宝典

    2013-02-28 16:04:01
    21、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底传递还是引用传递? 10 22、我们在web 应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,...
  • 6.3 小结:Java其实个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 154 7.1.1 引出问题:开动汽车 154 7.1.2 那么,...
  • 6.3 小结:Java其实个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 154 7.1.1 引出问题:开动汽车 154 7.1.2 那么,...
  • java 面试题 总结

    2009-09-16 08:45:34
    ArrayList和Vector都使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector...
  •  ArrayList 和Vector都使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,...
  • 第一部分语句, union函数的两个参数List *La,List Lb,一个*La,一个Lb, 不知道为什么一个用线性表的指针的地址 *L,一个用 L 。 2. La_len = ListLength(*La); (2) Lb_len = ListLength...
  • 今天我们就来细说这两个的区别,在C/C++语言中,每当调用一个方法需要传递数组时,就必须同时传递数组的长度,因为在方法调用时传递的参数为数组的首地址,而对数组的实际长度却无法获知,这样会导致在对数组进行...
  • 21天学通C++ (中文第五版)

    热门讨论 2010-06-23 16:57:03
    13.1 什么是数组 13.1.1 访问数组元素 13.1.2 在数组末尾后写入数据 13.1.3 护栏柱错误 13.1.4 初始化数组 13.1.5 声明数组 13.2 使用对象数组 13.2.1 声明多维数纽 13.2.2 初始化多维数组 13.3 指针数组 ...
  • 千方百计笔试题大全

    2011-11-30 21:58:33
    21、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底传递还是引用传递? 10 22、我们在web 应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,...
  • 答:不会发生死锁,(但有一点int按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生) 30.简要谈一下您对微软.NET 构架下remoting和webservice两项技术的...
  • 该书介绍了许多实际应用,其中包括将XHTML连接到Web服务器上的数据库并建立和使用XHTML表、列表、图像、帧、图像映像以及Java小程序等,并在每个重要内容后都加以实例说明。本书所附光盘除了包含本书中的样例代码外...
  • 正则表达式

    2014-12-03 14:51:39
    / 匹配的字符串 "java",其后既可以有 "script",也可以没有. / (ab|cd) + |ef) / 匹配的既可以字符串 "ef",也可以字符串"ab" 或者 "cd" 的一次或多次重复. 在正则表达式中,括号的第二个用途在完整的模式...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    是是 越今天各自为营的 超越今天各自为营的超越今天各自为营的 超越今天各自为营的 Web 站点 站点站点 站点 把 把把 把 Internet 建成一 建成建成 建成 个 一个一 一个可 可个可 可 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    是是 越今天各自为营的 超越今天各自为营的超越今天各自为营的 超越今天各自为营的 Web 站点 站点站点 站点 把 把把 把 Internet 建成一 建成建成 建成 个 一个一 一个可 可个可 可 ...
  • <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> body { margin: 1px; } .searchbox { margin: -3; ...
  • 如果拆分成四个独立的业务模块,那么对应的fragment肯定要放到对应的组件中,那么这样操作,当主工程与该业务组件解绑的情况下,如何拿到fragment和传递参数进行通信。 Fragment 中 开启Activity带requestCode,...
  • 4.2.6 Java池 149 4.2.7 流池 150 4.2.8 自动SGA内存管理 150 4.3 小结 151 第5章 Oracle进程 153 5.1 服务器进程 153 5.1.1 专用服务器连接 154 5.1.2 共享服务器连接 156 5.1.3 连接与会话 157 5.1.4 ...
  • 4.2.6 JAVA池 144 4.2.7 流池 145 4.2.8 自动SGA内存管理 145 4.2.9 自动内存管理 147 4.3 小结 148 第5章 Oracle进程 149 5.1 服务器进程 149 5.1.1 专用服务器连接 150 5.1.2 共享服务器连接 152 5.1.3 ...

空空如也

空空如也

1 2
收藏数 24
精华内容 9
关键字:

java数组是地址传递吗

java 订阅