先说一下String类的equals()方法。

下面我们先看一段代码:

这段代码输出的结果为:

ture

true

--------------

false

咋看之下貌似Object类比较特别,那么我们看一下Object下的equals()方法的源代码

Object下的queals()方法十分简单,就是单纯的判断这两个引用是不是指向同一个对象,是的话返回true,不是的话返回false。

可是把这个方法应用在上面代码的String对象身上明显不对,那么String类里面必定重写了equals()方法,来看一下它的源代码:

从这个方法的源代码可以看出,String类的equals()方法时这样运作的:

1)先判断两个引用是否指向同一个对象,是的话直接返回true。

2)判断实参是否是String的一个实例,不是的话直接返回false。

3)实参是String的一个实例,那么把实参的传进来的字符串 逐个字符 与 当前字符对比看看是否一致。

总结:

A)equals()方法:该方法定义在Object类当中,因此Java的每个类都有该方法,对于Object类的equals()方法来说,它判断调用者与传进来的引用时否指向同一个对象。所以对于Object类来说,equals()方法等价于==。

B)对于String类来说,equals()方法判断当前字符串与传进来的字符串的内容是否一致。

下面考虑Srting各种赋值的情况:

一)拼接

输出结果为: hello world

a)给予s1 与 s2 赋值后,不能再改变它们的值了,因为它们是常量。

b)而s3赋值采用 + 拼接字符串,实际上是生成了一个新的对象,而不是往一个空的对象里增加内容。

二)采用字面值赋值方式

首先要加入一个新的概念:String Pool(字符串池)

当采用Sting s = “aaa" 这种字面方式赋值,系统会有以下操作

1)查找String Pool 中是否存在”aaa“这个对象,如果不存在,就在池里创建一个“aaa”对象,然后把池中“aaa”对象的地址返回来赋给s,这样s就指向那个对象了

2)如果池中已经存在“aaa”对象,那么就直接把地址返回给s。

所以上述代码输出为: true

三)采用new方式

采用这种方式赋值,系统会有如下操作:

1)首先在String Pool中查找有没有“aaa”这个字符串对象,如果有,则在堆(heap)中创建一个“aaa”字符串对象,把堆中的这个“aaa”的地址返回来赋给str引用。

2)如果String Pool还没有“aaa”,就先在池中创建一个,再在堆中创建一个,然后把堆中“aaa”的地址返回来赋给str引用。

上述代码输出为: false   因为两个String引用指向堆中不同的对象,但是这两个对象的值是“aaa”,然而地址不同。

---------------------------------

---------------------------------

A)intern()方法

String类中有一个intern()方法,该方法系统操作如下:

1)当一个字符串String str = "abc"调用该方法:str.intern(),系统会检测字符串池中是否有"abc",有得话这个方法就返回池中对于字符串的地址。

2)若池中没有,则在池中添加该字符串,再把该字符串在池中的地址返回来。

总结:可见,intern()方法用来得到字String Pool中对应字符串的地址。

那么 现在有两个字符串 s 和 t ,要使 s.intern() == t.intern() 的条件是什么,

分析:只要s和t的字符串值相等即可,那么调用intern()方法必然会返回同一个池中对象。

即: s.equals(t) == true

B)StringBuffer类

StringBuffer是一个可变的字符串类,利用append()方法可以在原有字符串基础上添加字符串。

上述代码说明,可以连续用append()方法添加字符串。

还有上述代码运用了toString()方法,返回一个字面值相同的String对象。

String类详解,StringBuffer的更多相关文章

  1. Java String类详解

    Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...

  2. java 复习整理(四 String类详解)

    String 类详解   StringBuilder与StringBuffer的功能基本相同,不同之处在于StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此效率上S ...

  3. STL之string类详解

    通过在网站上的资料搜集,得到了很多关于string类用法的文档,通过对这些资料的整理和加入一些自己的代码,就得出了一份比较完整的关于string类函数有哪些和怎样用的文档了!下面先罗列出string类 ...

  4. Java的String类详解

    Java的String类 String类是除了Java的基本类型之外用的最多的类, 甚至用的比基本类型还多. 同样jdk中对Java类也有很多的优化 类的定义 public final class S ...

  5. Java常用类(一)String类详解

    前言 在我们开发中经常会用到很多的常用的工具类,这里做一个总结.他们有很多的方法都是我们经常要用到的.所以我们一定要把它好好的掌握起来! 一.String简介 1.1.String(字符串常量)概述 ...

  6. String类详解

    看了很多文章事实证明之前的通过new创建String对象只有一个是错误的,实际上创建一个或者创建两个对象,一个在堆区,一个在常量池,当常量池中已经存在就不会创建.看了一篇非常好的文章http://ww ...

  7. Java常用类(二)String类详解

    前言 在我们开发中经常会用到很多的常用的工具类,这里做一个总结.他们有很多的方法都是我们经常要用到的.所以我们一定要把它好好的掌握起来! 一.String简介 1.1.String(字符串常量)概述 ...

  8. String 类详解

    StringBuilder与StringBuffer的功能基本相同,不同之处在于StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此效率上StringBuilder类 ...

  9. String类详解(1)

    首先String是一个类. 1,实例化String类方法. 1)直接赋值:String name="haha"; 2)通过关键字:String name=new String(&q ...

随机推荐

  1. [译]使用AES 256以达到SSL/TLS安全最大化

    原文链接:https://luxsci.com/blog/256-bit-aes-encryption-for-ssl-and-tls-maximal-security.html 原文发表时间:201 ...

  2. AS3深拷贝数据对象(2)深拷贝VO对象

    Topic:对于用户自定义的VO对象进行深拷贝,一种VO对象的某属性可能是另一种VO对象的实例. 方法1:通过传说中的“AS3隐藏特性——ByteArray.writeObject和readObjec ...

  3. Laxcus大数据管理系统2.0(8)- 第六章 网络通信

    第六章 网络通信 Laxcus大数据管理系统网络建立在TCP/IP网络之上,从2.0版本开始,同时支持IPv4和IPv6两种网络地址.网络通信是Laxcus体系里最基础和重要的一环,为了能够利用有限的 ...

  4. mysql中data_format用法

    date_format(date,format)可以把日期转换为制定的格式: mysql> select date_format('2008-08-08 22:23:00', '%W %M %Y ...

  5. Are Landing Pages Killing Your Conversion Rate?

    http://searchenginewatch.com/sew/how-to/2411253/are-landing-pages-killing-your-conversion-rate

  6. js实现页面悬浮框

    当滚动条下拉时,悬浮框位置不变,主要是 position:fixed;样式的作用. 当下拉到一定程度,接近footer时,我用js控制div消失,往上拉滚动条时又显示. <!DOCTYPE ht ...

  7. 阅读jQuery源码的18个惊喜

    注释:本文使用$.fn.method指代调用一系列选中的元素的方法.例如,$.fn.addClass,指代$('div').addClass(‘blue’) 或 $('a.active’).addCl ...

  8. Android控件大全(三)——RecyclerView

    是时候用RecyclerView来替换ListView和GridView了 好处就不多说了,百度一搜一大把,来介绍下用法 先定义个适配器: public class BottomSheetAdapte ...

  9. docker1.12 安装pxc(Percona XtraDB Cluster )测试

    docker1.12 安装pxc(Percona XtraDB Cluster )测试

  10. 【MySQL】MySQL回滚工具

    1.mysqlbinlog把事务从binlog中导出 2.从导出的binlog中找到要回滚的事务,去掉第一个DML语句前和最后一个DML语句后与DML无关的binlog信息 3.在目录中新建一个tab ...