String a = new String("abc");
String b = new String("abc");
String c = new String("bbc");
String h = "bbc";
String d = "bbcc";
String e = "bbcc";
String f = "bbcc";
String g = "bbccffff";
if (a == b)
System.out.println("a等于b");
else
System.out.println("a不等b");
if (a.equals(b))
System.out.println("a等于b");
else
System.out.println("a不等b");
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
if (c == h)
System.out.println("c等于h");
else
System.out.println("c不等h");
if (d == e)
System.out.println("d等于e");
else
System.out.println("d不等e");
if (f == g)
System.out.println("f等于g");
else
System.out.println("f不等g");
结果:a不等b
a等于b
abc
abc
bbc
bbcc
c不等h
d等于e
f不等g
菜鸟分析:
原来说创建几个对象的,和左边的变量一点关系都没有…,new String ("abc")会直接在堆中占用一块内存,再次new String ("abc")还会占用一块堆内存,但是指向同一个方法区的字符串池;
所以说new String ("abc")会生成1(2)个对象,一个是堆里边new出来的对象,另外一个是方法区的字符串池“abc”,原来有就引用,没有就新建;
而 String str = "abc",是直接去方法区的字符串池里找有没有“abc”,有则引用,没有则新建,都不经过堆这边…
“==”和“equals”的区别傻傻分不清
“==” 对于基础数据类型 比较的是值,对于引用数据类型 比较的是地址
“equals” 默认比较的是内存地址,String类是重写了“equals”,所以String比较的是值