String s="a"+"b"+"c";如果你比较一下Java源代码和反编译后的字节码文件,就可以直观的看到答案,只创建了一个String对象。估计大家会有疑问了,为什么源代码中字符串拼接的操作,在编译完成后会消失,直接呈现为一个拼接后的完整字符串呢?这是因为在编译期间,应用了编译器优化中一种被称为常量折叠(Constant...
StringA,B,C;A="a";B="b";A=A+B;StringBufferD=newStringBuffer("abc");D=D.append("567"); A 4 B 3 C 5 D 6 正确解析如下: 要知道 String s= new String("abc")创建了几个 String Object,首先必须了解引用变量与对象的区别。 (1)引用变量与对象。除了一些早期的Java书籍,我们都可以从书中...
new String("abc")相当于new String(String s1="abc"),即先要执行String s1="abc"(2.1已经讲过了),然后再在堆区new一个String对象。 因此,现在可以解答本文的标题了,String s=new String("abc")创建了1或2个对象,String s="abc"创建了0或1个对象。 2.3、String类的intern方法 下面介绍一个方法,String...
String s="a"+"b"+"c"创建了0个或1个对象。以String s = "abc"这种形式创建的字符串语句是存储在常量池中的,所以该语句赋值符号右边的"a"、"b"、"c""都是常量。如果常量池中有相应的字符串则不创建新的字符串对象,即不重新在常量池中分配空间。因此,如果之前以上述形式创建过"abc"这个...
答案还是一个。 String a="ab"+"cd"; 再看看这里呢? 答案是三个。 说到这里,我们就需要引入对字符串池相关知识的回顾了。 在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对...
String s = "a" + "b" + "c" 这样直接几个字面值相加的,java文件在编译期间就已经将这条语句做了优化,将其直接变成 "abc",等到运行的时候会先去字符串常量池中寻找有没有“abc”这个字符串,若有,则将其地址给 s;若没有,则先在字符串常量池里创建“abc”,然后再把地址给s 因此,...
创建了2个对象,new string(“ab”)将创建一个string对象;String s 将创建第2个string对象。“c”是常量在编译的时候就已经作为常量赋值了,不会创建新的对象。故共2个。
毫无疑问,这行代码创建了1个String对象。 String a="abc"; String b="abc"; 那这里呢? 答案还是1个(String常量池中,已经创建"abc",则不会继续创建)。 String a="ab"+"cd"; 再看看这里呢? 答案是3个。 String s = new String("abc"); 分两种情况, 1)如果String常量池中,已经创建"xyz",则不会继...
无意中看到一个流传年份颇为久远的问题:String s = "a"+"b"+"c"+"d"+"e"; 该语句到底一共创建了多少个对象? 百度了下,找了很多的答案,看到的回复真是令人眼花缭乱,一脸懵逼。 比如这个问题下的:https://zhidao.baidu.com/question/105991030.html 居然一连串得到了1个、2个、6个、9个、10个一共五...
问题一: String a = “a” + “b” + “c”; 创建了几个对象 答案:一个对象 javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个对应常量相连的结果。 问题一:String s = “aaa” + new String(“bbb”); ...