java(六)字符串与equals

来源:互联网 发布:1080a最新x站免费域名 编辑:程序博客网 时间:2024/05/16 19:23

字符串

1、字符串特性:字符串是不可变的对象,为final类型不可被继承,初始值为null,null表示字符串没有new,即对象的引用还没有创建也没分配空间,null与“ ”、new String()像真空与空气一样。

字符串的特殊地方是字符串常量池,每当创建一个新的会检查字符串常量池是否有此值相等的字符串,有则不再创建直接给字符串常量池中对该对象的引用,如果没有则创建后放入到常量池然后返回对象的引用,此机制提高了效率,减少内存空间的占用,能直接赋值就不要new。string常用方法:http://www.cnblogs.com/lmfeng/archive/2011/08/02/2125056.html

2、StringBuffer:Stringbuffer与String一样,用来存储字符串,内部实现不同Stringbuffer在修改字符串时并没有产生新的字符串而是在原有字符串基础上修改侧重于增删改,String是差生一个新的对象。StringBuffer的初始化必须用构造方法进行初始化不能直接=初始化。其特有的字符串追加函数append(),插入insert()。delete()删除。

3、StringBuilder:与StringBuffer也是一个可变字符串,与Stringbuiled不同,他是线程不安全的,速度快。

在字符串拼接 String s= ”i“+” am“,要比StringBuffer s1=new StringBuffer(”i“).append(”am“)速度快。这里的s就是i am,比增加一个新对象要快的多。

4、使用:String用于变化少如常量,少量的变量等,

StringBuffer:用于频繁字符串运算拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装等。
StringBuilder:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用StringBuffer,如SQL语句的拼装、JSON封装等(貌似这两个我也是使用|StringBuffer)。

5、字符串拼接:三种拼接方式,+的拼接方式,是使用StringBuilder的append()方式进行处理,编译器使用append()方法追加后要同toString()转换成String字符串,也就说  str +=”b”等同于

str = new StringBuilder(str).append("b").toString();,生成较多拼接对象是每次new和tostring会使效率变慢。

concat拼接方式,以下是concat()方法源码

public String concat(String str) {    int otherLen = str.length();    if (otherLen == 0) {        return this;    }    char buf[] = new char[count + otherLen];    getChars(0, count, buf, 0);    str.getChars(0, otherLen, buf, count);    return new String(0, count + otherLen, buf);    }
concat()方式像是数字拷贝return new String(0, count + otherLen, buf)会在创建很多对象是变慢单比+方式效率高些。

append()方法

public synchronized StringBuffer append(String str) {    super.append(str);        return this;    }
 StringBuffer的append()方法是直接使用父类AbstractStringBuilder的append()方法, 与concat()方法相似,它也是进行字符数组处理的,加长然后拷贝,但是它并没有返回一个新串,而是返回本身,没有产生新的字符串对象。

equals()方法

 判断对象是否相等时有==和equals(),但是差别在于,"=="操作符的作用1、用于基本数据类型的比较,2、判断引用是否指向堆内存的同一块地址。Object的equals()方法是比较两个对象的内存地址是否相等,判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,返回值为布尔类型。

一般要重写equals()方法,用于内容判断是否相等,覆写equals()方法时,一般都是推荐使用getClass来进行类型判断,不是使用instanceof。instanceof的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。使用instanceof,容易被继承关系“钻空子”。

equals 方法在非空对象引用上实现相等关系:1)自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。2)对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。3)传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。4)一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。5)对于任何非空引用值 x,x.equals(null) 都应返回 false。  
在java中进行比较,我们需要根据对象类型选择比较方式:
1) 对象域,使用equals方法 。2) 可能为null的对象域 : 使用 == 和 equals 。 3) 数组域 : 使用 Arrays.equals 。 4) 除float和double外的原始数据类型 : 使用 == 。 5) float与double: 使用对应Float.foatToIntBits转换成int类型与Double.doubleToLongBit转换成long类型,然后使用==。先转换是何其封装的equals方法有关。




0 0