其次,在String的构造方法中传递了一个字符串abc,由于这里的abc是被final修饰的属性,所以它是一个字符串常量。在首次构建这个对象时,JVM拿字面量"abc"去字符串常量池试图获取其对应String对象的引用。于是在堆中创建了一个"abc"的String对象,并将其引用保存到字符串常量池中,然后返回;所以,这里正确的回答应该...
publicclassStringExercise05{publicstaticvoidmain(String[]args){Stringa="ab";//创建a对象Stringb="cd";//创建b对象//解读:先创建一个StringBuilder sb = new StringBuilder();执行 sb.append(a);执行sb.append(b);String c = sb.toString();//等价于 (new StringBuilder()).append(a).append(b).to...
其次,在String的构造方法中传递了一个字符串abc,由于这里的abc是被final修饰的属性,所以它是一个字符串常量。在首次构建这个对象时,JVM拿字面量"abc"去字符串常量池试图获取其对应String对象的引用。于是在堆中创建了一个"abc"的String对象,并将其引用保存到字符串常量池中,然后返回; 所以,这里正确的回答应该是:...
在讲String 和 new String 的区别之前先看一段代码:String a = "ss"; String b = "ss"; String c = new String("ss"); System.out.println(a==c); System.out.println(a.equals(b));最终输出结果 false true还需要知道的String 类型 的声明类型,查看源码可以知道...
2 对于 new String("abc")的理解: 有种说法new String会在堆中和常量池中创建两个对象,这种说法其实没错 因为括号里面出现的"abc"其实相当于String s1 = "abc"的作用,这个对象就已经存入了常量池 但是如果出现new String("a") + new String("b") + new String("c") 这种,那么常量池只有a b c 三个...
1、执行 String str = new String(“ab”);后生成的字节码 结论:单纯执行new String(“XXX”),底层会创建两个对象。一个是在堆中创建XXX的对象,另一个是在堆中字符串常量池中创建。这两个对象的内容都是一样的,但是地址是不相同的。 2、升级:执行 String str = new String(“a&... ...
执行javap -c TestString获取底层代码执行逻辑,如图所示: publicclasstest20190820.TestString {publictest20190820.TestString();//这里是构造器的执行逻辑,咱们忽略它,毕竟不是重点Code:0: aload_01: invokespecial #1// Method java/lang/Object."<init>":()V4:returnpublicstaticvoidmain(java.lang.String[])...
String{publicstaticvoidmain(String[]args){Stringst1="ab";Stringst2="abc";Stringst3=st1+"c";...
String str1="abc";String str2=newString("abc"); 嗯,创建几个就不好说了,我们还是测试一下吧,首先我们打开cmd.exe, 通过javac *.java编译好该Java文件,然后通过命令javap -c *来查看java编译后的ByteCode字节码, ldc的含义是:将常量值从常量池中取出来并且压入栈中。从上图中,我们可以看到第0行和第...
char [] c = str.toCharArray();String s = new String(c); // 由char数组构建一个String对象 String s2 = c.toString(); // 将对象c的toString结果(一个String对象)赋给s2对象 s和s2都是String对象,他们的创建方式不同 s值是 "abcd"s2值是对象c的hascode,因为toStrng方法默认返回...