初学者不要纠结这种问题,你不会是看了think in java被带到沟里面了吧。
如果你想了解虚拟机的运行机制可以阅读《深入java虚拟机》第二版,或者翻阅虚拟机规范,学习java字节码。
学会看字节码,你这都不是问题,javap xxx.xxx.class 就能查到字节码助记符。
而且随着编译器不断的优化更新,每个版本都是不一样的。就目前而言,你说给出的语句会被java编译器优化:
例如 String a="1"+"2";会被直接优化成String a="12";
如果String a=b+c ;如果b和c能够在较近语句中找到b="3"; c="5";那么就会优化成String a="35";
如果不能直接找到对应的常量语句,则编译为String a=new StringBuilder(c).append(b).toString();
所以别再思考什么String会生成几个对象了,这和孔乙己的回字的几种写法一样,看似学究,鸟用都没有。
String a="a" 可能创建一个对象或者不创建对象,如果"a"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("a").如果已经存在,a直接reference to 这个String池里的对象。 String str1 = new String("ABC") 至少创建一个对象,也可能两个。因为用到new 关键字,会在heap创建一个 str1 的String 对象,它的value 是 "ABC".同时,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("ABC"). String 有一个intern() 方法,native,用来检测在String pool是否已经有这个String存在。希望对你有用!
如果a=“1”算两个的话,那么一共8个。33和44算是单独的对象,与他们相加又另算一个。一共8个
请问题主这个问题解决了吗?我最近面试也遇见了这个