问题描述
1,Strings="a"+"b"+"c";创建的是一个对象。这个没问题。但是:Stringstr=”kv”+”ill”+”“+”ans”;就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和””生成“kvill“存在内存中,最后又和生成了”kvillans”;并把这个字符串的地址赋给了str。这话的意思是说Stringstr=”kv”+”ill”+”“+”ans”创造了四个对象?2,final和static修饰的变量都在常量池中吗?
解决方案
解决方案二:
4个对象够么?你拼到一起的时候也是一个新对象
解决方案三:
Stringstr=”kv”+”ill”+”“+”ans”为什么我感觉和Strings="a"+"b"+"c"是一样的。编译期就会把几个字符串合并成一个。final修饰的静态字段在编译期会被放在常量池中
解决方案四:
我一直以为是和1一样是一个对象,但是我看到很多博客上写都是四个对象,很疑惑。引用1楼a574258039的回复:
4个对象够么?你拼到一起的时候也是一个新对象
解决方案五:
我想的也跟你一样,但很多文章都说Stringstr=”kv”+”ill”+”“+”ans”不是一个对象比如这个:http://zy19880423.iteye.com/blog/434179引用2楼sum_rain的回复:
Stringstr=”kv”+”ill”+”“+”ans”为什么我感觉和Strings="a"+"b"+"c"是一样的。编译期就会把几个字符串合并成一个。final修饰的静态字段在编译期会被放在常量池中
解决方案六:
Stringstr=”kv”+”ill”+”“+”ans”;这句话要拆开说昂,str在赋值过程中共创造了四个对象,但是str是一个对象,一个指向常量池“kvillans”的对象。【首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和””生成“kvill“存在内存中,最后又和生成了”kvillans】。。。咳咳,楼主这个说法就太。。。四个对象分别是kv,ill,ans和kvillans,字符串执行+操作时把String转为基本类型char来做的,一次就把三个对象拼成一个了。只要记住,常量池是编译期的事就好理解了。最后补充下,常量池是每个类都有的,当然这貌似是虚拟机要做的事了。
解决方案七:
引用5楼mymy1026的回复:
Stringstr=”kv”+”ill”+”“+”ans”;这句话要拆开说昂,str在赋值过程中共创造了四个对象,但是str是一个对象,一个指向常量池“kvillans”的对象。【首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和””生成“kvill“存在内存中,最后又和生成了”kvillans】。。。咳咳,楼主这个说法就太。。。四个对象分别是kv,ill,ans和kvillans,字符串执行+操作时把String转为基本类型char来做的,一次就把三个对象拼成一个了。只要记住,常量池是编译期的事就好理解了。最后补充下,常量池是每个类都有的,当然这貌似是虚拟机要做的事了。
原谅我读书少,没看到还一空格,空格也是一个对象呢,5个对象
解决方案八:
首先回答第一个问题,Stringstr=”kv”+”ill”+”“+”ans”;在编译器就组成了一个字符串,所以这里面在运行时只有一个string对象。关于字符串常量池和如何验证只生成一个字符串对象,可以参考这篇文章。final修饰的常量在编译时期放入类的常量池表,而常量池是类的常量池表的运行展示形式。了解运行时常量池,可以参考本文另外,关于字符串拼接的运行机制,可以查看这篇文章.