String str=”kv”+”ill”+” “+”ans”为什么我感觉和String  s  =  "a" + "b" + "c"是一样的。编译期就会把几个字符串合并成一个。final修饰的静态字段在编译期会被放在常量池中

解决方案 »

  1.   

    我想的也跟你一样,但很多文章都说 String str=”kv”+”ill”+” “+”ans” 不是一个对象
    比如这个:http://zy19880423.iteye.com/blog/434179
      

  2.   

    String str=”kv”+”ill”+” “+”ans”;这句话要拆开说昂,str在赋值过程中共创造了四个对象,但是str是一个对象,一个指向常量池“kvillans”的对象。
    【首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” ” 生成 “kvill “存在内存中,最后又和生成了”kvill ans】咳咳,楼主这个说法就太四个对象分别是kv,ill,ans和kvillans,字符串执行+操作时把String转为基本类型char来做的,一次就把三个对象拼成一个了。只要记住,常量池是编译期的事就好理解了。最后补充下,常量池是每个类都有的,当然这貌似是虚拟机要做的事了。
      

  3.   

    首先回答第一个问题,String str=”kv”+”ill”+” “+”ans”;在编译器就组成了一个字符串,所以这里面在运行时只有一个string对象。
    关于字符串常量池和如何验证只生成一个字符串对象,可以参考这篇文章。http://droidyue.com/blog/2014/12/21/string-literal-pool-in-java/final修饰的常量在编译时期放入类的常量池表,而常量池是类的常量池表的运行展示形式。了解运行时常量池,可以参考本文http://droidyue.com/blog/2014/12/21/java-runtime-data-areas/另外,关于字符串拼接的运行机制,可以查看这篇文章.http://droidyue.com/blog/2014/08/30/java-details-string-concatenation/