Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Strange things with java...

Reply
Thread Tools

Strange things with java...

 
 
Roberto Nicastro
Guest
Posts: n/a
 
      05-11-2007

Hi all,
i have this piece of code

Suppose that lstA is List of 3 Objects

List<Object> lstA = ...something;
List<Object> lstB = lstA;
....
[block A] //this is a block of code
....

Inside block A i remove one item from lstA, so lstA become a List of 2
Objects. Inside block A i never touch lstB.
Why at the end of block A also lstB is with 2 elements? How is this
possible?

Thanks in advance

R

 
Reply With Quote
 
 
 
 
Patricia Shanahan
Guest
Posts: n/a
 
      05-11-2007
Roberto Nicastro wrote:
> Hi all,
> i have this piece of code
>
> Suppose that lstA is List of 3 Objects
>
> List<Object> lstA = ...something;
> List<Object> lstB = lstA;
> ...
> [block A] //this is a block of code
> ...
>
> Inside block A i remove one item from lstA, so lstA become a List of 2
> Objects. Inside block A i never touch lstB.
> Why at the end of block A also lstB is with 2 elements? How is this
> possible?


Neither lstA nor lstB is a list. They are both reference variables that
are initialized as pointers to the same List object.

Although block A does not touch lstB, it does remove an element from the
List it points to.

Patricia
 
Reply With Quote
 
 
 
 
Richard Senior
Guest
Posts: n/a
 
      05-11-2007
Roberto Nicastro wrote:

> Suppose that lstA is List of 3 Objects
>
> List<Object> lstA = ...something;
> List<Object> lstB = lstA;
> ...
> [block A] //this is a block of code
> ...
>
> Inside block A i remove one item from lstA, so lstA become a List of 2
> Objects. Inside block A i never touch lstB.
> Why at the end of block A also lstB is with 2 elements? How is this
> possible?


Because lstA and lstB are pointers. All objects are. When you assign
lstB = lstA, you make lstB point at the same list; you make lstB ==
lstA. Perhaps what you wanted to do was make lstB a copy of lstA? Or
perhaps you wanted to go further and make lstB a copy of lstA and all
its members copies of the members in lstA? Have you thought about what
happens if you change an object in either list?

--
Regards,

Richard
 
Reply With Quote
 
Raghav
Guest
Posts: n/a
 
      05-11-2007
On May 11, 10:51 pm, Roberto Nicastro <(E-Mail Removed)> wrote:
> Hi all,
> i have this piece of code
>
> Suppose that lstA is List of 3 Objects
>
> List<Object> lstA = ...something;
> List<Object> lstB = lstA;
> ...
> [block A] //this is a block of code
> ...
>
> Inside block A i remove one item from lstA, so lstA become a List of 2
> Objects. Inside block A i never touch lstB.
> Why at the end of block A also lstB is with 2 elements? How is this
> possible?
>
> Thanks in advance
>
> R


Actually here you have got one list in memory and 2 references to
that. So when u modify the list, it is reflected in either of
references pointing to that List.
HTH.

 
Reply With Quote
 
Eric Sosman
Guest
Posts: n/a
 
      05-11-2007
Roberto Nicastro wrote On 05/11/07 13:51,:
> Hi all,
> i have this piece of code
>
> Suppose that lstA is List of 3 Objects
>
> List<Object> lstA = ...something;
> List<Object> lstB = lstA;
> ...
> [block A] //this is a block of code
> ...
>
> Inside block A i remove one item from lstA, so lstA become a List of 2
> Objects. Inside block A i never touch lstB.
> Why at the end of block A also lstB is with 2 elements? How is this
> possible?


An analogy (I love analogies!) that may help you
understand what others have pointed out: lstA is the
number on the debit card in your wallet, and lstB is
the same string of digits recorded in your password-
protected on-line form-filler assistant. In [block A]
you hand the card to a local merchant to pay for your
new jPea, 150 silver splonders including VAT. Then
you go to your computer, use the automatic form-filler
to log in to your bank account, and check the balance.
Are the 150 silver splonders still there to be spent?

One bank account, two copies of the account number.
One List instance, two references to it. Spend money
with the debit card, and the balance change is visible
when you use the copied number. Change the List via
listA, and the change is visible through listB.

--
http://www.velocityreviews.com/forums/(E-Mail Removed)
 
Reply With Quote
 
Roberto Nicastro
Guest
Posts: n/a
 
      05-12-2007
On 11 Mag, 20:17, Richard Senior <(E-Mail Removed)> wrote:

> lstA. Perhaps what you wanted to do was make lstB a copy of lstA? Or
> perhaps you wanted to go further and make lstB a copy of lstA and all
> its members copies of the members in lstA? Have you thought about what
> happens if you change an object in either list?
>
> --
> Regards,
>
> Richard


I want to create an exact copy of lstA. So, to create a real copy i
have to create a new List object

List lstA = ...something
List lstB = new ArrayList();

for (Iterator it; it = lstA.iterator(); it.hasNext(); ){
lstB.add(it.next());
}

I think this will work for me.
Thank you all

R

 
Reply With Quote
 
Richard Senior
Guest
Posts: n/a
 
      05-12-2007
Roberto Nicastro wrote:

> I want to create an exact copy of lstA. So, to create a real copy i
> have to create a new List object
>
> List lstA = ...something
> List lstB = new ArrayList();
>
> for (Iterator it; it = lstA.iterator(); it.hasNext(); ){
> lstB.add(it.next());
> }
>
> I think this will work for me.


Yes, but bear in mind that the two lists, while they are different
lists, contain the same elements. If you change an object in lstA, it
also changes in lstB.

Have a look at this
http://forum.java.sun.com/thread.jsp...sageID=2281852
and do some searches on "shallow copy" and "deep copy".

--
Regards,

Richard
 
Reply With Quote
 
Jussi Piitulainen
Guest
Posts: n/a
 
      05-12-2007
Roberto Nicastro writes:

> I want to create an exact copy of lstA. So, to create a real copy i
> have to create a new List object
>
> List lstA = ...something
> List lstB = new ArrayList();
>
> for (Iterator it; it = lstA.iterator(); it.hasNext(); ){
> lstB.add(it.next());
> }
>
> I think this will work for me.


There's an addAll method you could use instead of a loop of your own:

List lstB = new ArrayList();
lstB.addAll(lstA);

Look it up in Javadoc.
 
Reply With Quote
 
Patricia Shanahan
Guest
Posts: n/a
 
      05-12-2007
Jussi Piitulainen wrote:
> Roberto Nicastro writes:
>
>> I want to create an exact copy of lstA. So, to create a real copy i
>> have to create a new List object
>>
>> List lstA = ...something
>> List lstB = new ArrayList();
>>
>> for (Iterator it; it = lstA.iterator(); it.hasNext(); ){
>> lstB.add(it.next());
>> }
>>
>> I think this will work for me.

>
> There's an addAll method you could use instead of a loop of your own:
>
> List lstB = new ArrayList();
> lstB.addAll(lstA);
>
> Look it up in Javadoc.


Or, even simpler:

List lstB = new ArrayList(lstA);

Patricia
 
Reply With Quote
 
Chris Smith
Guest
Posts: n/a
 
      05-12-2007
Roberto Nicastro <(E-Mail Removed)> wrote:
> List<Object> lstA = ...something;
> List<Object> lstB = lstA;


While you've got several explanations of what's going on, you haven't
gotten much by way of how to make it act as you'd like. To do that, you
could change the second line there to:

List<Object> lstB = new ArrayList(lstA); // or other List implementation

That would cause lstB to point to a different List, which has its
CONTENTS initialized from the list that lstA points to. Then you could
modify the list that lstA points to, and the list that lstB points to
would be unchanged.

--
Chris Smith
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
vs2005 publish website doing bad things, bad things =?Utf-8?B?V2lsbGlhbSBTdWxsaXZhbg==?= ASP .Net 1 10-25-2006 06:18 PM
ASP.NET does strange things =?Utf-8?B?R2FyeQ==?= ASP .Net 6 05-05-2005 11:20 AM
Validating SAX parser still reads whitespace/does strange things. badgerduke@gmail.com Java 1 01-07-2005 04:32 PM
IIS Security strange things Alexey Smirnov ASP .Net 4 03-03-2004 07:48 AM
OT: strange things that people search for Toby A Inkster HTML 10 02-09-2004 10:17 PM



Advertisments