Java String "=="与"equals"区别

"=="与"equals"区别:
前者是数值比较,比较的是内存地址的值是否相等
,则是内容的比较;

String s= "liuwei"; 一个字符串就是一个匿名String对象
String s1="liuwei";
System.out.println(s==s1);//true;
为什么?
String不同于其他对象,它利用了Java的共享机制模式的一种运用.


public class StringTest {
public static void main(String[] args) {
//String s4="abc";
String s = new String("abc");
//执行上一条语句,产生两个对象“abc”,而不是s、s,s1,s2它只是一个引用
//一个是在String Pool中,String类是一个不可以改变的类
//另一个在堆里面产生,new String("abc").并且s指向对“abc”的引用
//如果这条语句之前有条语句:String s4="abc";这个时候执行这条语句则只产生一个对象。
//因为String Pool中已经有了"abc".

String s1 = "abc";
//执行这条语句,一个对象都没有生成。首先会从String Pool中查找有没有"abc"对象,因为已经存在了
//如果String Pool中查找没有"abc"对象,则在里面产生"abc"这个对象,并且指向它。

String s2 = new String("abc");
//String Pool中查找有"abc"对象,则产生一个新的对象在堆中,并指向它。

//在Java 中"=="永远比较的是两个对象的内存地址,等号两边的引用是否指向同样一个对象(地址)
System.out.println(s == s1);//false
System.out.println(s == s2);//false
System.out.println(s1 == s2);//false

//intern()方法执行过程,首先是检查String Pool中有没有s引用的这个对象("abc"),
//如果有的话,则返回的是String Pool中的这个对象。而不是s本身这个对象的地址
System.out.println(s == s.intern());//false
System.out.println(s1 == s1.intern());//true
System.out.println(s.intern() == s2.intern());//true等同于s.equals(t).返回的是String Pool中的对象。

String hello="hello";
String hel ="hel";
String lo="lo";
System.out.println(hello=="hel"+"lo");//true
//执行顺序是通过+号两边的字面值(常量)得到字符串"hello"。在通过查找String Pool 中
//是否有字符串"hello",如果有,则直接返回这个字符串的引用地址,不会产生新的对象
System.out.println(hello == "hel"+lo);//false
//通过+号两边的字面值(常量)得到字符串"hello",如果有一个不是字面值,则会产生一个新的
//对象在堆中。比较地址是肯定就不是相同的。
}

}

// 回避一种写法
// 如果程序中非要使用此种类型的代码,则可以使用StringBuffer代替
// StringBuffer与String的本质区别,在于StringBuffer可以改变
public class OODemo12
{
public static void main(String args[])
{
String str = "A" ;
for(int i=0;i<100;i++)
{
str += i ;
}
System.out.println(str) ;
}
};

//StringBuffer也是字符串对象,但是这个对象的内容是可以改变的
//只是代码的形式不同,StringBuffer必须先进行实例化

//StringBuffer可以改变,而String不能
public class APIDemo
{
public static void main(String args[]){
//String str = "";
//用+号表示连接
//str = "a"+"B";
StringBuffer sb = new StringBuffer();
sb.append("A").append("B");
fun(sb);
sb.append(1);
System.out.println(sb);
}
//StringBuffer传递的只是个引用
public static void fun(StringBuffer sb){
sb.append("-->hao 123");
}
}


//OODemo09.java 想想结果会是怎么样的?
class Person
{
int x = 0 ;
};

public class OODemo09
{
public static void main(String args[])
{
Person p1 = new Person() ;
p1.x = 30 ;
fun(p1) ;
System.out.println(p1.x) ;
}
public static void fun(Person p2)
{
p2.x = 50 ;
}
};
//结果为 50 

//OODemo10.java 想想结果会是怎么样的?

public class OODemo10
{
public static void main(String args[])
{
String str1 = "魔乐" ;
fun(str1) ;
System.out.println(str1) ;
}
public static void fun(String str2)
{
//str2 = "李兴华" ;
str2 += "李兴华" ;
}
};
//两者结果都是一样的 都为 “魔乐”;用内存分析方法得到解答
//OODemo09和OODemo10的区别?

class Person
{
String name ;
};
public class OODemo11
{
public static void main(String args[])
{
Person p1 = new Person() ;
p1.name = "魔乐" ;
fun(p1) ;
System.out.println(p1.name) ;
}
public static void fun(Person p2)
{
p2.name = "李兴华" ;
}
};

//String 综合说说都运用了上面那些性质

public class OODemo {

public static void main(String args[]){
//String 类有一个构造方法
String name1= new String ("liuwei");
String name2 = "liuwei";
String name3=name1;
System.out.println("name1="+name1);
System.out.println("name2="+name2);
System.out.println(name1==name2);
//比较 的是内容
System.out.println(name1.equals(name2));
//比较的是地址
System.out.println(name3==name1);
System.out.println("liuwei"==name1);
System.out.println("liuwei".equals(name1));
//String中的匿名对象,这里利用了Java中的共享模式的一种应用
String s="liuwei";
String s1="liuwei";
System.out.println(s==s1);
}
}
//result:
name1=liuwei
name2=liuwei
false
true
true
false
true
true

猜你喜欢

转载自blog.csdn.net/suyimin2010/article/details/80871747