qq_23908539
2015-08-01 14:24
采纳率: 87.5%
浏览 2.1k
已采纳

java中String类两种初始化的区别

图片求解释

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • Evankaka 2015-08-02 02:46
    已采纳

    首先,你得理解下JAVA的存储区主要有三个:栈、堆、静态区.这三个的生命周期不一样,分配方式也不一样,存储内容也不一样
    String a="aaa"这里的aaa存放就是在静态区,如果还有后头又定义一个string b="aaa",那么java里头会把它也指向a指向的地方。整个aaa会一直等到你程序退出了才释放空间
    而String a1=new String("aaa").这里aaa是放在堆区,它是动态分配的。由垃圾回收器来管理。你如果再定义一个
    String b1=new String("aaa").那么又会分配一个新的堆空间。a1和b1 是不会指到同一个内存空间的。

    点赞 评论
  • bdmh 2015-08-01 14:48

    是一样的,就是两种不同的表示方法

    点赞 评论
  • blownewbee 2015-08-01 15:22

    本质上就是
    "abc"

    new string("abc")
    的区别

    前者是在编译期间就可以决定,并且放在常量池中的
    后者是jvm动态产生分配的。

    但是就程序实现的角度看,两者的作用一样

    点赞 评论
  • string str="abc"表示在字符串池中生成一个"abc",当如果再执行string s="abc"时,这个时候其实str和s都指向同一个"abc",当使用 new 关键字的时候都会在内存中生成两个不一样就是地址不一样的串

    点赞 评论
  • gao_chun 2015-08-02 01:56
    点赞 评论
  • Evankaka 2015-08-02 02:49

    而==比较的是内存地址,所以a==b为true,a1==b1为false
    equal比较的是内容,所以a.equal(b)为true,a1.equal(b1)为true

    点赞 评论
  • 笃行后生 2015-08-03 04:07

    我给你画了个,上传不了。点我头像

    点赞 评论
  • 毕小宝 2015-10-23 04:39

    用javap -c反编译,看下生成的字节码,就可以看到二者的区别了。直接用字符串赋值,是存储在常量池中的,而new操作进行的赋值则是通过创建一个对象,值为该字符串。

    点赞 评论

相关推荐 更多相似问题