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

图片求解释

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

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

本质上就是
"abc"

new string("abc")
的区别

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

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

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

参考参考 http://blog.csdn.net/gao_chun/article/details/28393757

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

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

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