Java学习之字符串类

时间:2024-05-01 21:04:46

String在Java中是一个类类型(非主类型),是一个不可被继承的final类,而且字符串对象是一个不可变对象。声明的String对象应该被分配到堆中,声明的变量名应该持有的是String对象的引用。

运行期计算得到的字符串会得到一个新的字符串。tag="hel"+tag;

这种现象是Java为了效率而赋予String的特殊性。字符串是不可变的,字符串被分配了空间和初始值后值就不可变化。一旦变化,就会放弃原有的对象而分配新的空间给变化后的字符串。频繁地赋新值,会给程序运行效率带来极大影响。

不推荐使用==来比较非主类型的对象值。因为它通常不会得到期望的结果,可以说是不正确的。因为==符号比较的是变量的值,而变量的值不会是对象,而是对象的首地址,所以==是无法比较对象的。

但是String有时候使用==能够得到正确的结果,那是因为Java为了提高这个常用类型的效率和利用率,讲一些可以重复使用的字符串常量放到一个池中,仅可能地重用。

1.字符串池

当定义一个name=“hello”后,Java会先在字符串池中寻找是否已经存在“hello”这个字符串,如果没有,则建立字符串“hello”对象,然后变量name指向这个地址。

而后定义一个新的字符串如果是编译时就能确定的话,它会自动指向字符串池中的一个已存在的对象,但是如果是运行期计算得出的,它将会分配新的空间给对象。计算得来的字符串不知想池中的任何对象,但是可以使用intern方法使其指向字符串池中的对象。同时指向池中同一个字符串对象,使用“==”来比较肯定会返回true。池中String的hashCode是唯一的。

attentions:(1)使用new操作创建的字符串对象不在池中。

(2)计算得来的字符串不在池中。

(3)只有编译期确定的对象直接被放入池中或指向池中对象。

(4)使用==操作符号比较字符串时,必须值和hashCode值同时相等时,两个字符串才相等。

(5)intern只会在字符串池中寻找匹配的对象,没有找到的话,自动将自己放入池内。

2.equals和hashCode

在重写equals时遵循以下约定:自反性、对称性、传递型、一致性

在重写hashCode时遵循以下约定:(1)相等对象,hashCode一定相等;(2)不等对象,hashCode不一定不相等;(3)hashCode相等,不一定对象相等;(4)hashCode不相等,对象一定不相等。

StringBuffer 和 StringBuilder中常用的函数:

append:向缓冲区末尾添加字符串。

delete:删除指定位置的字符串。

replace:替换指定字符串。

inset:在指定位置插入字符串。

indexOf:指定的字符串所在的位置索引。

lastIndexOf:最后一个匹配指定的字符串的位置索引。

reverse:反转整个字符串。

对于频繁变化的字符串,不要使用String,而要使用StringBuffer或者StringBuilder,在单线程程序中使用StringBuilder,多线程环境中建议使用StringBuffer。

3.格式化输出

%[-][有效位数][.精度]转换字符