JAVA面试题解惑系列(二)——到底创建了几个String对象?
我们首先来看一段代码:
1. String str=new String("abc"); 2. String str=new String("abc");3.
1. public String(String original) { 2. //other code ... 3. } 4. public String(String original) {5. //other code ...6. }7.
1. String str="abc";
1. String a="abc"; 2. String b="abc";
1. String a="ab"+"cd";
1. public class StringTest { 2. public static void main(String[] args) { 3. String a = "ab";// 创建了一个对象,并加入字符串池中 4. System.out.println("String a = "ab";"); 5. String b = "cd";// 创建了一个对象,并加入字符串池中 6. System.out.println("String b = "cd";"); 7. String c = "abcd";// 创建了一个对象,并加入字符串池中 8. 9. String d = "ab" + "cd"; 10. // 如果d和c指向了同一个对象,则说明d也被加入了字符串池 11. if (d == c) { 12. System.out.println(""ab"+"cd" 创建的对象 "加入了" 字符串池中"); 13. } 14. // 如果d和c没有指向了同一个对象,则说明d没有被加入字符串池 15. else { 16. System.out.println(""ab"+"cd" 创建的对象 "没加入" 字符串池中"); 17. } 18. 19. String e = a + "cd"; 20. // 如果e和c指向了同一个对象,则说明e也被加入了字符串池 21. if (e == c) { 22. System.out.println(" a +"cd" 创建的对象 "加入了" 字符串池中"); 23. } 24. // 如果e和c没有指向了同一个对象,则说明e没有被加入字符串池 25. else { 26. System.out.println(" a +"cd" 创建的对象 "没加入" 字符串池中"); 27. } 28. 29. String f = "ab" + b; 30. // 如果f和c指向了同一个对象,则说明f也被加入了字符串池 31. if (f == c) { 32. System.out.println(""ab"+ b 创建的对象 "加入了" 字符串池中"); 33. } 34. // 如果f和c没有指向了同一个对象,则说明f没有被加入字符串池 35. else { 36. System.out.println(""ab"+ b 创建的对象 "没加入" 字符串池中"); 37. } 38. 39. String g = a + b; 40. // 如果g和c指向了同一个对象,则说明g也被加入了字符串池 41. if (g == c) { 42. System.out.println(" a + b 创建的对象 "加入了" 字符串池中"); 43. } 44. // 如果g和c没有指向了同一个对象,则说明g没有被加入字符串池 45. else { 46. System.out.println(" a + b 创建的对象 "没加入" 字符串池中"); 47. } 48. } 49. } 50. public class StringTest {51. public static void main(String[] args) {52. String a = "ab";// 创建了一个对象,并加入字符串池中53. System.out.println("String a = "ab";");54. String b = "cd";// 创建了一个对象,并加入字符串池中55. System.out.println("String b = "cd";");56. String c = "abcd";// 创建了一个对象,并加入字符串池中57. String d = "ab" + "cd";58. // 如果d和c指向了同一个对象,则说明d也被加入了字符串池59. if (d == c) {60. System.out.println(""ab"+"cd" 创建的对象 "加入了" 字符串池中");61. }62. // 如果d和c没有指向了同一个对象,则说明d没有被加入字符串池63. else {64. System.out.println(""ab"+"cd" 创建的对象 "没加入" 字符串池中");65. }66. String e = a + "cd";67. // 如果e和c指向了同一个对象,则说明e也被加入了字符串池68. if (e == c) {69. System.out.println(" a +"cd" 创建的对象 "加入了" 字符串池中");70. }71. // 如果e和c没有指向了同一个对象,则说明e没有被加入字符串池72. else {73. System.out.println(" a +"cd" 创建的对象 "没加入" 字符串池中");74. }75. String f = "ab" + b;76. // 如果f和c指向了同一个对象,则说明f也被加入了字符串池77. if (f == c) {78. System.out.println(""ab"+ b 创建的对象 "加入了" 字符串池中");79. }80. // 如果f和c没有指向了同一个对象,则说明f没有被加入字符串池81. else {82. System.out.println(""ab"+ b 创建的对象 "没加入" 字符串池中");83. }84. String g = a + b;85. // 如果g和c指向了同一个对象,则说明g也被加入了字符串池86. if (g == c) {87. System.out.println(" a + b 创建的对象 "加入了" 字符串池中");88. }89. // 如果g和c没有指向了同一个对象,则说明g没有被加入字符串池90. else {91. System.out.println(" a + b 创建的对象 "没加入" 字符串池中");92. }93. }94. }
1. public class StringStaticTest { 2. // 常量A 3. public static final String A = "ab"; 4. 5. // 常量B 6. public static final String B = "cd"; 7. 8. public static void main(String[] args) { 9. // 将两个常量用+连接对s进行初始化 10. String s = A + B; 11. String t = "abcd"; 12. if (s == t) { 13. System.out.println("s等于t,它们是同一个对象"); 14. } else { 15. System.out.println("s不等于t,它们不是同一个对象"); 16. } 17. } 18. } 19. public class StringStaticTest {20. // 常量A21. public static final String A = "ab";22. // 常量B23. public static final String B = "cd";24. public static void main(String[] args) {25. // 将两个常量用+连接对s进行初始化26. String s = A + B;27. String t = "abcd";28. if (s == t) {29. System.out.println("s等于t,它们是同一个对象");30. } else {31. System.out.println("s不等于t,它们不是同一个对象");32. }33. }34. }
1. public class StringStaticTest { 2. // 常量A 3. public static final String A; 4. 5. // 常量B 6. public static final String B; 7. 8. static { 9. A = "ab"; 10. B = "cd"; 11. } 12. 13. public static void main(String[] args) { 14. // 将两个常量用+连接对s进行初始化 15. String s = A + B; 16. String t = "abcd"; 17. if (s == t) { 18. System.out.println("s等于t,它们是同一个对象"); 19. } else { 20. System.out.println("s不等于t,它们不是同一个对象"); 21. } 22. } 23. } 24. public class StringStaticTest {25. // 常量A26. public static final String A;27. // 常量B28. public static final String B;29. static {30. A = "ab";31. B = "cd";32. }33. public static void main(String[] args) {34. // 将两个常量用+连接对s进行初始化35. String s = A + B;36. String t = "abcd";37. if (s == t) {38. System.out.println("s等于t,它们是同一个对象");39. } else {40. System.out.println("s不等于t,它们不是同一个对象");41. }42. }43. }
1. public class StringInternTest { 2. public static void main(String[] args) { 3. // 使用char数组来初始化a,避免在a被创建之前字符串池中已经存在了值为"abcd"的对象 4. String a = new String(new char[] { 'a', 'b', 'c', 'd' }); 5. String b = a.intern(); 6. if (b == a) { 7. System.out.println("b被加入了字符串池中,没有新建对象"); 8. } else { 9. System.out.println("b没被加入字符串池中,新建了对象"); 10. } 11. } 12. } 13. public class StringInternTest {14. public static void main(String[] args) {15. // 使用char数组来初始化a,避免在a被创建之前字符串池中已经存在了值为"abcd"的对象16. String a = new String(new char[] { 'a', 'b', 'c', 'd' });17. String b = a.intern();18. if (b == a) {19. System.out.println("b被加入了字符串池中,没有新建对象");20. } else {21. System.out.println("b没被加入字符串池中,新建了对象");22. }23. }24. }