Почему изменение в одном объекте StringBuffer влияет на другой? у них есть общая память

Я новичок в Java. Я пытаюсь сделать свою домашнюю работу. В этом я сначала сделал объекты StringBuffer strB1 и strB2. После получения входных данных от пользователя. Я создал новый объект StringBuffer и скопировал содержимое strB1 в этот объект. Я делаю все изменения для нового объекта stringbuffer strobj, который содержит содержимое strB1. Но изменения в новом объекте отражаются в оригинале. Пожалуйста помоги. Я не могу понять, почему первоначальный объект меняется.

В конце печати кода вы увидите, что оба объекта дают одинаковый результат, тогда как я делаю изменения только в одном объекте.

import java.util.Scanner;

public class Homwork1_Q2 {

    StringBuffer strobj2;

    Homwork1_Q2()
    {

    }
    // Copy constructor used in part 2 and 3 or hw
    Homwork1_Q2(StringBuffer strobj_2)
    {
        this.strobj2 = strobj_2;
    }

    public static void main(String args[])
    {
        // create two StringBuffer objects
        StringBuffer strB1 = new StringBuffer();
        StringBuffer strB2 = new StringBuffer();

        //1. create a obj of Scanner and take input in STRB1
        Scanner scan = new Scanner(System.in);
        System.out.println("Input the  Long String");
        strB1.append(scan.nextLine());

        //Input a shorter String
        System.out.println("Input the  Short String");
        strB2.append(scan.nextLine());

        //If 2nd stringBuffer is longer the first through an
        //exception and again take the input
        try
        {
        if(strB1.length() < strB2.length())
        {
            throw new Exception();

        }
        }catch(Exception e)
        {
            System.out.println("2nd String should be shorter.. Input again");
            strB2.append(scan.nextLine());
        }


        // 2. Create a StringBuffer object from the long String
        StringBuffer strobj = new StringBuffer();
        strobj = strobj.append(strB1.toString());

        //3. Using the StringBuffer with the appropriate specific constructor.
        Homwork1_Q2 object = new Homwork1_Q2(strB1);

         //4. Position of the small string in the long string
        //If more then one position is present then it will calculate that too 
        int position;
        int check = 0;

        while((strobj.indexOf(strB2.toString()))!=(strobj.lastIndexOf(strB2.toString())))
        {
            position = strobj.indexOf(strB2.toString());
            System.out.println("Small String is present at position "+ (position+check));
            strobj.delete(position, position+strB2.length());
            check = check+strB2.length();
        }

        position = strobj.indexOf(strB2.toString());
        System.out.println("Small String is present at position "+(position+check));
        strobj = strB1;

        //5. Delete the small string
        //If more then one time small string is present in large string then it will delete them too 
        while((strobj.indexOf(strB2.toString()))!=(strobj.lastIndexOf(strB2.toString())))
        {
            position = strobj.indexOf(strB2.toString());
            strobj.delete(position, position+strB2.length());
            check = check+strB2.length();
        }

        position = strobj.indexOf(strB2.toString());
        strobj.delete(position, position+strB2.length());
        check = check+strB2.length();
        System.out.println(strobj.toString());

        System.out.println(strB1.toString());


    }
}

2 ответа

Для копирования вы не хотите использовать оператор присваивания. Вместо этого вы хотите использовать конструктор копирования следующим образом:

strobj = new StringBuffer(strB1);

Вы также используете оператор присваивания в конструкторе копирования для Homwrk1_Q2

Homwork1_Q2(StringBuffer strobj_2)

Вы не только копируете содержимое StringBuffer, но также копируете ссылку на объект StringBuffer в какой-то другой StringBuffer. Согласно вашему коду это означает, что обе переменные strobj,strB1, указывают на одну и ту же область памяти. Изменение одного из них также изменит другое. Надеюсь, это поможет. Расскажи мне о своем мыслительном процессе!

Другие вопросы по тегам