• Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

StringBuilder unexpected result

 
Sergej Smoljanov
Ranch Hand
Posts: 467
10
  • Likes 1
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

i expect after metod (line 15) insert result of StringBuilder object is "thethe system!the system! system!the system!"
but result "thethethethethethethethet system!the system!"
if i change code to this
all work as expected.
and
i get expected result. What is problem with first code?
how did metod insert() work in first list of code?
 
Roel De Nijs
Sheriff
Posts: 10662
144
AngularJS Chrome Eclipse IDE Hibernate Java jQuery MySQL Database Spring Tomcat Server
  • Likes 2
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
You pass the same mutable instance of StringBuilder to the insert-method. So while the insert-method is executed, the content of the StringBuilder (and thus what you are trying to insert) changes during the exection of the insert-method, because both (the object you invoked the method and the 2nd parameter of the insert-method) refer to the same object. If you change the 2nd parameter of the insert-method to another object (e.g. a String, like in your 2nd code listing or another StringBuilder like in this code listing) you have the expected result.


When you zoom in to the actual problem, you can start with this example:


Values for offset followed by what's printed
  • 0 or 3: abcabc
  • 1: aaaabc
  • 2: ababac


  • If you really want going to the bone, it's this method you have to take a close look to:


    The line marked with #1 is the one responsible for what you see. But bottom line of this story: you invoke the method on the object that you are also passing as a parameter. And that gives the not so expected (strange) behavior.

    Hope it helps!
     
    Paul Clapham
    Sheriff
    Posts: 21583
    33
    Eclipse IDE Firefox Browser MySQL Database
    • Likes 2
    • Mark post as helpful
    • send pies
    • Quote
    • Report post to moderator
    I have to say that I found that surprising too. Here's my simplest version of your code:



    So I looked at the relevant API documentation, which turned out to be the method public StringBuilder insert(int dstOffset, CharSequence s, int start, int end). Since both StringBuilder and String implement CharSequence, this should describe what happens for both types of object. So what makes them different? The documentation describes very carefully how it works:

    The character at index k in this sequence becomes equal to:

    the character at index k in this sequence, if k is less than dstOffset
    the character at index k+start-dstOffset in the argument s, if k is greater than or equal to dstOffset but is less than dstOffset+end-start
    the character at index k-(end-start) in this sequence, if k is greater than or equal to dstOffset+end-start


    So the first three characters in the result are "123" according to the first of those three rules. Then the second rule kicks in and starts inserting characters. The first three are copied from the CharSequence and they are "123" in both cases. The fourth is also copied from the CharSequence but here's where the difference arises. When you're inserting the StringBuilder, that character is copied from the fourth character of the StringBuilder, which is now "1" because we just inserted "1" into the fourth position. Whereas when you're inserting the String copied from the StringBuilder, that character is copied from the fourth character of the String, which is still "4".

    Therefore, what you're seeing is strange but correct, according to a close reading of the documentation. At least in my opinion it is.


     
    Sergej Smoljanov
    Ranch Hand
    Posts: 467
    10
    • Mark post as helpful
    • send pies
    • Quote
    • Report post to moderator
    thanks now i understand.
     
    Paul Clapham
    Sheriff
    Posts: 21583
    33
    Eclipse IDE Firefox Browser MySQL Database
    • Mark post as helpful
    • send pies
    • Quote
    • Report post to moderator
    Cool example by the way. I've been working with Java for over a decade and I never encountered this before.
     
    Roel De Nijs
    Sheriff
    Posts: 10662
    144
    AngularJS Chrome Eclipse IDE Hibernate Java jQuery MySQL Database Spring Tomcat Server
    • Likes 1
    • Mark post as helpful
    • send pies
    • Quote
    • Report post to moderator
    Paul Clapham wrote:Cool example by the way. I've been working with Java for over a decade and I never encountered this before.

    I agree! Have a cow Sergej for sharing this cool example.
     
    • Post Reply
    • Bookmark Topic Watch Topic
    • New Topic