Java passByValue或引用混淆

Java passByValue或引用混淆,java,pass-by-reference,pass-by-reference-value,Java,Pass By Reference,Pass By Reference Value,我试图玩Java引用,我得到了一个有趣的情况。 下面这段代码为我提供了不可预测的输出。我试图修改函数中的数组、字符串和整数 public static void main(String[] args){ int[] arr = {1,2,3,4,5}; Integer b = 6; String s = "ABC"; fun(arr, b,s); for(int i : arr) System.out.prin

我试图玩Java引用,我得到了一个有趣的情况。 下面这段代码为我提供了不可预测的输出。我试图修改函数中的数组、字符串和整数

 public static void main(String[] args){
     int[] arr = {1,2,3,4,5}; 
     Integer b = 6;      
     String s = "ABC";

     fun(arr, b,s);
     for(int i : arr)
         System.out.print(i + " ");
     System.out.println();
     System.out.println("b="+b);
     System.out.println("s="+s);
 }   

 public static void fun(int[] a, Integer b, String s){
     b = b*10;       
     for(int i =0; i<a.length; i++)
     {
         a[i] = a[i]+10;
     }       
     s=s+"PIY";
 }

我不明白为什么数组会被更改,但函数中的字符串和整数不会被更改。

数组是一个对象,
Integer
string
在Java中是不可变的。不能通过引用更改不可变对象。您必须重新插入/重新分配才能查看更改。因此不同

 public static void main(String[] args){
     int[] arr = {1,2,3,4,5}; 
     Integer b = 6;      
     String s = "ABC";

     fun(arr, b,s);
     for(int i : arr)
         System.out.print(i + " ");
     System.out.println();
     System.out.println("b="+b);
     System.out.println("s="+s);
 }   

 public static void fun(int[] a, Integer b, String s){
     b = b*10;       
     for(int i =0; i<a.length; i++)
     {
         a[i] = a[i]+10;
     }       
     s=s+"PIY";
 }

您的逻辑适用于不可变的一般对象

谢谢,但您所说的重新分配是什么意思。对我来说,我已经在函数内部重新分配了。@Piyush_Chhabra重新分配到数组位置。注意这里有一个
b=
s=
,但是没有
a=
?这是因为您正在修改
a
,而不是重新分配它。