String a="a"+"b"+"c"在内存中创建几个对象?java中如何读取主板序列号、硬盘序列号、MAC地址
刚接触java不理解,java虚拟机里。字符串拼接会生成对象吗
①个String对象
\"a\"+\"b\"+\"c\"在编译期已经常量折叠为\"abc\"
变量a获得是\"abc\"。
-----
小更新
甲骨文jdk(①.⑦),javac会进行常量折叠,全字面量字符串相加是可以折叠为①个字面常量,而且是进入常量池的。
public class Main {public static void main(String[] args) {String e=\"a\"+\"b\"+\"c\";System.out.println(e);}}
javap
Classfile /D:/GitHub/Test/bin/org/test/g/Main.class Last modified ②⓪①⑤-①②-②②; size ⑤⑦⓪ bytes MD⑤ checksum fc①②ffeea⑦⑨d⑤a⑤df⑥d⑧④⑧d④④ff⑧⑧①⑧b Compiled from \"Main.java\"public class org.test.g.Main SourceFile: \"Main.java\" minor version: ⓪ major version: ⑤① flags: ACC_PUBLIC, ACC_SUPERConstant pool: #① = Class #② // org/test/g/Main #② = Utf⑧ org/test/g/Main #③ = Class #④ // java/lang/Object #④ = Utf⑧ java/lang/Object #⑤ = Utf⑧ #⑥ = Utf⑧ ()V #⑦ = Utf⑧ Code #⑧ = Methodref #③.#⑨ // java/lang/Object.\"\":()V #⑨ = NameAndType #⑤:#⑥ // \"\":()V #①⓪ = Utf⑧ LineNumberTable #①① = Utf⑧ LocalVariableTable #①② = Utf⑧ this #①③ = Utf⑧ Lorg/test/g/Main; #①④ = Utf⑧ main #①⑤ = Utf⑧ ([Ljava/lang/String;)V #①⑥ = String #①⑦ // abc #①⑦ = Utf⑧ abc #①⑧ = Fieldref #①⑨.#②① // java/lang/System.out:Ljava/io/PrintStream; #①⑨ = Class #②⓪ // java/lang/System #②⓪ = Utf⑧ java/lang/System #②① = NameAndType #②②:#②③ // out:Ljava/io/PrintStream; #②② = Utf⑧ out #②③ = Utf⑧ Ljava/io/PrintStream; #②④ = Methodref #②⑤.#②⑦ // java/io/PrintStream.println:(Ljava/lang/String;)V #②⑤ = Class #②⑥ // java/io/PrintStream #②⑥ = Utf⑧ java/io/PrintStream #②⑦ = NameAndType #②⑧:#②⑨ // println:(Ljava/lang/String;)V #②⑧ = Utf⑧ println #②⑨ = Utf⑧ (Ljava/lang/String;)V #③⓪ = Utf⑧ args #③① = Utf⑧ [Ljava/lang/String; #③② = Utf⑧ e #③③ = Utf⑧ Ljava/lang/String; #③④ = Utf⑧ SourceFile #③⑤ = Utf⑧ Main.java{ public org.test.g.Main(); flags: ACC_PUBLIC Code: stack=① · locals=① · args_size=① ⓪: aload_⓪ ①: invokespecial #⑧ // Method java/lang/Object.\"\":()V ④: return LineNumberTable: line ③: ⓪ LocalVariableTable: Start Length Slot Name Signature ⓪ ⑤ ⓪ this Lorg/test/g/Main; public static void main(java.lang.String[]); flags: ACC_PUBLIC, ACC_STATIC Code: stack=② · locals=② · args_size=① ⓪: ldc #①⑥ // String abc ②: astore_① ③: getstatic #①⑧ // Field java/lang/System.out:Ljava/io/PrintStream; ⑥: aload_① ⑦: invokevirtual #②④ // Method java/io/PrintStream.println:(Ljava/lang/String;)V ①⓪: return LineNumberTable: line ⑥: ⓪ line ⑦: ③ line ⑧: ①⓪ LocalVariableTable: Start Length Slot Name Signature ⓪ ①① ⓪ args [Ljava/lang/String; ③ ⑧ ① e Ljava/lang/String;}
自己看常量池的#①⑥ · #①⑦ · 说多个的顺便帮我找找\"a\",\"b\",\"c\"的常量是不是给你吃了?
当然不排除某些不会优化的编译器不进行常量折叠,直接上SB串联。
如果相加中有变量的话,也会退化为SB串联。
\", \"extras\": \"\", \"created_time\": ①④⑤⓪⑥⑨⓪⑤③⑦ · \"type\": \"answer
目前好像不行吧
不可能
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息