首先这道题是这样的
题目链接
看到题目,对于我这种懒人来说最先想到当然是利用Set集合的特性来去重,于是就有了下面的代码
/*
* @lc app=leetcode.cn id=26 lang=java
*
* [26] 删除排序数组中的重复项
*/
class Solution {
public int removeDuplicates(int[] nums) {
Set<Integer> set = new TreeSet<>();
for (int i = 0; i < nums.length; i++) {
set.add(nums[i]);
}
int[] newNums = new int[set.size()];
int i = 0;
for (Integer s : set) {
newNums[i] = s;
i++;
}
nums = newNums;
return set.size();
}
}
但是结果却出现了错误:
可以看出是操作之后的数组出现了问题,在函数之外打印了数组之后发现数组的值为:[1,1,2],可见数组的值经过函数的操作根本没有发生变化。
编写测试类
public class Test02 {
static void test(int[] nums){
nums = new int[]{1, 1, 1};
}
public static void main(String[] args) {
int[] nums = new int[]{2, 2, 2};
test(nums);
System.out.println(Arrays.toString(nums));// [2, 2, 2]
}
}
运行程序后发现数组nums的值没有变,再用对象进行测试:
public class Test02 {
static void test(Person person){
person = new Person("aaa");
}
public static void main(String[] args) {
Person person = new Person("bbb");
test(person);
System.out.println(person); // Person{name='bbb'}
}
}
class Person{
private String name;
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
运行程序发现对象person的值也并没有发生变化。
再用字符串进行测试:
public class TestString{
public static void ModifyString(String text){
text = "world";
}
public static void main(String[] args) {
String text = "hello";
ModifyString(text);
System.out.println(text);// hello
}
}
这不禁引发了我对java中值传递和引用传递的进一步思考,查阅资料才知道,原来java中方法参数的传递本质上都是值传递,传递对象的时候实际上是拷贝了一份参数的地址。
以下是《java核心技术》中的详细讲解: