【Java|第十九篇】面向对象九——String类和枚举类

(四)面向对象

11、String类
(1)概述

        <1>String是一个类,引用数据类型,用来表示字符串;

        <2>String是Lang包下的类,使用不需要导包;

        <3>字符串的值不能变,String对象是不可变的,一旦创建,他们的值就不能被修改。

       这里的意思是String对象所标识的栈空间中的引用地址值可以改

       但是堆空间中创建的对象的属性值不可以改变,一旦创建就不能更改!

示例:

String s1 = new String("123");
s1 = new String("345");
//这样修改是可以的,并没有改动上一个对象中的属性123,只是更改了s1的引用地址值
s1 = null;
//这样修改也可以,将引用地址值指向了null

       String类型的这个特点,使得很多操作其实都是在创建新的对象,并不是在原对象上操作

(2)String类的常用构造方法:    

下面给出一些案例:

public class Test_Basic {public static void main(String[] args) {// public String() : 创建一个空白字符串对象,不含有任何内容String s1 = new String();System.out.println(s1);// public String(char[] chs) : 根据字符数组的内容,来创建字符串对象char[] chs = {'a','b','c'};String s2 = new String(chs);System.out.println(s2);// public String(String original) : 根据传入的字符串内容,来创建字符串对象String s3 = new String("123");System.out.println(s3);String s4 = "hello";System.out.println(s4);}
}

接下来是内存结构的展示:

(3)常量池:

         创建字符串对象,和其他普通对象一样,会占用计算机的资源(时间和空间),作为最常用的数据类型,大量频繁的创建字符串对象,会极大程度地影响程序的性能。

        JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化

String常量池:

        在Java中,String常量池是一块特殊的内存区域,用于存储字符串常量。String常量池的设计目的是为了节省内存和提高性能。

        当我们创建字符串常量时,如果字符串常量池中已经存在相同内容的字符串,那么新创建的字符串常量会直接引用已存在的字符串对象,而不会创建新的对象。这样可以避免重复创建相同内容的字符串,节省内存空间。

        在JDK8及之后的版本中,字符串常量池的位置与其他对象的存储位置,都位于堆内存中。这样做的好处是,字符串常量池的大小可以根据需要进行调整,并且可以享受到垃圾回收器对堆内存的优化。

        Java将字符串放入String常量池的方式:

1. 直接赋值:通过直接赋值方式创建的字符串常量会被放入常量池中。

        例如: String str = "Hello";

2. 调用String类提供intern()方法:可以将字符串对象放入常量池中,并返回常量池中的引用。

        例如: String str = new String("World").intern();

        注意:通过new关键字创建的字符串对象不会放 入常量池中,而是在堆内存中创建一个新的对象。只有通过直接赋值或调用intern()方法才能将字符串放入常量池中。

案例:

public class Test062_String {public static void main(String[] args) {String s1 = "Hello"; // 字符串常量,放入常量池String s2 = "Hello"; // 直接引用常量池中的字符串对象System.out.println(s1 == s2); // true,引用相同// 直接new String对象,不会将'World'放入常量池String s3 = new String("World");// 调用intern()方法,将'World'放入常量池,并返回常量池中的引用String s4 = new java.lang.String("World").intern();String s5 = "World";System.out.println(s3 == s4); // false,引用不同System.out.println(s4 == s5); // true,引用相同}
}
public class Test062_String2 {public static void main(String[] args) {String s1 = "a";String s2 = "b";// 常量优化机制:"a" 和 "b"都是字面值常量,借助 + 连接,其结果 "ab" 也被当作常量String s3 = "a" + "b";String s4 = "ab";System.out.println(s3.equals(s4)); // trueSystem.out.println(s3 == s4); // trueSystem.out.println("-------------");String s5 = s1 + s2;System.out.println(s4.equals(s5)); // trueSystem.out.println(s4 == s5); // falseSystem.out.println("-------------");String s6 = (s1 + s2).intern();System.out.println(s4.equals(s6)); // trueSystem.out.println(s4 == s6); // true}
}
使用 + 拼接多个字符串常量,拼接的结果仍旧是字符串常量 ,变量不可以
如果结果字符串常量在常量池中不存在,则Java会将其放入到字符串常量池中
(4)常用方法:

1. public int length()

  • 用法:获取字符串的长度(字符个数)

  • 返回值int类型,即字符串中字符的数量

  • 调用者String对象本身(如"abc".length()

  • 是否改变原对象:不改变。仅查询长度,不修改字符串内容

  • 示例:

    String s = "hello";
    int len = s.length(); // len = 5('h','e','l','l','o'共5个字符)
    

2. public boolean equals(Object anObject)

  • 用法:比较当前字符串与参数对象的内容是否完全相同(严格区分大小写)

  • 返回值boolean类型。true表示内容完全相同,false表示不同

  • 调用者String对象本身(如s1.equals(s2)

  • 是否改变原对象:不改变。仅做比较操作,不修改任何字符串

  • 注意

    • 需与==区分:equals()比较内容,==比较对象地址

    • 若参数为null,返回false

  • 示例

    String s1 = "abc";
    String s2 = "ABC";
    boolean b1 = s1.equals("abc"); // true(内容相同)
    boolean b2 = s1.equals(s2);    // false(大小写不同)
    

3. public char charAt(int index)

  • 用法:获取字符串中指定索引位置的字符(索引从 0 开始)

  • 返回值char类型,即索引位置对应的字符

  • 调用者String对象本身(如s.charAt(2)

  • 是否改变原对象:不改变。仅查询指定位置的字符

  • 注意:若索引超出范围(index < 0index >= length()),会抛出StringIndexOutOfBoundsException

  • 示例

    String s = "hello";
    char c = s.charAt(1); // c = 'e'(索引1对应的字符)
    

4. public char[] toCharArray()

  • 用法:将字符串转换为字符数组(每个元素对应字符串中的一个字符)

  • 返回值char[]类型,即包含字符串所有字符的数组

  • 调用者String对象本身(如s.toCharArray()

  • 是否改变原对象:不改变。仅生成新的字符数组,原字符串不变

  • 示例

    String s = "abc";
    char[] arr = s.toCharArray(); // arr = {'a','b','c'}
    

5. public String[] split(String regex)

  • 用法:根据传入的正则表达式regex切割字符串,返回切割后的子字符串数组

  • 返回值String[]类型,即切割后的子字符串集合

  • 调用者String对象本身(如s.split(",")

  • 是否改变原对象:不改变。仅根据规则切割并生成新数组,原字符串不变

  • 注意

    • regex是正则表达式(如"\\."表示按点切割,需转义)

    • 若切割后无内容,可能返回空数组或包含空字符串

  • 示例

    String s = "a,b,c";
    String[] parts = s.split(","); // parts = {"a","b","c"}
    

6. public String substring(int begin, int end)

  • 用法:截取字符串中从begin索引(包含)到end索引(不包含)的子字符串,即范围[begin, end)

  • 返回值String类型,即截取得到的新字符串

  • 调用者String对象本身(如s.substring(1,3)

  • 是否改变原对象:不改变。生成新的子字符串,原字符串不变

  • 注意:若beginend超出范围,会抛出StringIndexOutOfBoundsException

  • 示例

    String s = "hello";
    String sub = s.substring(1,4); // sub = "ell"(索引1到3的字符:'e','l','l')
    

7. public String substring(int begin)

  • 用法:从begin索引(包含)开始截取字符串,直到字符串末尾,即范围[begin, length())

  • 返回值String类型,即截取得到的新字符串

  • 调用者String对象本身(如s.substring(2)

  • 是否改变原对象:不改变。生成新的子字符串,原字符串不变

  • 示例

    String s = "hello";
    String sub = s.substring(2); // sub = "llo"(从索引2到末尾的字符)
    

8. public String replace(CharSequence target, CharSequence replacement)

  • 用法:将字符串中所有与target匹配的子序列,替换为replacement

  • 返回值String类型,即替换后的新字符串

  • 调用者String对象本身(如s.replace("a","b")

  • 是否改变原对象:不改变。生成替换后的新字符串,原字符串不变

  • 注意:替换所有匹配项(非首次匹配)

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

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

相关文章

超越相似名称:Elasticsearch semantic text 如何在简洁、高效、集成方面超越 OpenSearch semantic 字段

作者&#xff1a;来自 Elastic Mike Pellegrini, Nick Chow 及 Libby Lin 比较 Elasticsearch 语义文本和 OpenSearch 语义字段在简洁性、可配置性和效率方面的表现。 自己动手体验向量搜索&#xff0c;使用这个自定进度的 Search AI 实操学习。你现在可以开始免费的云试用&am…

OpenAI发布最新大模型GPT5、本地部署GPT开源模型

OpenAI发布最新大模型GPT5、本地部署GPT开源模型 GPT-5概述 北京时间 2025年8月8日 凌晨1点 OPENAI举行了1个小时的线上发布会&#xff0c;正式推出了其史上最聪明、最强大的大模型GPT-5。 GPT-5是OpenAI发布的最新一代大型语言模型&#xff0c;它基于Transformer架构&#xff…

容器网络模式选择在云服务器多节点部署中的连通性验证方案

容器网络模式选择在云服务器多节点部署中的连通性验证方案在云计算环境中&#xff0c;容器网络模式的选择直接影响着多节点部署的通信效率和安全性。本文将从Docker原生网络驱动对比入手&#xff0c;深入分析Overlay、Host、Bridge等主流网络模式在跨主机通信场景下的性能表现&…

电商双11美妆数据分析

1、数据初步了解2.数据清洗2.1 重复值处理 直接删除重复值。2.2 缺失值处理通过上面观察数据发现sale_count,comment_count 存在缺失值,先观察存在缺失值的行的基本情况存在的缺失值很可能意味着售出的数量为0或者评论的数量为0&#xff0c;所以我们用0来填补缺失值。2.3 数据挖…

Pytest项目_day14(参数化、数据驱动)

parametrize 参数化可以组装测试数据。在测试前定义好测试数据&#xff0c;并在测试用例中使用 单参数单次循环 我们可以在装饰器中使用mark.parametrize&#xff0c;来定义参数名和参数值列表 参数名还需要传给函数参数名需要用字符串来定义&#xff0c;参数值列表需要用可迭代…

Nest.js、Knex.js、Nuxt.js、Next.js 和 Spring Boot的异同相关概念

总述Nest.js、Knex.js、Nuxt.js、Next.js 和 Spring Boot 是分属不同技术领域的工具&#xff0c;涵盖前端框架、后端框架、数据库工具等角色&#xff0c;它们在开发中既有功能交集&#xff0c;也有明确的定位差异。一、相同点服务端参与能力五者均能在服务端发挥作用&#xff1…

第2节 大模型分布式推理架构设计原则

大模型推理系统的设计过程,本质上是在多重约束下寻找最优解的过程。硬件资源的物理限制、场景对性能的刚性要求、系统的可扩展性需求,共同构成了设计的边界条件。明确这些约束的具体表现形式,理解性能指标之间的权衡逻辑,确立架构设计的核心原则,是构建高效分布式推理系统…

快速部署一个鉴黄服务

1.安装依赖pip install opennsfw22.代码实现import opennsfw2 as n2# 将自动下载预训练模型 open_nsfw_weights.h5 到 C:\Users\Administrator\.opennsfw2\weights # pip install opennsfw2# 单张预测 image_path 1.jpg nsfw_probability n2.predict_image(image_path) print…

Camera open failed

前言 由前面的几篇博客可以知道&#xff0c;openCamera&#xff0c;createCaptureSession&#xff0c;setRepeatingRequest&#xff0c;capture是非常重要的过程&#xff0c;如果其中一个环节出了问题时该如何分析呢&#xff0c;这里我们首先从打开相机流程时&#xff0c;打开…

医美产业科技成果展陈中心:连接微观肌肤世界与前沿科技的桥梁

作为一名深耕展陈设计施工的从业者&#xff0c;当接到医美产业科技成果展陈中心的项目时&#xff0c;我深知这不是简单的 “技术堆砌”&#xff0c;而是要在 “科学严谨性” 与 “美学体验感” 之间找到平衡 —— 让参观者既能看懂激光设备的波长原理&#xff0c;又能感知胶原蛋…

在 Android 系统中清理应用数据但保留应用程序本身,可以通过以下几种方法实现

在 Android 系统中清理应用数据但保留应用程序本身&#xff0c;可以通过以下几种方法实现在 Android 系统中清理应用数据但保留应用程序本身&#xff0c;可以通过以下几种方法实现&#xff1a;方法 1: 使用 Android 设置&#xff08;无需 root&#xff09;方法 2: 使用 ADB 命令…

Linux中tty与8250-uart的虐恋(包括双中断发送接收机制)

串口通用驱动文件在哪里&#xff1f; drivers/tty/serial/哪一个是正确的compatible&#xff1f; arch/arm64/boot/dts/rockchip/rk3568.dtsi uart3: serialfe670000 {compatible "rockchip,rk3568-uart", "snps,dw-apb-uart";reg <0x0 0xfe670000 0…

GitHub 仓库代码上传指南

文章目录 🛠️ 一、环境准备 🧱 二、创建 GitHub 仓库 ⚙️ 三、本地代码上传流程 首次上传 更新已有代码 🔐 四、认证问题解决(必看!) 方案 1:个人访问令牌(PAT) 方案 2:SSH 密钥(推荐长期使用) ⚡ 五、常见错误处理 🏆 六、最佳实践建议 💎 高级技巧 🛠…

介绍一下 自动驾驶 感知多任务训练模型设计

自动驾驶感知多任务训练模型是指在一个统一的模型架构中&#xff0c;同时完成自动驾驶场景下的多个感知任务&#xff08;如目标检测、语义分割、深度估计、车道线检测等&#xff09;的模型设计。其核心目标是通过特征共享和任务协同&#xff0c;在提升单任务性能的同时&#xf…

huggingface文件下载过慢/中断怎么办

huggingface上汇集了各个大模型和预训练模型的权重文件&#xff0c;但是访问huggingface需要连接外网&#xff0c;即时连接外网之后下载仍然过慢甚至会出现中断&#xff0c;因此本文将使用两种方法教你解决上述问题。 文章目录1.使用国内镜像下载2.使用Python脚本自动化下载1.使…

Spring Boot + Redis Sentinel (一主两从)测试案例

&#x1f680; Spring Boot Redis Sentinel 完整测试案例 &#x1f3f7;️ 标签&#xff1a;Redis 、Redis Sentinel、Spring Boot 实战 &#x1f4da; 目录导航 &#x1f4dd; 前言&#x1f3d7;️ Redis Sentinel 架构说明&#x1f4e6; Docker Compose 搭建 Redis 哨兵环境…

力扣-295.数据流的中位数

题目链接 295.数据流的中位数 class MedianFinder {PriorityQueue<Integer> left;//队头最大PriorityQueue<Integer> right;//队头最小public MedianFinder() {left new PriorityQueue<>(new Comparator<Integer>() {Overridepublic int compare(In…

【数据分享】2014-2023年长江流域 (0.05度)5.5km分辨率的每小时日光诱导叶绿素荧光SIF数据

而今天要说明数据就是2014-2023年长江流域 &#xff08;0.05度&#xff09;5.5km分辨率的每小时日光诱导叶绿素荧光SIF数据。数据介绍一、数据集概况&#xff1a;长江流域植被动态的 “每小时快照”本文分享的核心数据集为2014 年 9 月至 2023 年 9 月长江流域日光诱导叶绿素荧…

计算机二级 Web —— HTML 全面精讲(含真题实战)

例题来源: web.code2ji.cn 0. HTML 基础与全局常识 0.1 HTML 是什么 HTML&#xff08;HyperText Markup Language&#xff09;是网页结构语言&#xff0c;用“标签”描述内容、层次与含义。 0.2 基本文档骨架&#xff08;必须熟练&#xff09; <!DOCTYPE html> <…

Linux中的日志管理

注&#xff1a;在 centos7/Rocky9 中&#xff0c;系统日志消息由两个服务负责处理&#xff1a;systemd-journald 和 rsyslog一、常见日志文件的作用实验一&#xff1a;测试查看暴力破解系统密码的IP地址步骤一&#xff1a;故意输错密码3次&#xff0c;在日志文件中查看步骤二&a…