java – 创建了多少个对象

前端之家收集整理的这篇文章主要介绍了java – 创建了多少个对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在讨论如何在 Java中使用Strings和StringBuffers.在这两个例子的每一个中创建了多少个对象?

例1:

  1. String s = "a";
  2. s = s + "b";
  3. s = s + "c";

例2:

  1. StringBuilder sb = new StringBuilder("a");
  2. sb.append("b");
  3. sb.append("c");

在我看来,Ex 1将创建5,而Ex 2将创建4个对象.

解决方法

您可以通过分析java字节码来确定答案(使用javap -c).示例1创建了两个StringBuilder对象(参见第4行)和两个String对象(参见第7行),而示例2创建了一个StringBuilder对象(参见第2行).

请注意,您还必须考虑char []对象(因为数组是Java中的对象). String和StringBuilder对象都使用底层char []实现.因此,示例1创建了八个对象,示例2创建了两个对象.

例1:

  1. public static void main(java.lang.String[]);
  2. Code:
  3. 0: ldc #2; //String a
  4. 2: astore_1
  5. 3: new #3; //class java/lang/StringBuilder
  6. 6: dup
  7. 7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
  8. 10: aload_1
  9. 11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  10. 14: ldc #6; //String b
  11. 16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  12. 19: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  13. 22: astore_1
  14. 23: new #3; //class java/lang/StringBuilder
  15. 26: dup
  16. 27: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
  17. 30: aload_1
  18. 31: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  19. 34: ldc #8; //String c
  20. 36: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  21. 39: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  22. 42: astore_1
  23. 43: return
  24. }

例2:

  1. public static void main(java.lang.String[]);
  2. Code:
  3. 0: new #2; //class java/lang/StringBuilder
  4. 3: dup
  5. 4: ldc #3; //String a
  6. 6: invokespecial #4; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
  7. 9: astore_1
  8. 10: aload_1
  9. 11: ldc #5; //String b
  10. 13: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  11. 16: pop
  12. 17: aload_1
  13. 18: ldc #7; //String c
  14. 20: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  15. 23: pop
  16. 24: return
  17. }

猜你在找的Java相关文章