【发布时间】:2019-02-23 19:59:46
【问题描述】:
我正在尝试对数字的 int[] 进行一些按位运算。对于每个操作,我直接在 Main 类内部创建一个单独的静态方法,并传递数字数组以及我想要修改的位位置。这真的没什么有趣的。
我的问题可能很愚蠢,但是由于 Java 总是按值传递,为什么我的方法在我使用 Arrays.stream(numbers[]) 时不会改变我的源代码......但只有在我使用 for 循环时才会改变。
在这两种情况下,我都将引用传递给数组为什么它不起作用,请帮助这让我发疯:(
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
int [] numbers = new int[n];
for (int i =0; i < n; i++) {
numbers[i] = Integer.parseInt(reader.readLine());
}
String line = reader.readLine();
while (!"party over".equalsIgnoreCase(line)) {
String operation = line.split("\\s+")[0];
int position = Integer.parseInt(line.split("\\s+")[1]);
switch (operation) {
case "-1":
flipTheBitAtPosition (numbers, position);
break;
case "0" :
turnBitAtPositionToZero (numbers, position);
break;
case "1":
turnBitAtPositionToOne(numbers, position);
break;
}
line = reader.readLine();
}
Arrays.stream(numbers).forEach(x-> System.out.println(x));
}
private static void turnBitAtPositionToOne(int[] numbers, int position) {
int mask = 1 <<position;
//this does not modifty the numbers array
Arrays.stream(numbers).map(x-> x|mask);
//this does modify the numbers array Why ?!
for (int i =0; i < numbers.length; i++) {
numbers[i] |= mask;
}
}
private static void turnBitAtPositionToZero(int[] numbers, int position) {
int mask = ~(1 <<position);
//this does not modifty the numbers array
Arrays.stream(numbers).map(x->x & mask);
}
private static void flipTheBitAtPosition(int[] numbers, int position) {
int mask = 1 <<position;
//this does not modifty the numbers array
Arrays.stream(numbers).map(x->x ^ mask);
}
}
【问题讨论】:
-
为什么你认为应该这样做?是什么让您觉得
Arrays.stream对输入数组做了任何事情? -
你应该做一个更小的例子,里面的逻辑更少,在这里测试东西并提出问题。用一种方法做一个例子,没有太多的分支。
-
另外,查找中间和终端操作。
标签: java arrays pass-by-value