黑马程序员—Java中的字符串浅析

来源:互联网 发布:淘宝退货在线支付运费 编辑:程序博客网 时间:2024/05/22 12:28

---------------------- android培训、java培训、期待与您交流! ---------------------


Java中的String类,即字符串类,它的对象往往与其他对象有很多不同的地方,让人琢磨不透。经过几天的学习,我想总结一下String类的一些特点。


1. 相当于常量:

String字符串是常量,建好之后不可以修改(想要随时修改可以使用StringBuffer类)。


2. 存储位置:

通常定义一个对象是以这样的方式 

String str = new String("test"); 

但是String类还可以直接赋值 

String str = “test”; 

这两种方式到底有什么区别呢?这就需要弄清楚Java中的字符串是怎么存储的。这个问题要涉及到Java中两个重要的存储区——堆(Heep)和字符串池(String Pool)。堆是用来存储对象的,包括该对象的特有属性(即非静态属性,方法存放在方法区,这里暂时不讨论)。字符串池用来存放当前用到的不重复的字符串,方便使用,以免重复定义相同字符串。

语句String str = new String("test");的过程是这样的,首先看字符串池中有没有“test”字符串,如果没有就在池中加入“test”字符串,之后在堆中建立一个对象(也有一份“test”字符串信息),将对象的地址返回给str变量。

语句String str = “test”;的执行过程是这样的,首先查看字符串池中有没有‘“test”字符串,如果没有就在池中加入“test”字符串,之后将池中“test”字符串的地址返回给str变量。可以看到,这里并没有创建对象。

这样一来,就会有一些重要的特性产生

(1)String str1 = “test”; 

  String str2 = “test”;

str1与str2的值相等。因为他们的值都是池中“test”的地址(每个字符串在池中只有一份)

(2)String str1 = new String(“test”);

           String str2 = new String("test");

  str1与str2的值不相等。因为他们的值是两个独立的对象的地址,只不过对象里面保存的字符串相同而已(第一句话执行后,pool中有“test”字符串)。


3. equals方法与“==”

判断两个对象(a和b)是否是同一个对象,可以有两种方法供选择

(1)System.out.println(a.equals(b));

(2) System.out.println(a==b);

equals和“==”又有什么区别呢?

“==”是直接比较两个变量的值(对象的地址)是否相同,如果相同就是同一个对象,返回true,否则返回false。

  equals是一个判断对象是否相同的方法,Object类中定义它与“==”的功能一样,地址一致则返回true,否则返回false。但是String类复写(Overide)了这个方法,功能变为,如果两个String对象指定的字符串相同则返回true,不同则返回false,也就是说,他比较的是对应字符串的值是否相同。

故:

String a = new String("abc");

String b = new String("abc");

String c = "abc";

String d = "abc";

a.equals(b)的结果是true

a==b的结果是false

c.equals(d)的结果的true

c==d的结果是true

a.equals(c) 的结果是true

以上三点是我的一点小总结,有不妥的地方欢迎指正,谢谢大家。


----------------------- android培训、java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima
原创粉丝点击