String类

来源:互联网 发布:1hhhh新域名网站 编辑:程序博客网 时间:2024/06/05 04:39
String这个类有很多方法,其实java的大多数时候都是在操作字符串,当String对象作为参数传递时,都会复制一份它的引用,而引用所指向的对象其实一直都在单一的物理位置上,从来没有被动过。常用的String类的方法只有20个左右,其中还有5个左右感觉不怎么用得着,所以也就是15个左右,一定要好好地记住并且用熟。

插播一句,hashcode独一无二地代表一个对象,通过hashcode可以找到这个对象所在的位置。

Java中不允许程序员重载任何操作符,但是有2个例外是有且仅有的重载过的操作符,都用于String,一个是"+",一个是“+=”。使用"+"的一个坏处就是效率,比如说有一个字符串变量String s1 = "hello",那么执行String s2 = "hi" + s1 + "joshua" + 66的过程就是先用类似于append()的方法,生成一个新的对象,将"hi"和s1连接起来赋值给这个对象,然后再生成一个新的对象将“joshua”连接起来,然后继续。。。这样的问题就是会产生一大堆需要回收的中间对象。

要想解决这个问题,可以使用StringBuilder,还可以用StringBuffer。通过使用其append方法和insert方法,来实现字符串的拼接,其实用得最多的通常就是append方法。
注意,StringBuffer是线程安全的,而StringBuilder不是。所以通常使用StringBuilder效率高一些。

String类中,如果你定义了2个字符串,如果你想相加,那么系统首先会重现分配一个长度为那2个之和的空间,然后分别复制2个字符串的内容,再写到新的空间里面去。但是它们不一样,可以直接进行,减少了这些中间步骤,提高了效率。不仅在添加上是如此,在删除的时候也是一样的,只需用调用封装好的一些方法就行。

说到这里,说一个问题,就是Java往往提供了2种类的实现,功能相同,或者说大体相同,但是一个是线程安全的。个人认为通常就选择非线程安全的就行,当你需要多线程操作的时候,再自己手动地添加线程同步控制比较好,这样可以避免一些可以避免的效率降低。

凡是当需要改变字符串内容的时候,String类的方法都会返回一个新的String对象。如果你想要把其它类型的变量的值取出来并且返回一个String类型的变量,那么就使用静态方法valueOf()就能实现。

说到这里,顺便说一下Object类中自带的equals()方法。==比较的是基本类型,用于对象比较的就是2个对象在内存中的地址(引用代表的只是一个内存地址值)是否一样,而equals方法做的事情是,比较2个对象的内存地址是否相等。但是实际上无论你怎么说,只要是2个对象,即使里面的内容一样,内存地址也会不相等。所以默认的equals方法做的事情其实是比较2个引用是否指向同一个对象,不是就不等。而Java中默认的内存地址的计算方法是用Object类中的hashCode方法来计算的,所以equals相当于比较的是2个对象的hashCode是不是一样。

如果你想要有自己的想法进行比较,比如说你确实想比较它们的内容是否相等。那么就重写equals方法,比较你想比较的部分。比如String,Date类都已经重写了这个方法。然后还要重写hashCode,按照你要比较的成员变量来进行计算。

需要注意的一点是,如果没有使用new来构造String的话,那么就不会在堆内存中分配空间,直接在数据区分配。如果使用了new,那么要在数据区分配,也要在堆内存中分配,然后栈指向堆,堆指向数据区。

如果你要对字符串里面的字符进行处理,记住,首先可以调用toCharArray将字符串转换成为字符类型的数组,然后记得,Character这个类本身就自带了很多静态方法,比如说isLowerCase(),isDigit(),isLetter()等等,学会第一时间想到去查看一下,可以帮助简化一些问题。

原创粉丝点击