您的位置:首页 > 其它

字符串中"=="和"equals()"&NULL和""问题

2016-04-14 10:55 381 查看
package com.java;

public class TestFlyWeight {

public static void main(String[] args) {
/**
* “==” 和 “equals()”
* 前者比较的是引用,后者比较的是对象中真正的值。
* ==是对字符串地址的比较,比较两个引用是否指向同一个内存地址。
*/
Object s3 = new String("Hello");
Object s4 = new String("Hello");
if(s3 == s4){
System.out.println("s3 and s4 are ==");
}else if(s3.equals(s4)){
System.out.println("s3 and s4 are equals()");
}
if(s3.equals(s4)){
System.out.println("s3 and s4 are equals()");
}else if(s3 == s4){
System.out.println("s3 and s4 are ==");
}
/**
* 输出:
* s3 and s4 are equals()
* s3 and s4 are equals()
*/
System.out.println("==================");

/**
* 下面是个特例:
* 这是个典型的flyweight模式(享元模式)在字符串对象创建中的应用,这个模式通过减少对象的创建来节约内存。
* String对象会创建一个字符串池(a pool of string),如果当前准备新创建的字符串对象的值在这个池子中已经存在,
* 那么就不会生成新对象,而是复用池中已经有的字符串对象。flyweight模式的精髓就是对象复用。
*/
Object s1 = "Hello";
Object s2 = "Hello";
if(s1 == s2){
System.out.println("s1 and s2 are ==");
}else if(s1.equals(s2)){
System.out.println("s1 and s2 are equals()");
}
if(s1.equals(s2)){
System.out.println("s1 and s2 are equals()");
}else if(s1 == s2){
System.out.println("s1 and s2 are ==");
}
/**
* (引用相同并且值相同)
* 输出:
* s1 and s2 are ==
* s1 and s2 are equals()
*/
System.out.println("==================");

/**
* null是空对象,""是空字符串
* null可以赋值给任何对象,而""就不行了,只能赋值给字符串对象
*	如:
*	String s=null;//定义了一个对象实例s,但未将该实例指向任何内存空间
*	String s="";//定义了一个对象实例s,指向了一个空串
* null不能调用字符串的任何方法
*/
String a1 = null;
String a2 = "";
//报错java.lang.NullPointerException
//		 System.out.println(a1.equals(a2));
//		 System.out.println(a1.length());

System.out.println(a1 == a2);//false
System.out.println(s1.equals(a1));//false
System.out.println(a2.equals(a1));//false
System.out.println(s1.equals(a2));//false

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: