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我们可以这样理解:
- 若变量是基本类型则它的值是不能变的。
- 若变量是对象则它的索引指向(在堆栈中)不可变,而只可能改变索引指定的对象(堆中)内的值。
而由于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形式
分享到:
相关推荐
#### 小结 以上是`MyString`类的一些基础功能实现。这个简单的自定义字符串类包含了常见的构造函数、析构函数以及一系列用于字符串操作的方法。通过这种方式,我们可以更深入地理解字符串类的设计原则和实现细节。...
### Struts2学习小结 #### 一、Struts2简介及环境搭建 **Struts2** 是一款基于 **MVC**(Model-View-Controller)设计模式的开源框架,用于简化 Java Web 应用程序的开发过程。通过将业务逻辑、用户界面以及控制...
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中的蓝图,它定义了一组特性和行为,这些特性和行为共同构成一个特定实体。类可以包含字段(或称为属性),它们代表对象的状态,...
小结 术语 第一部分 基本语言 第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算法,这对于将来从事数据分析、数据挖掘等相关工作具有重要意义。
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初学小结 在IT领域,JavaScript是一种广泛使用的编程语言,主要用于网页和网络应用的开发。这篇小结将深入探讨JavaScript的基础知识,包括语法、数据类型、控制结构、函数、对象以及它在实际开发中的应用...
2. `getProperty(String key)` 和 `setProperty(String key, String value)`:获取和设置特定键的值。当需要根据键查找对应的值时,这两个方法非常有用。 3. `loadFromXML(InputStream)` 和 `storeToXML...
**JasperReport应用小结** JasperReport是一款强大的开源报表工具,主要应用于Java环境中,用于生成各种复杂的报表,包括PDF、HTML、Excel等多种格式。它以其丰富的设计功能、灵活的数据处理以及良好的社区支持,...
这篇博客文章“Hibernate操作Oracle中Clob、Blob字段小结”可能会探讨如何在Hibernate中有效地处理这两种类型的数据。 1. **Clob与Blob的理解**: - Clob:Clob是用于存储大量字符数据的类型,例如长篇文章、XML...
这篇基于Netty的WebSocket开发小结将探讨如何使用Netty实现WebSocket服务端和客户端的交互。 首先,我们要理解WebSocket的基本概念。WebSocket协议定义了一种在单个TCP连接上进行全双工通信的协议。它通过在握手...
String password = new String(passwordChars); // 检查用户名和密码是否正确 if (isValidLogin(username, password)) { // 登录成功,进行后续操作 } else { // 登录失败,显示错误信息 } } }); ``` 在`...
这个小结将深入探讨Quartz的核心概念、使用场景以及如何与Spring框架集成。 一、Quartz简介 Quartz是由Caledonia Software公司开发的Java定时任务库,它提供了一种高度可配置的方式来安排和执行工作。Quartz支持...
这篇小结将聚焦于JavaScript的基础和进阶知识,帮助你在面试中表现出色。以下是对"javascript面试应急知识点小结"的详细解析。 一、基础概念 1. 变量与数据类型:JavaScript有七种数据类型,包括基本数据类型...
《Java基础小结》 Java,作为一种广泛应用的编程语言,以其跨平台、面向对象的特点深受开发者喜爱。这篇博文和随附的PDF笔记旨在总结Java的基础知识,帮助初学者巩固理解,同时也为有经验的开发者提供回顾参考。 1...
[parser parseXMLString:[document XMLString] error:nil]; ``` 这样,你就可以成功解析XML文件,获取到`ThemeParser`类中存储的主题名称和颜色信息。 总结一下,GDataXMLParser是iOS开发中解析XML文件的一个强大...
**JSTL(JavaServer Pages Standard Tag Library)小结** JSTL,全称为JavaServer Pages Standard Tag Library,是Java Web开发中常用的一套标准标签库,它为开发者提供了处理常见页面逻辑的功能,如迭代、条件判断...