---------------------- 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.youkuaiyun.com/heima