美文网首页
java 关于数组引用的问题

java 关于数组引用的问题

作者: Aaron_Swartz | 来源:发表于2019-09-26 01:18 被阅读0次

    练习leetcode 189 题目时出现的问题

    public static void rotate(int[] nums, int k) {
            if (nums == null || nums.length < 1 || k < 1) {
                return;
            }
            int len = nums.length;
            k = k % len;
            int[] res = new int[len];
            for (int i = 0; i < len; ++i) {
                if (i < k) {
                    res[i] = nums[len - k + i];
                } else {
                    res[i] = nums[i - k];
                }
            }
            System.out.println("ok");
    //        nums = res;
            nums = Arrays.copyOf(res, res.length);
            System.out.println("ok");
        }
    
        public static void main(String[] args) {
            int[] temp = new int[]{1, 2, 3, 4, 5, 6, 7};
    //        int[] res = Solution189.rotate(temp, 3);
            Solution189.rotate2(temp, 3);
            System.out.println(temp);
        }
    

    这段代码在测试中即使最后函数中的nums已经修改了,但是函数外的值始终无法改变,导致我这边在不断调试。
    最后发现是数组和对象一样都是引用传递,在函数中只是将新引用赋值给临时引用,但是此时函数外部的引用并没有变化。

    java中基本类型是值传递,数组和对象以及字符串等是作为引用传递的

    在Java中,Java的函数参数在传递的时候有两种方式。对于基本类型,如int,double等作为函数参数传递时,采取的是传值方式。而对于对象,如数组、字符串等作为参数传递时,采用的是引用方式,即此时在函数中对传递的对象的修改将完全影响原对象。但是你这里主函数中的unsort数组还是只想原来的内存。

    // 最后修改后的答案
    class Solution {
        public void rotate(int[] nums, int k) {
            if (nums == null || nums.length < 1 || k < 1) {
                return;
            }
            int len = nums.length;
            k = k % len;
            int[] res = Arrays.copyOf(nums, nums.length);
            for (int i = 0; i < len; ++i) {
                if (i < k) {
                    nums[i] = res[len - k + i];
                } else {
                    nums[i] = res[i - k];
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:java 关于数组引用的问题

          本文链接:https://www.haomeiwen.com/subject/nrevuctx.html