[源码解析]String

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.youkuaiyun.com/m0_69908381/article/details/144788579
出自【进步*于辰的博客

注:依赖类:CharacterArraysSystemLocalePattern

文章目录

1、概述

继承关系:

  • java.lang.Object
    • java.lang.String

所有已实现的接口:
Serializable、CharSequence、Comparable<String>


public final class String extends Object implements Serializable, Comparable<String>, CharSequence

String 类代表字符串。Java 程序中的所有 字符串字面值 \color{green}{字符串字面值} 字符串字面值(如"abc" )都作为此类的实例来实现。

字符串是常量;它们的值在创建之后不能改变。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享它们。例如:

String str = "abc";

等效于:

char data[] = {
   
   'a', 'b', 'c'};
String str = new String(data);

下面给出了一些如何使用字符串的更多例子:

sout "abc";
String cde = "cde";
sout "abc" + cde;
String c = "abc".substring(2,3);
String d = cde.substring(1, 2);

String 类包括的方法有:检查序列的单个字符;比较字符串;搜索字符串;提取子字符串;创建字符串副本,在该副本中,所有的字符都被转换为大写或小写形式。大小写映射基于 Character 类指定的 Unicode Standard 版本。

Java 语言提供对 字符串串联符号 \color{blue}{字符串串联符号} 字符串串联符号(“+”)和其他对象到字符串的转换的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append()实现的。字符串转换是通过 toString()实现的,该方法由 Object 类定义,并可被 Java 中所有类继承。有关字符串串联和转换的更多信息,请参阅 Gosling、Joy 和 Steele 合著的 《The Java Language Specification》。

注意: \color{red}{注意:} 注意:除非另行说明,否则将 null 参数传递给此类中的构造方法或方法都会抛出 NullPointerException

String 表示一个UTF-16格式的字符串,其中的增补字符 代理项对 \color{brown}{代理项对} 代理项对表示(有关详细信息,请参阅字符类中的 Unicode 字符表示形式)。索引值是指 char 代码单元,因此增补字符在 String 中占用两个位置

注: \color{red}{注:} 注:String 类提供处理 Unicode 代码点和 Unicode 代码单元的方法。 (关于代码点与代码单元的说明,见字符类)

从以下版本开始:
JDK1.0
另请参见:
Object.toString()、StringBuffer、StringBuilder、Charset、序列化表格

2、构造方法摘要

属性说明:

private final char value[];
private int hash; // 默认值: 0

2.1 null

初始化一个新创建的 String 对象,它表示一个空字符序列。

public String() {
   
   
    this.value = "".value;
}

2.2 byte[] bytes

构造一个新的 String,方法是使用平台的默认字符集解码字节的指定数组。

public String(byte bytes[]) {
   
   
    this(bytes, 0, bytes.length);
}

调用第4项,故 offset 为0,length 为bytes.length

2.3 byte[] ascii, int hibyte

已过时。 该方法无法将字节正确转换为字符。从 JDK 1.1 起,完成该转换的首选方法是通过 String 构造方法,该方法接受一个字符集名称或使用平台的默认字符集。

2.4 byte[] bytes, int offset, int length

构造一个新的 String,方法是使用指定的字符集解码字节的指定子数组。即取 bytes 中从offset开始、length长度内的byte 序列构建字符串。

public String(byte bytes[], int offset, int length) {
   
   
    checkBounds(bytes, offset, length);
    this.value = StringCoding.decode(bytes, offset, length);
}

后续补充。

2.5 byte[] ascii, int hibyte, int offset, int count

已过时。 该方法无法将字节正确转换为字符。从 JDK 1.1 开始,完成该转换的首选方法是通过 String 构造方法,它接受一个字符集名称,或者使用平台默认的字符集。

2.6 byte[] bytes, int offset, int length, String charsetName

构造一个新的 String,方法是使用指定的字符集解码字节的指定子数组。

public String(byte bytes[], int offset, int length, String charsetName)
        throws UnsupportedEncodingException {
   
   
    if (charsetName == null)
        throw new NullPointerException("charsetName");
    checkBounds(bytes, offset, length);
    this.value = StringCoding.decode(charsetName, bytes, offset, length);
}

后续补充。

2.7 byte[] bytes, String charsetName

构造一个新的 String,方法是使用指定的字符集解码指定的字节数组。

public String(byte bytes[], String charsetName)
        throws UnsupportedEncodingException {
   
   
    this(bytes, 0, bytes.length, charsetName);
}

2.8 char[] value

分配一个新的 String,它表示当前字符数组参数中包含的字符序列。

public String(char value[]) {
   
   
    this.value = Arrays.copyOf(value, value.length);
}

将字符序列value所有字符取出,赋值于当前字符序列。

2.9 char[] value, int offset, int count

分配一个新的 String,它包含来自该字符数组参数的一个子数组的字符。
在这里插入图片描述

2.10 int[] codePoints, int offset, int count

分配一个新的 String,它包含该 Unicode 代码点数组参数的一个子数组的字符。即先将int[]转为字符序列,再构造新 String。

2.11 String original

初始化一个新创建的 String 对象,表示一个与该参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的一个副本。

public String(String original) {
   
   
    this.value = original.value;
    this.hash = original.hash;
}

2.12 StringBuffer buffer

分配一个新的字符串,它包含当前包含在字符串缓冲区参数中的字符序列。

public String(StringBuffer buffer) {
   
   
    synchronized(buffer) {
   
   
        this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
    }
}

2.13 StringBuilder builder

分配一个新的字符串,它包含当前包含在字符串生成器参数中的字符序列。

public String(StringBuilder builder) {
   
   
    this.value = Arrays.copyOf(builder.getValue(), builder.length());
}

可见,此方法与上一项的底层都调用copyOf()

将字符串缓冲区/生成器中的所有字符取出,赋值于当前字符序列。

注意: \color{red}{注意:} 注意:上一项使用了同步锁synchronized,故线程安全,而此项不是。

3、方法摘要

3.1 char charAt(int index)

返回指定索引处的 char 值。

public char charAt(int index) {
   
   
	// value是此字符串的字符序列。类型是char[],末尾元素索引为value.length - 1
    if ((index < 0) || (index >= value.length)) {
   
   
        throw new StringIndexOutOfBoundsException(index);
    }
    return value[index];
}

3.2 int codePointAt(int index)

返回指定索引处的字符(Unicode 代码点),

public int codePointAt(int index) {
   
   
    if ((index < 0) || (index >= value.length)) {
   
   
        throw new StringIndexOutOfBoundsException(index);
    }
    return Character.codePointAtImpl(value, index, value.length);
}

3.3 int codePointBefore(int index)

返回指定索引之前的字符(Unicode 代码点),

public int codePointBefore(int index) {
   
   
    int i = index - 1;
    if ((i < 0) || (i >= value.length)) {
   
   
        throw new StringIndexOutOfBoundsException(index);
    }
    return Character.codePointBeforeImpl(value, index, 0);
}

3.4 int codePointCount(int beginIndex, int endIndex)

返回此 String 的指定文本范围中的 Unicode 代码点数。

public int codePointCount(int beginIndex, int endIndex) {
   
   
    if (beginIndex < 0 || endIndex > value.length || beginIndex > endIndex) {
   
   
        throw new IndexOutOfBoundsException();
    }
    return Character.codePointCountImpl(value, beginIndex, endIndex - beginIndex);
}

3.5 int compareTo(String anotherString)

按字典顺序比较两个字符串。
在这里插入图片描述
示例:

"csdn".compareTo("csXn");// 12-----------A
"csdn".compareTo("cs");// 2--------------b

代码说明:

  1. 代码A。"csdn""csXn"长度相同,因此以"csdn"的字符序列作为遍历限制。它们的第一个不相同字符的索引是2,即"d""X"。其中,"d" A S C L L 码 \color{green}{ASCLL码} ASCLL是100,而"X"是88,故结果是12;
  2. 代码B。"csdn""cs"长度不相同,因此以"cs"的字符序列作为遍历限制。在"cs"的字符序列内,2个字符串的字符序列相同,故直接返回2字符串的长度差,得2。

3.6 int compareToIgnoreCase(String str)

不考虑大小写,按字典顺序比较两个字符串,

public int compareToIgnoreCase(String str) {
   
   
    return CASE_INSENSITIVE_ORDER.compare(this, str);
}

后续解析。

3.7 String concat(String str)

将指定字符串联到此字符串的结尾。

public String concat(String str) {
   
   
    if (str.isEmpty()) {
   
   
        return this;
    }
    int len = value.length;
    int otherLen = str.length();
    char buf[] = Arrays.copyOf(value, len + otherLen);// 扩容,扩容部分都是空字符,以便存储追加字符

	// 将buf的字符序列追加到当前字符序列末尾,末尾后一位的索引是 value.length
    str.getChars(buf, len);
    return new String(buf, true);
}

3.8 boolean contains(CharSequence s)

当且仅当此字符串包含 char 值的指定序列时,才返回 true。

public boolean contains(CharSequence s) {
   
   
    return indexOf(s.toString()) > -1;
}

3.9 boolean contentEquals(CharSequence cs)

当且仅当此 String 表示与指定序列相同的 char 值时,才返回 true。

/**
 * 1、CharSequence 接口的实现类有:此类、StringBuilder、StringBuffer、CharBuffer。
 * 2、此类底层逻辑类似 equals()。
 */
public boolean contentEquals(CharSequence cs) {
   
   
	// 若 cs 是 StringBuffer, StringBuilder
    if (cs instanceof AbstractStringBuilder) {
   
   
        if (cs instanceof StringBuffer) {
   
   
            synchronized(cs) {
   
   
               return nonSyncContentEquals((AbstractStringBuilder)cs);// 同 equals()
            }
        } else {
   
   
            return nonSyncContentEquals((AbstractStringBuilder)cs);
        }
    }
    
    // 若 cs 是 String
    if (cs instanceof String) {
   
   
        return equals(cs);
    }
    
    // 若 cs 是“通用的” CharSequence 子类
    char v1[] = value;
    int n = v1.length;
    if (n != cs.length()) {
   
   
        return false;
    }
    for (int i = 0; i < n; i++) {
   
   
        if (v1[i] != cs.charAt(i)) {
   
   
            return false;
        }
    }
    return true;
}

3.10 boolean contentEquals(StringBuffer sb)

当且仅当此 String 表示与指定的 StringBuffer 相同的字符序列时,才返回 true。

public boolean contentEquals(StringBuffer sb) {
   
   
    return contentEquals((CharSequence)sb);
}

3.11 static String copyValueOf(char[] data)

返回指定数组中表示该字符序列的字符串。

public static String copyValueOf(char data[]) {
   
   
    return new String(data);
}

调用第2.8项。

3.12 static String copyValueOf(char[] data, int offset, int count)

返回指定数组中表示该字符序列的字符串。

public static String copyValueOf(char data[], int offset, int count) {
   
   
    return new String(data, offset, count);
}

调用第2.9项。

3.13 boolean endsWith(String suffix)

测试此字符串是否以指定的后缀结束。

public boolean endsWith(String suffix) {
   
   
    return startsWith(suffix, value.length - suffix.value.length);
}

调用第44项,第44项阐明,测试此字符串是否以指定前缀开始,对应toffset(开始索引)为0,即第43项。而若toffsetvalue.length - suffix.value.length,自然是:测试此字符串是否以指定后缀结束。

3.14 boolean equals(Object anObject)

比较此字符串与指定的对象。

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) {
   
   // 若2个字符串长度不相等,自然不相等,直接返回 false
            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;
}

3.15 boolean equalsIgnoreCase(String anotherString)

将此 String 与另一个 String 进行比较,不考虑大小写。

public boolean equalsIgnoreCase(String anotherString) {
   
   
    return (this == anotherString) ? true
            : (anotherString != null)
            && (anotherString.value.length == value.length)
            && regionMatches(true, 0, anotherString, 0, value.length);
}

后续解析。

3.16 static String format(Locale l, String format, Object… args)

使用指定的语言环境(语种)、格式字符串和参数返回一个格式化字符串。

public static String format
【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++和QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系列的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观和便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱和度、亮度)色彩模型相关的代码或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架和其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活和精准地控制色彩。
标题基于Spring Boot的二手物品交易网站系统研究AI更换标题第1章引言阐述基于Spring Boot开发二手物品交易网站的研究背景、意义、现状及本文方法与创新点。1.1研究背景与意义介绍二手物品交易的市场需求和Spring Boot技术的适用性。1.2国内外研究现状概述当前二手物品交易网站的发展现状和趋势。1.3论文方法与创新点说明本文采用的研究方法和在系统设计中的创新之处。第2章相关理论与技术介绍开发二手物品交易网站所涉及的相关理论和关键技术。2.1Spring Boot框架解释Spring Boot的核心概念和主要特性。2.2数据库技术讨论适用的数据库技术及其在系统中的角色。2.3前端技术阐述与后端配合的前端技术及其在系统中的应用。第3章系统需求分析详细分析二手物品交易网站系统的功能需求和性能需求。3.1功能需求列举系统应实现的主要功能模块。3.2性能需求明确系统应满足的性能指标和安全性要求。第4章系统设计与实现具体描述基于Spring Boot的二手物品交易网站系统的设计和实现过程。4.1系统架构设计给出系统的整体架构设计和各模块间的交互方式。4.2数据库设计详细阐述数据库的结构设计和数据操作流程。4.3界面设计与实现介绍系统的界面设计和用户交互的实现细节。第5章系统测试与优化说明对系统进行测试的方法和性能优化的措施。5.1测试方法与步骤测试环境的搭建、测试数据的准备及测试流程。5.2测试结果分析对测试结果进行详细分析,验证系统是否满足需求。5.3性能优化措施提出针对系统性能瓶颈的优化建议和实施方案。第6章结论与展望总结研究成果,并展望未来可能的研究方向和改进空间。6.1研究结论概括本文基于Spring Boot开发二手物品交易网站的主要发现和成果。6.2展望与改进讨论未来可能的系统改进方向和新的功能拓展。
1. 用户与权限管理模块 角色管理: 学生:查看个人住宿信息、提交报修申请、查看卫生检查结果、请假外出登记 宿管人员:分配宿舍床位、处理报修申请、记录卫生检查结果、登记晚归情况 管理员:维护楼栋与房间信息、管理用户账号、统计住宿数据、发布宿舍通知 用户操作: 登录认证:对接学校统一身份认证(模拟实现,用学号 / 工号作为账号),支持密码重置 信息管理:学生完善个人信息(院系、专业、联系电话),管理员维护所有用户信息 权限控制:不同角色仅可见对应功能(如学生无法修改床位分配信息) 2. 宿舍信息管理模块 楼栋与房间管理: 楼栋信息:名称(如 "1 号宿舍楼")、层数、性别限制(男 / 女 / 混合)、管理员(宿管) 房间信息:房间号(如 "101")、户型(4 人间 / 6 人间)、床位数量、已住人数、可用状态 设施信息:记录房间内设施(如空调、热水器、桌椅)的配置与完好状态 床位管理: 床位编号:为每个床位设置唯一编号(如 "101-1" 表示 101 房间 1 号床) 状态标记:标记床位为 "空闲 / 已分配 / 维修中",支持批量查询空闲床位 历史记录:保存床位的分配变更记录(如从学生 A 调换到学生 B 的时间与原因) 3. 住宿分配与调整模块 住宿分配: 新生分配:管理员导入新生名单后,宿管可按专业集中、性别匹配等规则批量分配床位 手动分配:针对转专业、复学学生,宿管手动指定空闲床位并记录分配时间 分配结果公示:学生登录后可查看自己的宿舍信息(楼栋、房间号、床位号、室友列表) 调整管理: 调宿申请:学生提交调宿原因(如室友矛盾、身体原因),选择意向宿舍(需有空位) 审批流程:宿管审核申请,通过后执行床位调换,更新双方住宿信息 换宿记录:保存调宿历史(申请人、原床位、新床位、审批人、时间) 4. 报修与安全管理模块 报修管理: 报修提交:学生选择宿舍、设施类型(如 "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廖小凡

感谢打赏!很高兴可以帮到你!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值