Why does Arrays.asList(…).toArray().getClass() give different results in JDK 8 and 9? [duplicate]











up vote
32
down vote

favorite
2













This question already has an answer here:




  • array cast Java 8 vs Java 9

    2 answers




Why does the following condition return true with JDK 8, whereas it returns false with JDK 9?



String.class == Arrays.asList("a", "b").toArray().getClass()









share|improve this question















marked as duplicate by Michael java
Users with the  java badge can single-handedly close java questions as duplicates and reopen them as needed.

StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
1 min ago


This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.



















    up vote
    32
    down vote

    favorite
    2













    This question already has an answer here:




    • array cast Java 8 vs Java 9

      2 answers




    Why does the following condition return true with JDK 8, whereas it returns false with JDK 9?



    String.class == Arrays.asList("a", "b").toArray().getClass()









    share|improve this question















    marked as duplicate by Michael java
    Users with the  java badge can single-handedly close java questions as duplicates and reopen them as needed.

    StackExchange.ready(function() {
    if (StackExchange.options.isMobile) return;

    $('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
    var $hover = $(this).addClass('hover-bound'),
    $msg = $hover.siblings('.dupe-hammer-message');

    $hover.hover(
    function() {
    $hover.showInfoMessage('', {
    messageElement: $msg.clone().show(),
    transient: false,
    position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
    dismissable: false,
    relativeToBody: true
    });
    },
    function() {
    StackExchange.helpers.removeMessages();
    }
    );
    });
    });
    1 min ago


    This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

















      up vote
      32
      down vote

      favorite
      2









      up vote
      32
      down vote

      favorite
      2






      2






      This question already has an answer here:




      • array cast Java 8 vs Java 9

        2 answers




      Why does the following condition return true with JDK 8, whereas it returns false with JDK 9?



      String.class == Arrays.asList("a", "b").toArray().getClass()









      share|improve this question
















      This question already has an answer here:




      • array cast Java 8 vs Java 9

        2 answers




      Why does the following condition return true with JDK 8, whereas it returns false with JDK 9?



      String.class == Arrays.asList("a", "b").toArray().getClass()




      This question already has an answer here:




      • array cast Java 8 vs Java 9

        2 answers








      java java-8 java-9






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 8 mins ago









      Michael

      18.2k73268




      18.2k73268










      asked 12 hours ago









      Felix

      33617




      33617




      marked as duplicate by Michael java
      Users with the  java badge can single-handedly close java questions as duplicates and reopen them as needed.

      StackExchange.ready(function() {
      if (StackExchange.options.isMobile) return;

      $('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
      var $hover = $(this).addClass('hover-bound'),
      $msg = $hover.siblings('.dupe-hammer-message');

      $hover.hover(
      function() {
      $hover.showInfoMessage('', {
      messageElement: $msg.clone().show(),
      transient: false,
      position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
      dismissable: false,
      relativeToBody: true
      });
      },
      function() {
      StackExchange.helpers.removeMessages();
      }
      );
      });
      });
      1 min ago


      This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.






      marked as duplicate by Michael java
      Users with the  java badge can single-handedly close java questions as duplicates and reopen them as needed.

      StackExchange.ready(function() {
      if (StackExchange.options.isMobile) return;

      $('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
      var $hover = $(this).addClass('hover-bound'),
      $msg = $hover.siblings('.dupe-hammer-message');

      $hover.hover(
      function() {
      $hover.showInfoMessage('', {
      messageElement: $msg.clone().show(),
      transient: false,
      position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
      dismissable: false,
      relativeToBody: true
      });
      },
      function() {
      StackExchange.helpers.removeMessages();
      }
      );
      });
      });
      1 min ago


      This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.


























          3 Answers
          3






          active

          oldest

          votes

















          up vote
          40
          down vote













          The List type returned by asList is Arrays$ArrayList. The toArray method in JDK 8 on that class is:



          @Override
          public Object toArray() {
          return a.clone();
          }


          But in JDK 9+ it is:



          @Override
          public Object toArray() {
          return Arrays.copyOf(a, a.length, Object.class);
          }


          In both cases a String is passed to asList, but in the JDK 8 case it is cloned, which retains its array type (String), and in JDK 9+ it is copied using Arrays.copyOf with the explicit new array type of Object.



          This difference means that in JDK 8 Arrays.asList("a", "b").toArray().getClass() returns String and in JDK 9+ it returns Object, so in JDK 9+ your expression will evaluate to false.



          The reason for this change comes from JDK-6260652 with the motivation:




          The Collection documentation claims that



          collection.toArray()


          is "identical in function" to



          collection.toArray(new Object[0]);


          However, the implementation of Arrays.asList does not follow this: If created with an array of a subtype (e.g. String), its toArray() will return an array of the same type (because it use clone()) instead of an Object.



          If one later tries to store non-Strings (or whatever) in that array, an ArrayStoreException is thrown.




          So this change was made to fix the previous behaviour.





          If this is a problem for you, the related release note offers this as a work-around:




          If this problem occurs, rewrite the code to use the one-arg form toArray(T), and provide an instance of the desired array type. This will also eliminate the need for a cast.



          String array = list.toArray(new String[0]);






          share|improve this answer























          • It’s so funny that the ArrayList(Collection) constructor contains a protection against this misbehavior with reference to this bug report (it’s from 2005) for a long time now, whereas no-one came to the idea of fixing the misbehavior in the first place, apparently…
            – Holger
            17 mins ago


















          up vote
          9
          down vote













          I would say that this was a bug in JDK 8 and before that has been fixed.



          List<T>.toArray() was always declared as returning Object (see JavaDoc) - that it did in effect return String in a special case was a mistake.






          share|improve this answer

















          • 1




            That's incorrect. The method has always returned Object (just look at its return type declaration). It never violated its declared type. Instead it violated its documented runtime behaviour. The difference is a nuance, but an important one.
            – Konrad Rudolph
            46 mins ago












          • The JDK 9 release note on this change is here: oracle.com/technetwork/java/javase/…
            – Alan Bateman
            33 mins ago


















          up vote
          0
          down vote













          There are couple of reasons here



          1) It is a bug in JDK 8 where should return java.lang.Object but it is not and it is fixed in JDK 9+



          @Override
          public Object toArray() {
          return a.clone();
          }


          2) == operator is always used for reference comparison, so java.lang.String or java.lang.Object are objects which are singleton and immutable loaded at the time of JVM starts



          System.out.println(String.class.hashCode()); //2018699554
          System.out.println(Arrays.asList("a", "b").toArray().getClass().hashCode()); //2018699554





          share|improve this answer























          • String pools have nothing to do with what's going on here.
            – Boann
            9 hours ago










          • is that wrong java.lang.String is string object that created while JVM loading in object heap memory or String pool, is that wrong? String constants are stored in pool, objects are stored in heap @Boann
            – Deadpool
            9 hours ago








          • 2




            Nothing in the question is comparing any strings; it's comparing two java.lang.Class objects. Its behavior would be the same even if there were no such thing as the string constant pool.
            – Boann
            9 hours ago












          • sorry you are right, my intention is to explain == opeartor will always comapre references and java.lang.Object or java.lang.String objects are singleton and immutable and load at JVM starts @Boann
            – Deadpool
            9 hours ago










          • That == compares object references is true, but misses the point of the question. The behavior of the code in the question would be exactly the same if the two Class objects were being compared via .equals. Or simply running System.out.println(Arrays.asList(1, 2, 3).toArray()); also illustrates the behavior change between JDK 8 and JDK 9+.
            – Boann
            9 hours ago


















          3 Answers
          3






          active

          oldest

          votes








          3 Answers
          3






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          40
          down vote













          The List type returned by asList is Arrays$ArrayList. The toArray method in JDK 8 on that class is:



          @Override
          public Object toArray() {
          return a.clone();
          }


          But in JDK 9+ it is:



          @Override
          public Object toArray() {
          return Arrays.copyOf(a, a.length, Object.class);
          }


          In both cases a String is passed to asList, but in the JDK 8 case it is cloned, which retains its array type (String), and in JDK 9+ it is copied using Arrays.copyOf with the explicit new array type of Object.



          This difference means that in JDK 8 Arrays.asList("a", "b").toArray().getClass() returns String and in JDK 9+ it returns Object, so in JDK 9+ your expression will evaluate to false.



          The reason for this change comes from JDK-6260652 with the motivation:




          The Collection documentation claims that



          collection.toArray()


          is "identical in function" to



          collection.toArray(new Object[0]);


          However, the implementation of Arrays.asList does not follow this: If created with an array of a subtype (e.g. String), its toArray() will return an array of the same type (because it use clone()) instead of an Object.



          If one later tries to store non-Strings (or whatever) in that array, an ArrayStoreException is thrown.




          So this change was made to fix the previous behaviour.





          If this is a problem for you, the related release note offers this as a work-around:




          If this problem occurs, rewrite the code to use the one-arg form toArray(T), and provide an instance of the desired array type. This will also eliminate the need for a cast.



          String array = list.toArray(new String[0]);






          share|improve this answer























          • It’s so funny that the ArrayList(Collection) constructor contains a protection against this misbehavior with reference to this bug report (it’s from 2005) for a long time now, whereas no-one came to the idea of fixing the misbehavior in the first place, apparently…
            – Holger
            17 mins ago















          up vote
          40
          down vote













          The List type returned by asList is Arrays$ArrayList. The toArray method in JDK 8 on that class is:



          @Override
          public Object toArray() {
          return a.clone();
          }


          But in JDK 9+ it is:



          @Override
          public Object toArray() {
          return Arrays.copyOf(a, a.length, Object.class);
          }


          In both cases a String is passed to asList, but in the JDK 8 case it is cloned, which retains its array type (String), and in JDK 9+ it is copied using Arrays.copyOf with the explicit new array type of Object.



          This difference means that in JDK 8 Arrays.asList("a", "b").toArray().getClass() returns String and in JDK 9+ it returns Object, so in JDK 9+ your expression will evaluate to false.



          The reason for this change comes from JDK-6260652 with the motivation:




          The Collection documentation claims that



          collection.toArray()


          is "identical in function" to



          collection.toArray(new Object[0]);


          However, the implementation of Arrays.asList does not follow this: If created with an array of a subtype (e.g. String), its toArray() will return an array of the same type (because it use clone()) instead of an Object.



          If one later tries to store non-Strings (or whatever) in that array, an ArrayStoreException is thrown.




          So this change was made to fix the previous behaviour.





          If this is a problem for you, the related release note offers this as a work-around:




          If this problem occurs, rewrite the code to use the one-arg form toArray(T), and provide an instance of the desired array type. This will also eliminate the need for a cast.



          String array = list.toArray(new String[0]);






          share|improve this answer























          • It’s so funny that the ArrayList(Collection) constructor contains a protection against this misbehavior with reference to this bug report (it’s from 2005) for a long time now, whereas no-one came to the idea of fixing the misbehavior in the first place, apparently…
            – Holger
            17 mins ago













          up vote
          40
          down vote










          up vote
          40
          down vote









          The List type returned by asList is Arrays$ArrayList. The toArray method in JDK 8 on that class is:



          @Override
          public Object toArray() {
          return a.clone();
          }


          But in JDK 9+ it is:



          @Override
          public Object toArray() {
          return Arrays.copyOf(a, a.length, Object.class);
          }


          In both cases a String is passed to asList, but in the JDK 8 case it is cloned, which retains its array type (String), and in JDK 9+ it is copied using Arrays.copyOf with the explicit new array type of Object.



          This difference means that in JDK 8 Arrays.asList("a", "b").toArray().getClass() returns String and in JDK 9+ it returns Object, so in JDK 9+ your expression will evaluate to false.



          The reason for this change comes from JDK-6260652 with the motivation:




          The Collection documentation claims that



          collection.toArray()


          is "identical in function" to



          collection.toArray(new Object[0]);


          However, the implementation of Arrays.asList does not follow this: If created with an array of a subtype (e.g. String), its toArray() will return an array of the same type (because it use clone()) instead of an Object.



          If one later tries to store non-Strings (or whatever) in that array, an ArrayStoreException is thrown.




          So this change was made to fix the previous behaviour.





          If this is a problem for you, the related release note offers this as a work-around:




          If this problem occurs, rewrite the code to use the one-arg form toArray(T), and provide an instance of the desired array type. This will also eliminate the need for a cast.



          String array = list.toArray(new String[0]);






          share|improve this answer














          The List type returned by asList is Arrays$ArrayList. The toArray method in JDK 8 on that class is:



          @Override
          public Object toArray() {
          return a.clone();
          }


          But in JDK 9+ it is:



          @Override
          public Object toArray() {
          return Arrays.copyOf(a, a.length, Object.class);
          }


          In both cases a String is passed to asList, but in the JDK 8 case it is cloned, which retains its array type (String), and in JDK 9+ it is copied using Arrays.copyOf with the explicit new array type of Object.



          This difference means that in JDK 8 Arrays.asList("a", "b").toArray().getClass() returns String and in JDK 9+ it returns Object, so in JDK 9+ your expression will evaluate to false.



          The reason for this change comes from JDK-6260652 with the motivation:




          The Collection documentation claims that



          collection.toArray()


          is "identical in function" to



          collection.toArray(new Object[0]);


          However, the implementation of Arrays.asList does not follow this: If created with an array of a subtype (e.g. String), its toArray() will return an array of the same type (because it use clone()) instead of an Object.



          If one later tries to store non-Strings (or whatever) in that array, an ArrayStoreException is thrown.




          So this change was made to fix the previous behaviour.





          If this is a problem for you, the related release note offers this as a work-around:




          If this problem occurs, rewrite the code to use the one-arg form toArray(T), and provide an instance of the desired array type. This will also eliminate the need for a cast.



          String array = list.toArray(new String[0]);







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 7 mins ago









          Michael

          18.2k73268




          18.2k73268










          answered 12 hours ago









          Jorn Vernee

          19.6k33256




          19.6k33256












          • It’s so funny that the ArrayList(Collection) constructor contains a protection against this misbehavior with reference to this bug report (it’s from 2005) for a long time now, whereas no-one came to the idea of fixing the misbehavior in the first place, apparently…
            – Holger
            17 mins ago


















          • It’s so funny that the ArrayList(Collection) constructor contains a protection against this misbehavior with reference to this bug report (it’s from 2005) for a long time now, whereas no-one came to the idea of fixing the misbehavior in the first place, apparently…
            – Holger
            17 mins ago
















          It’s so funny that the ArrayList(Collection) constructor contains a protection against this misbehavior with reference to this bug report (it’s from 2005) for a long time now, whereas no-one came to the idea of fixing the misbehavior in the first place, apparently…
          – Holger
          17 mins ago




          It’s so funny that the ArrayList(Collection) constructor contains a protection against this misbehavior with reference to this bug report (it’s from 2005) for a long time now, whereas no-one came to the idea of fixing the misbehavior in the first place, apparently…
          – Holger
          17 mins ago












          up vote
          9
          down vote













          I would say that this was a bug in JDK 8 and before that has been fixed.



          List<T>.toArray() was always declared as returning Object (see JavaDoc) - that it did in effect return String in a special case was a mistake.






          share|improve this answer

















          • 1




            That's incorrect. The method has always returned Object (just look at its return type declaration). It never violated its declared type. Instead it violated its documented runtime behaviour. The difference is a nuance, but an important one.
            – Konrad Rudolph
            46 mins ago












          • The JDK 9 release note on this change is here: oracle.com/technetwork/java/javase/…
            – Alan Bateman
            33 mins ago















          up vote
          9
          down vote













          I would say that this was a bug in JDK 8 and before that has been fixed.



          List<T>.toArray() was always declared as returning Object (see JavaDoc) - that it did in effect return String in a special case was a mistake.






          share|improve this answer

















          • 1




            That's incorrect. The method has always returned Object (just look at its return type declaration). It never violated its declared type. Instead it violated its documented runtime behaviour. The difference is a nuance, but an important one.
            – Konrad Rudolph
            46 mins ago












          • The JDK 9 release note on this change is here: oracle.com/technetwork/java/javase/…
            – Alan Bateman
            33 mins ago













          up vote
          9
          down vote










          up vote
          9
          down vote









          I would say that this was a bug in JDK 8 and before that has been fixed.



          List<T>.toArray() was always declared as returning Object (see JavaDoc) - that it did in effect return String in a special case was a mistake.






          share|improve this answer












          I would say that this was a bug in JDK 8 and before that has been fixed.



          List<T>.toArray() was always declared as returning Object (see JavaDoc) - that it did in effect return String in a special case was a mistake.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 12 hours ago









          Thomas Kläger

          5,8992717




          5,8992717








          • 1




            That's incorrect. The method has always returned Object (just look at its return type declaration). It never violated its declared type. Instead it violated its documented runtime behaviour. The difference is a nuance, but an important one.
            – Konrad Rudolph
            46 mins ago












          • The JDK 9 release note on this change is here: oracle.com/technetwork/java/javase/…
            – Alan Bateman
            33 mins ago














          • 1




            That's incorrect. The method has always returned Object (just look at its return type declaration). It never violated its declared type. Instead it violated its documented runtime behaviour. The difference is a nuance, but an important one.
            – Konrad Rudolph
            46 mins ago












          • The JDK 9 release note on this change is here: oracle.com/technetwork/java/javase/…
            – Alan Bateman
            33 mins ago








          1




          1




          That's incorrect. The method has always returned Object (just look at its return type declaration). It never violated its declared type. Instead it violated its documented runtime behaviour. The difference is a nuance, but an important one.
          – Konrad Rudolph
          46 mins ago






          That's incorrect. The method has always returned Object (just look at its return type declaration). It never violated its declared type. Instead it violated its documented runtime behaviour. The difference is a nuance, but an important one.
          – Konrad Rudolph
          46 mins ago














          The JDK 9 release note on this change is here: oracle.com/technetwork/java/javase/…
          – Alan Bateman
          33 mins ago




          The JDK 9 release note on this change is here: oracle.com/technetwork/java/javase/…
          – Alan Bateman
          33 mins ago










          up vote
          0
          down vote













          There are couple of reasons here



          1) It is a bug in JDK 8 where should return java.lang.Object but it is not and it is fixed in JDK 9+



          @Override
          public Object toArray() {
          return a.clone();
          }


          2) == operator is always used for reference comparison, so java.lang.String or java.lang.Object are objects which are singleton and immutable loaded at the time of JVM starts



          System.out.println(String.class.hashCode()); //2018699554
          System.out.println(Arrays.asList("a", "b").toArray().getClass().hashCode()); //2018699554





          share|improve this answer























          • String pools have nothing to do with what's going on here.
            – Boann
            9 hours ago










          • is that wrong java.lang.String is string object that created while JVM loading in object heap memory or String pool, is that wrong? String constants are stored in pool, objects are stored in heap @Boann
            – Deadpool
            9 hours ago








          • 2




            Nothing in the question is comparing any strings; it's comparing two java.lang.Class objects. Its behavior would be the same even if there were no such thing as the string constant pool.
            – Boann
            9 hours ago












          • sorry you are right, my intention is to explain == opeartor will always comapre references and java.lang.Object or java.lang.String objects are singleton and immutable and load at JVM starts @Boann
            – Deadpool
            9 hours ago










          • That == compares object references is true, but misses the point of the question. The behavior of the code in the question would be exactly the same if the two Class objects were being compared via .equals. Or simply running System.out.println(Arrays.asList(1, 2, 3).toArray()); also illustrates the behavior change between JDK 8 and JDK 9+.
            – Boann
            9 hours ago















          up vote
          0
          down vote













          There are couple of reasons here



          1) It is a bug in JDK 8 where should return java.lang.Object but it is not and it is fixed in JDK 9+



          @Override
          public Object toArray() {
          return a.clone();
          }


          2) == operator is always used for reference comparison, so java.lang.String or java.lang.Object are objects which are singleton and immutable loaded at the time of JVM starts



          System.out.println(String.class.hashCode()); //2018699554
          System.out.println(Arrays.asList("a", "b").toArray().getClass().hashCode()); //2018699554





          share|improve this answer























          • String pools have nothing to do with what's going on here.
            – Boann
            9 hours ago










          • is that wrong java.lang.String is string object that created while JVM loading in object heap memory or String pool, is that wrong? String constants are stored in pool, objects are stored in heap @Boann
            – Deadpool
            9 hours ago








          • 2




            Nothing in the question is comparing any strings; it's comparing two java.lang.Class objects. Its behavior would be the same even if there were no such thing as the string constant pool.
            – Boann
            9 hours ago












          • sorry you are right, my intention is to explain == opeartor will always comapre references and java.lang.Object or java.lang.String objects are singleton and immutable and load at JVM starts @Boann
            – Deadpool
            9 hours ago










          • That == compares object references is true, but misses the point of the question. The behavior of the code in the question would be exactly the same if the two Class objects were being compared via .equals. Or simply running System.out.println(Arrays.asList(1, 2, 3).toArray()); also illustrates the behavior change between JDK 8 and JDK 9+.
            – Boann
            9 hours ago













          up vote
          0
          down vote










          up vote
          0
          down vote









          There are couple of reasons here



          1) It is a bug in JDK 8 where should return java.lang.Object but it is not and it is fixed in JDK 9+



          @Override
          public Object toArray() {
          return a.clone();
          }


          2) == operator is always used for reference comparison, so java.lang.String or java.lang.Object are objects which are singleton and immutable loaded at the time of JVM starts



          System.out.println(String.class.hashCode()); //2018699554
          System.out.println(Arrays.asList("a", "b").toArray().getClass().hashCode()); //2018699554





          share|improve this answer














          There are couple of reasons here



          1) It is a bug in JDK 8 where should return java.lang.Object but it is not and it is fixed in JDK 9+



          @Override
          public Object toArray() {
          return a.clone();
          }


          2) == operator is always used for reference comparison, so java.lang.String or java.lang.Object are objects which are singleton and immutable loaded at the time of JVM starts



          System.out.println(String.class.hashCode()); //2018699554
          System.out.println(Arrays.asList("a", "b").toArray().getClass().hashCode()); //2018699554






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 6 mins ago









          Michael

          18.2k73268




          18.2k73268










          answered 10 hours ago









          Deadpool

          3,2582324




          3,2582324












          • String pools have nothing to do with what's going on here.
            – Boann
            9 hours ago










          • is that wrong java.lang.String is string object that created while JVM loading in object heap memory or String pool, is that wrong? String constants are stored in pool, objects are stored in heap @Boann
            – Deadpool
            9 hours ago








          • 2




            Nothing in the question is comparing any strings; it's comparing two java.lang.Class objects. Its behavior would be the same even if there were no such thing as the string constant pool.
            – Boann
            9 hours ago












          • sorry you are right, my intention is to explain == opeartor will always comapre references and java.lang.Object or java.lang.String objects are singleton and immutable and load at JVM starts @Boann
            – Deadpool
            9 hours ago










          • That == compares object references is true, but misses the point of the question. The behavior of the code in the question would be exactly the same if the two Class objects were being compared via .equals. Or simply running System.out.println(Arrays.asList(1, 2, 3).toArray()); also illustrates the behavior change between JDK 8 and JDK 9+.
            – Boann
            9 hours ago


















          • String pools have nothing to do with what's going on here.
            – Boann
            9 hours ago










          • is that wrong java.lang.String is string object that created while JVM loading in object heap memory or String pool, is that wrong? String constants are stored in pool, objects are stored in heap @Boann
            – Deadpool
            9 hours ago








          • 2




            Nothing in the question is comparing any strings; it's comparing two java.lang.Class objects. Its behavior would be the same even if there were no such thing as the string constant pool.
            – Boann
            9 hours ago












          • sorry you are right, my intention is to explain == opeartor will always comapre references and java.lang.Object or java.lang.String objects are singleton and immutable and load at JVM starts @Boann
            – Deadpool
            9 hours ago










          • That == compares object references is true, but misses the point of the question. The behavior of the code in the question would be exactly the same if the two Class objects were being compared via .equals. Or simply running System.out.println(Arrays.asList(1, 2, 3).toArray()); also illustrates the behavior change between JDK 8 and JDK 9+.
            – Boann
            9 hours ago
















          String pools have nothing to do with what's going on here.
          – Boann
          9 hours ago




          String pools have nothing to do with what's going on here.
          – Boann
          9 hours ago












          is that wrong java.lang.String is string object that created while JVM loading in object heap memory or String pool, is that wrong? String constants are stored in pool, objects are stored in heap @Boann
          – Deadpool
          9 hours ago






          is that wrong java.lang.String is string object that created while JVM loading in object heap memory or String pool, is that wrong? String constants are stored in pool, objects are stored in heap @Boann
          – Deadpool
          9 hours ago






          2




          2




          Nothing in the question is comparing any strings; it's comparing two java.lang.Class objects. Its behavior would be the same even if there were no such thing as the string constant pool.
          – Boann
          9 hours ago






          Nothing in the question is comparing any strings; it's comparing two java.lang.Class objects. Its behavior would be the same even if there were no such thing as the string constant pool.
          – Boann
          9 hours ago














          sorry you are right, my intention is to explain == opeartor will always comapre references and java.lang.Object or java.lang.String objects are singleton and immutable and load at JVM starts @Boann
          – Deadpool
          9 hours ago




          sorry you are right, my intention is to explain == opeartor will always comapre references and java.lang.Object or java.lang.String objects are singleton and immutable and load at JVM starts @Boann
          – Deadpool
          9 hours ago












          That == compares object references is true, but misses the point of the question. The behavior of the code in the question would be exactly the same if the two Class objects were being compared via .equals. Or simply running System.out.println(Arrays.asList(1, 2, 3).toArray()); also illustrates the behavior change between JDK 8 and JDK 9+.
          – Boann
          9 hours ago




          That == compares object references is true, but misses the point of the question. The behavior of the code in the question would be exactly the same if the two Class objects were being compared via .equals. Or simply running System.out.println(Arrays.asList(1, 2, 3).toArray()); also illustrates the behavior change between JDK 8 and JDK 9+.
          – Boann
          9 hours ago



          Popular posts from this blog

          What visual should I use to simply compare current year value vs last year in Power BI desktop

          How to ignore python UserWarning in pytest?

          Alexandru Averescu