码迷,mamicode.com
首页 > 编程语言 > 详细

Java学习之字符串类

时间:2015-08-16 18:04:24      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

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不相等,对象一定不相等。

Java学习之字符串类

标签:

原文地址:http://www.cnblogs.com/benbencoding798/p/4734635.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!