标签:
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不相等,对象一定不相等。
标签:
原文地址:http://www.cnblogs.com/benbencoding798/p/4734635.html