您的位置:首页 > 其它

String 引发的一些思考

2012-05-30 00:29 323 查看
简单的一条语句 String s="test"; 却蕴含着好多知识点在里面,借着这条语句对基础知识做个简单的总结:

1.String不是基本类型,(八种基本类型byte、int、char、long、float、double、boolean和short)是java类库提供的一种字符序列不可变长的类类型。既然属于类对象,那么就可以去new一个实例对象,那么和String s=new String("test");有什么区别呢?

2.String s="test"; 这是一种直接采用字符串直接量赋值的方式,test对象存放在字符串池中,此时创建的对象有两个或者一个,这个要看在字符串池中是否已经有了test这个对象。字符串池是具有相同字符序列的字符串只对应一个字符串实例对象。(这句话听起来有点拗口,在第三点解释)而String s=new String("test");是采用我们一般创建实例对象的方法创建的,一个new就创建了一个test对象,无论内容是否相同。所以不建议用new去创建一个String对象,这样即浪费内存,性能又低。采用字符串直接赋值的方式去创建String对象,只有当字符串池中没有该对象时才会去创建,否则直接返回该对象的引用值。

采用new构造器创建的字符串:

String s1=new String("张三");
String s2=new String("张三");
System.out.println(s1==s2);     //false  s1,s1分别指向两个不同的对象,即使对象的内容相同
System.out.println(s1.equals(s2));  //true

我们再来看看采用字符串直接量赋值的方式的运行结果

String s3="张三";
String s4="张三";
System.out.println(s3==s4);     //true   s3,s4指向同一对象,他们的对象引用值相同
System.out.println(s3.equals(s4));  //true


3.谈谈都有哪些方法创建的字符串是存放在字符串池中的: ①字符串直接量赋值; ②有限个字符串直接量进行“+”运算的结果(比如String s5="张三"+"李四",注意"+"号两边是字符串直接量,而不能含有变量);③String类的成员方法intern创建的字符串实例对象(感觉这个用的好像比较少)。也就是说 通过以上三种创建的字符串都存放在字符串池中,首先判断要创建的字符串是否在池中,如果已经存在的话,不会在创建一个,而是直接返回该字符串对象所在的引用值
(可以用"=="判断两个对象是否是指向同一引用 )否则,在池中创建一个新的字符串对象 。

String s4="张三";
String s5="张三";
String s6="张"+"三";
System.out.println(s4==s5);
System.out.println(s4==s5);     //true
System.out.println(s4==s6);    //true
System.out.println(s4.equals(s5));  //true

通过上面的代码可以看到s4,s5,s6指向同一对象,他们的引用值都相同。如果通过new构造器创建,则他们各指向不同的对象,引用值就不同了,但各对象的内容(值)则是相同的。所以用"=="判断自然就返回false,用equals方法返回的是true;

4.”=="和"equals()"的区别: 当用new创建对象时Objet obj=new Object(),涉及了两块内存,对象本身占用一块内

存(堆内存),变量也占用一块内存

①:"=="可用于基本数据类型变量的比较,(也就是比较两个变量存放在内存中的值是否相等),也可用于类对象引用变量的比较(上面的例子都是引用变量的比较,比较的是这两个引用对象是否指向同一地址);equals()是用在两对象间的比较,比较的是对象的内容是否相同

String s7="张三";
String s8=new String("张三");
String s9="张三";
System.out.println(s7==s8); //false,我们看到s7和s8即使内容相同,但他们的引用值却是不同的
System.out.println(s7.equals(s8));  //true
System.out.println(s7==s9);   //true ,这就是我们上面讲的字符串池的知识点


②equals()方法是Object的方法,我们看到原始的equals()方法比较的是对象的引用值是否相等。因此String类对它进行了重写,目的是比较对象的内容是否相同。
object类中的equals()方法:

public boolean equals(Object obj)

{
//调用equal的对象的地址和参数对象的地址是否相等
return (this == obj);
}

当我们自己构造了一个类时,要比较实例对象是否相同(相同类且各成员域对应相等),一定要对equals()方法进行重写,注意重写时的参数是Object类型,而不要错写成自己构造类的类型了,否则就没有实现覆盖的效果。对于equals()方法的重写,参考《java核心技术 一卷》P161

5.在实际的应用中,可能用到更多的是StringBuffer这个类。StringBuffer是可变长的字符串缓冲区,用起来更加灵活,可以随意对字符串追加,增,删,改等操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: