Java 基础 - 字符串类

news/2025/1/6 6:53:55/文章来源:https://www.cnblogs.com/baokang/p/18552335

字符串类

重要的字符串类有 String、StringBuilder、StringBuffer

1、String

String 是不可变类,内部是由 final 定义的字符数据构成。

private final char value[];

1.1 String 类的层次结构如下:

String 实现了比较接口,字符序列接口,序列化接口,具有以上接口的特性

1.2 重写了 Object 的 equals() 和 hash() 方法

使用字符去比较和计算哈希值

public boolean equals(Object anObject) {if (this == anObject) {return true;}
if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i]) {return false;i++;}return true;}}return false;
}public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;
}

1.3 String 常量池 在 JVM 中的存储位置

在 jdk1.7 之前,字符串常量池存储于方法区中

在 jdk1.7 以及之后,字符串常量池存储于堆中,主要原因:(1)方法区空间有限,容易造成方法区内存溢出(2)放在堆中可以进行复用,节省存储空间

 

2、StringBuilder

StringBuilder 是可变类,内部使用字符数组实现 ,并且有一个 内置计数器。

StringBuilder 是线程不安全的,类实现没有使用同步机制。

使用了构建器模式,每一个修改操作都会返回自身。

使用计数器是因为,value 初始化的时候可能会适当扩展数组(+16),但是实际上内容长度没有扩大

char[] value;
int count;// 构造函数
public StringBuilder(String str) {// 数组长度super(str.length() + 16);// 真正字符长度append(str);
}

2.1 StringBuilder 类的层次结构如下:

对于字符串的具体操作,全部由 AbstractStringBuilder 实现,StringBuilder 中只有四个构造函数

2.2 append 函数实现流程

 

3、StringBuffer

StringBuffer 是 StringBuilder 的线程安全版本,所有读写操作使用 synchronized 进行修饰,多线程环境下有且只有一个线程可以对 StringBuffer 对象进行读写

StringBuffer 的类层次结构如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836130.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows调用系统右键发送到zip打包指定文件

前言全局说明Windows 从 XP 自带的zip文件压缩/解压工具组件,但使用过程中,只能用鼠标操作,命令行中没有提供相关命令 如果想要用命令行打包成zip后缀的,就要调用第三方软件如7z,这样不方便。 今天在搜索如何修改右键新建文本名时,发现注册表中有个 @zipfldr.dll,-10148 …

Python程序py代码加密方法

Python程序语言使用方便,应用范围广,但Python的代码加密保护是一个问题,下面介绍一种专业的python程序py代码加密方法,可以有效地保护源代码!下载最新加密锁开发工具包 http://chinadlp.com/?list-DriveDownload.html完全默认安装后,打开如下开发工具 在安装目录下找到…

Nuxt.js 应用中的 vite:serverCreated 事件钩子

title: Nuxt.js 应用中的 vite:serverCreated 事件钩子 date: 2024/11/18 updated: 2024/11/18 author: cmdragon excerpt: 通过使用 vite:serverCreated 钩子,开发者可以在 Vite 服务器创建时执行特定的操作,包括添加中间件和自定义配置。这使得在开发环境中能够快速响应请…

DDL:数据库操作

1.所有的命令代码需要“;”做结尾 ,nivicat中已经默认加上了,但是命令行中一定要自己手动加上,不然不会被判定为写完语句。2.不区分大小写,nivicat中无需注意“;”结尾3.四种SQL语句: 数据查询语言:基本结构是SELECT子句,FROM子句,WHERE子句组成的查询快 数据操纵语言…

百度网盘文件手机和电脑如何保存、下载、打印、发送给好友?

原文持续更新中:https://www.cnblogs.com/MrFlySand/p/18552343 教程一:手机保存网盘文件并下载 教程介绍:通过别人发送的链接,用手机将别人的资源保存到自己的网盘中,随时根据自己的需求下载文件,对文件进行查看、编辑、打印等操作。操作教程如下:将链接发送到微信/QQ中…

生成 Windows 窗体 Blazor 应用 (WinForm+Bootstrap Blazor)

官方文档有介绍如何用 WinForm+ Blazor 生成应用, 生成 Windows 窗体 Blazor 应用先按照官方文档 启动 Visual Studio。 在“开始”窗口中,选择“创建新项目”: 创建WinForm项目 起名为:WinFormsBlazor框架我们选择:.NET 8.0 创建完成项目后,使用 NuGet 包管理器安装…

cmu15545笔记-查询执行(Query Excution)

目录执行模型Iterator ModelMaterialization ModelVectoriazation Model对比数据访问方式Sequential ScanIndex ScanMulti-Index ScanHalloween Problem表达式求值 执行模型 执行模型(Processing Model)定义了数据库系统如何执行一个查询计划。 Iterator Model 基本思想:采用…

【大模型】模型安全

核心内容来自《大模型安全研究报告(2024年).pdf》 更多的安全内容见内部“语雀-大模型”-笔记真实性:训练数据能真实反映物理世界客观规律和人类社会实际运转情况的性质。 多样性:训练数据应覆盖尽可能多的样本,以确保大模型能对不同情况进行泛化的性质。 准确性:针对所规…

基于WPF开发视频播放器

在实际应用中,视频播放功能在很多软件中都会用到,将音频和视频集成到应用程序中不仅可以增强用户体验,还能起到事半功倍的效果。今天本文以一个简单的小例子,简述如何通过WPF中的MediaElement开发视频播放器,仅供学习分享使用,如有不足之处,还请指正!在实际应用中,视频…

wincc 7.5SP2下VBA编程学习练习15:批量删除变量

在前面练习的基础上学习批量删除变量。 新建下面的脚本: Sub DeleteTags()批量删除变量Dim hmigo As hmigoDim strTagName As StringDim i As IntegerSet hmigo = New hmigoFor i = 1 To 5 strTagName = "Real" & CStr(i) hmigo.DeleteTag strTagNameNext…

vue2-基础核心

vue简介 vue中文官网动态构建用户界面的渐进式 JavaScript 框架 vue的特点:遵循MVVM模式 采用组件化模式,提高代码复用率,让代码更好维护 声明式编码,无需直接操作DOM,提高开发效率,编码简洁、体积小,运行效率高 本身只关注UI,也可以引入其他三方库开发项目 使用虚拟DOM…