`
wsckw5
  • 浏览: 27599 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

String源码观看小结

阅读更多

String是java最常的类,但它不是基础类型--因而内存的堆栈中它是以地址的形式保存.而它有事一个很特殊引用类型:类的声明是final,它是不能被继承的:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence

String的主要属性:

 private final char value[];  //String本质就是Char数组
 private final int offset;   //起始位?这个变量没明白,不过可看作数字0
 private final int count;  //就是Sting的length
 private int hash;  //hash码

StringBuffer的重要属性:

 char value[];
 int count;

非常好!String的属性基本都是final类型,这应该就是Think In Java里的恒常性的关键所在.

对于final我们可以这样理解:

  1. 若变量是基本类型则它的值是不能变的。
  2. 若变量是对象则它的索引指向(在堆栈中)不可变,而只可能改变索引指定的对象(堆中)内的值。

而由于String内部变量是Final所以String的变量的索引指向不能变,而Char数组又是长度固定(String的改变往往带来长度的变化)。所以对String的改变不能将原来的String改变(原来的String的value指定被锁死),而只能重新返回一个新的String.这就是String与其他普通对象的重要区别---对其任何的本质上的改变都不会改变对象本身,而是返回一个新的对象.

 

StringBuffer由于不是final因而对StringBuffer的值改变只需要将类里的value[]的指向重新定向即可而不用重新new一个StringBuffer返回

 

String的构造器

    public String()
    {
        offset = 0;
        count = 0;
        value = new char[0];//这个为什么不设置为null? 感觉是由于String有"+"操作,而null不可能有"+"操作
}

  String的equals方法---由于char本质是数字因而直接==比较。

 public boolean equals(Object obj)
    {
        if(this == obj)
            return true;
        if(obj instanceof String)
        {
            String s = (String)obj;  int i = count;
            if(i == s.count)
            {
                char ac[] = value;  char ac1[] = s.value;
                int j = offset;  int k = s.offset;
                while(i-- != 0) //值得学习 非常的精巧
                    if(ac[j++] != ac1[k++])
                        return false;
                return true;
            }
        }
        return false;
    }

   在看完string源码后感觉String的本质就是Char[],他所有的方法都围绕着数组.而且虽然String有大量的方法不过一般背后都有一个通用方法,而其他方法都是调用这个通用方法实现的.而这里感觉最好的就是:

while(i-- != 0)

简直精巧极了!这可能就是代码的优雅.

 

总结:想看String的源码就是因为Think In Java所说的恒常性.而String的实现比较简单---重要变量为final形式

 

 

 

 

分享到:
评论
1 楼 sangli 2010-01-12  
为什么只拿出一个方法啊。
对于你说的
《而只能重新返回一个新的String.这就是String与其他普通对象的重要区别---对其任何的本质上的改变都不会改变对象本身,而是返回一个新的对象.
》我支持。因为他是通过System.arraycopy把字符串复制的。所以是个新的对象。
private final int offset;   //起始位?这个变量没明白,不过可看作数字0 
对于这个我认为是个中间值。你看API对System.arraycopy的解释。你再对照源码看下。你就明白了。
其实我感觉你应该说下String里面的算法。我认识最主要就是他的三个全局变量。通过算法来对字符串的各种操作。
你所说的String本质是char[]。而char[]的本质是什么?

相关推荐

    C++语言string类的实现 完整源代码 pdf

    #### 小结 以上是`MyString`类的一些基础功能实现。这个简单的自定义字符串类包含了常见的构造函数、析构函数以及一系列用于字符串操作的方法。通过这种方式,我们可以更深入地理解字符串类的设计原则和实现细节。...

    Struts2学习小结

    ### Struts2学习小结 #### 一、Struts2简介及环境搭建 **Struts2** 是一款基于 **MVC**(Model-View-Controller)设计模式的开源框架,用于简化 Java Web 应用程序的开发过程。通过将业务逻辑、用户界面以及控制...

    Visual C# 2005程序设计自学手册 随书源码第一部分(共三部)

    1.5 本章小结 17 第2章 C#语言基础 18 2.1 C#语言简介 19 2.2 数据类型 19 2.2.1 什么是数据类型 19 2.2.2 值类型的使用 19 2.2.3 引用类型的使用 19 2.2.4 什么是装箱和拆箱 21 2.2.5 装箱和拆箱...

    Java类与对象小结

    这篇小结将深入探讨这两个关键概念,以及它们在实际编程中的应用。 首先,类是Java中的蓝图,它定义了一组特性和行为,这些特性和行为共同构成一个特定实体。类可以包含字段(或称为属性),它们代表对象的状态,...

    C++ primer 第4版 原书+习题解答+源码 清晰pdf

     小结  术语  第一部分 基本语言  第2章 变量和基本类型  2.1 基本内置类型  2.2 字面值常量  2.3 变量  2.4 const限定符  2.5 引用  2.6 typedef名字  2.7 枚举  2.8 类类型  2.9 编写...

    微信招聘小程序,运营版(源码)。(请勿违法使用)

    最高薪资 detPayMax Number 薪资上限和(日结)小时工薪资 薪资说明 payDescription String 点开招聘列表后进入详细介绍页面:工资说明 食宿说明 boardDescription String 同上:伙食住宿详细说明 招聘要求 ...

    关联规则的程序设计(源码)

    ### 关联规则的程序设计(源码) ...#### 小结 本次实验不仅加深了对关联规则理论知识的理解,更重要的是通过实践操作掌握了如何使用Java实现Apriori算法,这对于将来从事数据分析、数据挖掘等相关工作具有重要意义。

    深入浅出Struts2(附源码)

    1.4 小结 13 第2章初识Struts 14 2.1 Struts的优点 14 2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts.properties文件 26 2.5 Struts应用程序示例...

    JavaScript初学小结

    JavaScript初学小结 在IT领域,JavaScript是一种广泛使用的编程语言,主要用于网页和网络应用的开发。这篇小结将深入探讨JavaScript的基础知识,包括语法、数据类型、控制结构、函数、对象以及它在实际开发中的应用...

    Properties类小结

    2. `getProperty(String key)` 和 `setProperty(String key, String value)`:获取和设置特定键的值。当需要根据键查找对应的值时,这两个方法非常有用。 3. `loadFromXML(InputStream)` 和 `storeToXML...

    Jasperreport应用小结

    **JasperReport应用小结** JasperReport是一款强大的开源报表工具,主要应用于Java环境中,用于生成各种复杂的报表,包括PDF、HTML、Excel等多种格式。它以其丰富的设计功能、灵活的数据处理以及良好的社区支持,...

    Hibernate操作Oarcle中Clob、Blob字段小结

    这篇博客文章“Hibernate操作Oracle中Clob、Blob字段小结”可能会探讨如何在Hibernate中有效地处理这两种类型的数据。 1. **Clob与Blob的理解**: - Clob:Clob是用于存储大量字符数据的类型,例如长篇文章、XML...

    基于netty的websocket开发小结

    这篇基于Netty的WebSocket开发小结将探讨如何使用Netty实现WebSocket服务端和客户端的交互。 首先,我们要理解WebSocket的基本概念。WebSocket协议定义了一种在单个TCP连接上进行全双工通信的协议。它通过在握手...

    Java学习事件机制小结

    String password = new String(passwordChars); // 检查用户名和密码是否正确 if (isValidLogin(username, password)) { // 登录成功,进行后续操作 } else { // 登录失败,显示错误信息 } } }); ``` 在`...

    Quartz使用小结

    这个小结将深入探讨Quartz的核心概念、使用场景以及如何与Spring框架集成。 一、Quartz简介 Quartz是由Caledonia Software公司开发的Java定时任务库,它提供了一种高度可配置的方式来安排和执行工作。Quartz支持...

    javascript面试应急知识点小结

    这篇小结将聚焦于JavaScript的基础和进阶知识,帮助你在面试中表现出色。以下是对"javascript面试应急知识点小结"的详细解析。 一、基础概念 1. 变量与数据类型:JavaScript有七种数据类型,包括基本数据类型...

    java基础小结

    《Java基础小结》 Java,作为一种广泛应用的编程语言,以其跨平台、面向对象的特点深受开发者喜爱。这篇博文和随附的PDF笔记旨在总结Java的基础知识,帮助初学者巩固理解,同时也为有经验的开发者提供回顾参考。 1...

    iphone使用GDataXMLParser解析xml文件小结

    [parser parseXMLString:[document XMLString] error:nil]; ``` 这样,你就可以成功解析XML文件,获取到`ThemeParser`类中存储的主题名称和颜色信息。 总结一下,GDataXMLParser是iOS开发中解析XML文件的一个强大...

    JSTL小结

    **JSTL(JavaServer Pages Standard Tag Library)小结** JSTL,全称为JavaServer Pages Standard Tag Library,是Java Web开发中常用的一套标准标签库,它为开发者提供了处理常见页面逻辑的功能,如迭代、条件判断...

Global site tag (gtag.js) - Google Analytics