【问题标题】:Local variable behaviour with list, string, and stringbuffer [duplicate]列表、字符串和字符串缓冲区的局部变量行为 [重复]
【发布时间】:2014-08-20 15:59:02
【问题描述】:

我是新手。
我已经读过局部变量的范围将在一个块内(如果我错了,请纠正我)。 在这里,main 方法的局部变量(列表lili1,以及StringBuffer y)的行为类似于实例变量,而变量(String y1 和int x)的行为类似于局部变量。为什么 ?

public class Test {
    public static void addValues(ArrayList<String> list, StringBuffer sb, int x){
        list.add("3");
        list.add("4");
        list.add("5");

        sb.append("String Buffer Appended !");
        x=x+10;
    }

    public static void addValues(ArrayList<String> list, String sb, int x){
        list.add("3");
        list.add("4");
        list.add("5");

        sb = sb + "is Appended !";
        x=x+10;
    }

    public static void main(String[] args) {
        ArrayList<String> li = new ArrayList<>();
        ArrayList<String> li1 = new ArrayList<>();
        StringBuffer y=new StringBuffer("ab");
        int x=10;
        String y1=new String("ab");
        li.add("1");
        li.add("2");
        li1.add("1");
        li1.add("2");
        System.out.println("b4 : "+li+" , y = "+y+" , y1 = "+y1+" x= "+x);
        addValues(li,y,x);
        System.out.println("Af : "+li+" , y = "+y+" x= "+x);
        addValues(li1,y1,x);
        System.out.println("Af : "+li1+" , y1 = "+y1+" x= "+x);
    }
}

输出:

b4 : [1, 2] , y = ab , y1 = ab x= 10
Af : [1, 2, 3, 4, 5] , y = abString Buffer Appended ! x= 10
Af : [1, 2, 3, 4, 5] , y1 = ab x= 10

【问题讨论】:

标签: java string list local-variables stringbuffer


【解决方案1】:

在 ArrayList 和 StringBuffer 的情况下,您传递的是对可变对象的引用,该对象反映了对拥有相同引用的任何变量的任何修改。

在 String 的情况下,您也传递了一个引用,但它是不可变的,因此当您将某些内容连接到它时,它实际上创建了一个新的 String 对象并为方法中的变量分配了一个新的引用,您实际上并没有修改对象本身。

在 int 的情况下,所有原语都是按值分配和传递的,所以它实际上复制了它的值并将其传递给方法,所以你对方法中的变量所做的任何事情都不会影响变量在它之外。

【讨论】:

    【解决方案2】:

    Java 总是按值传递,意味着它总是将变量(原始变量和引用变量)的副本传递给方法的代码块。

    当我们传递一个对象引用变量(在本例中为 ArrayList 和 StringBuffer)时,实际上我们复制的是引用变量的位模式,而不是它本身的真实对象,您的 addValues 方法中的新副本引用完全相同对象作为 main 方法中声明的对象,因此每当我们修改对象成员的值时,副本和实际对象引用变量都会看到更改。

    String 默认是不可变的和 int,它们默认是不可变的。因此,每当我们将它们作为参数传递给方法时,方法将仅具有来自 String 和 int 的值的副本。

    您的问题与 java 中的“堆栈和堆”有关。你可以看this video作为参考

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 2016-10-22
      • 2012-04-27
      • 2013-07-10
      • 2015-12-29
      • 2017-12-29
      相关资源
      最近更新 更多