Java字符串String详解

Java中的String类作为存储和操作文本数据的基本类型,是开发过程中最常用的类型。

String类型的声明及初始化与基本数据类型非常相似:

String name = "lcy";

但是String类型是引用类型,有着非常丰富的处理字符串的方法。正是因为其重要性,Sun公司针对String类型做了很多优化,使得String类型使用起来非常灵活、高效、简单。

作为Java程序员,不仅要掌握String类型的用法,还应该深入原理,领略其设计之妙和设计之美。

一,String介绍

1,初识String

官网API文档

在这里插入图片描述

  • String类位于java.lang包下,使用这个包下的类时,无需用import显式导入

  • String类被定义为final类型,不能被继承,其方法不能被重写
    Java中的String类型实现了几个关键接口,这些接口赋予了String特定的功能和行为,具体包括:

  • 实现了Serializable接口,表明String对象是可以被序列化的,即它可以被转换成一系列字节,保存到磁盘上或通过网络进行传输,之后还能恢复成原来的状态

  • 实现了CharSequence接口,这使得String对象具备处理组成字符串的单个字符的能力

  • 实现了Comparable接口,String对象可以直接与其他String对象进行自然排序(基于字典顺序)。这使得字符串可以直接用于排序算法中,或者存储在需要排序的集合(如TreeSetTreeMap)里,而无需额外提供比较器

这些接口的实现使得String不仅能够作为基本的文本载体,还能够在更广泛的上下文中发挥功能,比如参与序列化操作、在泛型算法中作为字符序列被操作,以及在需要比较和排序的场合自动排序,体现了其设计的通用性和实用性。

2,不可变的字符串对象

API文档上明确说明String objects are immutable ,即字符串对象是不可变的,应该如何理解不可变呢?

创建字符串对象后,字符串的值不能被修改String不提供任何方法修改字符串的值。如下图,字符串对象创建后,堆内存中存储了字符串lcy,那么除非整个对象被垃圾回收,否则无法通过StringAPI修改内存中的值,值始终都是lcy

在这里插入图片描述

有的同学会举分离,下面的代码可以改变字符串的值,你怎么解释呢?

name = name + " hello";
System.out.println(name);// 输出 lcy hello

上面代码表面上改变了name的值,实际上 name + " hello" 这行代码会创建一个新对象,name变量指向新对象002,原来的对象001是没有被修改的:

在这里插入图片描述

二,String方法

1,构造字符串对象

String类提供的构造方法比较多,常见的有以下几种:

1.1 字面量

通过字面量创建一个字符串对象:

 String str =Hello Java;
1.2 空构造函数
String str = new String();

该字符串对象的值为空字符串"".

1.3 通过字符数组构造
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String str = new String(chars);
1.4 通过字符数组的一部分构造
char[] chars = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
String str = new String(chars, 0, 5); // 取前5个字符
1.5 通过字节数组构造
byte[] bytes = {72, 101, 108, 108, 111}; // ASCII编码的"Hello"
String str = new String(bytes);

2,遍历

for(char c : str.toCharArray()) {System.out.println(c);
}

3,截取

String subStr = str.substring(0, 5); // 获取前五个字符

4,替换

String replaced = str.replace("World", "Java"); // 将"World"替换为"Java"

5,查找

int index = str.indexOf("World"); // 返回"World"首次出现的位置

6,比较

boolean isEqual = str.equals("Hello, World!"); // 比较内容是否相等

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

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

相关文章

连锁美容机构行业:如何利用用友BIP收入云实现收入增长

随着消费市场的不断升级和消费者需求的日益多样化,连锁美容机构行业正面临着前所未有的机遇与挑战。在这个竞争激烈的市场环境中,如何有效地利用技术手段提升管理效率、优化客户体验,进而实现收入的持续增长,成为了众多美容机构关…

Javaweb第九次作业

采用XML映射文件的形式来映射sql语句;采用动态sql语句的方式,实现条件查询的分页。 controller Slf4j RestController RequestMapping("supermarket111") public class SupermarketFenyeController {AutowiredSupermarketFenyeService super…

Rust之函数式语言特性:迭代器和闭包(一):概述

开发环境 Windows 11Rust 1.78.0 VS Code 1.89.1 项目工程 这次创建了新的工程minigrep. 函数式语言特性:迭代器和闭包 Rust的设计从许多现有语言和技术中获得了灵感,其中一个重要影响是函数式编程。函数式编程通常包括通过在参数中传递函数、从其他函数返回函数、…

【免费Web系列】JavaWeb实战项目案例五

这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 新增员工 前面我们已经实现了员工信息的条件分页查询。 那今天我们要实现的是新增员工的功能实现,页面原型如下: ​ 首先我们先完成"新增员工"的功能开发&#xff0…

[Redis]Hash类型

基本命令 hset命令 设置 hash 中指定的字段(field)的值(value) 返回值:添加的字段的个数(注意是添加的个数,而不包括修改的) hset key field value [field value ...] hget命令 …

InnoDB Data Locking - Part 2 “Locks“

什么是数据库“锁”? 当我熟悉数据库术语时,我发现非常困惑的一件事是“锁【lock】”这个词在数据库中的含义与在编程中的含义不同。 在编程中,如果你有一个“锁”,那么它就是内存中存储在某个地址下的单个对象,然后有…

springboot mqtt收发消息

​在Spring Boot中&#xff0c;可以使用MQTT协议来收发消息。以下是一个简单的示例&#xff1a; 1. 添加依赖 在pom.xml文件中添加以下依赖&#xff1a; xml <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-in…

【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 vim编辑器 Linux编译器&#xff1a;gcc/g使用 gcc和g的选项 编译过程 动静态库的链接 Linux项目的自动化构建 生成可执行程序 清理可执行程序 Linux调试器-gdb使用 git和git…

DBeaver添加DM8驱动(maven下载和jar包下载配置)

DBeaver 24.0.3添加DM8驱动 下载DBeaver下载DM达梦驱动下载 安装配置使用自带Dameng自行添加达梦驱动 因为最近公司项目有信创要求&#xff0c;所以下载了达梦数据库。使用自带的达梦管理工具不是很方便&#xff0c;于是换了DBeaver。 哼哧哼哧安装好后&#xff0c;创建数据库连…

CSS:font-family作用

font-family作用 介绍代码举例示例分析示例分析 常用方法1.使用字体族2.使用系统字体3.使用Web字体4.使用CSS变量5.使用font-face规则 通用字体族补充 介绍 在Web开发中&#xff0c;font-family 是CSS的一个属性&#xff0c;用于指定一个网页元素应该使用哪些字体样式。font-f…

#centos7搭建php8+nginx环境#

场景:为了实现上传的pdf文件转成png图片,需要搭建一个php8nginx的运行环境&#xff0c;最后安装imagic扩展 安装顺序 php-> linux-> imagemagick -> ghostscript -> imagick 一&#xff1a;安装phpnginx环境 1、安装remi扩展源 remi源是Remi repository是包含最新…

浅谈云原生安全

一、云原生安全的层级概念 "4C" Code-Container-Cluster-Cloud 二、云原生各个层级的安全实践有哪些&#xff1f; 1、针对于Cloud针对的是公有云层面&#xff0c;其实就一点 1、使用主账号子角色&#xff0c;赋予最小权限原则进行资源管理。 2、对于Cluster 1、从C…

【数据结构】二叉树-堆(下)-链式二叉树

个人主页~ 二叉树-堆&#xff08;上&#xff09; 栈和队列 二叉树 四、堆的代码实现Heap.hHeap.ctest.c 五、堆的应用堆排序思想进行排序 六、二叉树链式结构的实现BTree.hBTree.ctest.c 四、堆的代码实现 Heap.h #pragma once#include <stdio.h> #include <stdlib…

如何在C#代码中判断当前C#的版本和dotnet版本

代码如下&#xff1a; using System.Reflection; using System.Runtime.InteropServices;var csharpVersion typeof(string).Assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false).OfType<AssemblyFileVersionAttribute>().FirstOrDefault()?.…

09- Redis 中的 Stream 数据类型和应用场景

1. 介绍 Redis Stream 是 Redis 5.0 版本新增加的数据类型&#xff0c;Redis 专门为消息队列设计的数据类型。 在 Redis 5.0 Stream 没出来之前&#xff0c;消息队列的实现方式都有着各自的缺陷&#xff0c;例如&#xff1a; 发布订阅模式&#xff0c;不能持久化也就无法可靠…

Python魔法之旅-魔法方法(05)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

Linux系统使用Docker安装Drupal结合内网穿透实现远程访问管理后台

目录 前言 1. Docker安装Drupal 2. 本地局域网访问 3 . Linux 安装cpolar 4. 配置Drupal公网访问地址 5. 公网远程访问Drupal 6. 固定Drupal 公网地址 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Linux系统使用Docker安装Drupal…

golang开发 gorilla websocket的使用

很多APP都需要主动向用户推送消息&#xff0c;这就需要用到长连接的服务&#xff0c;即我们通常提到的websocket&#xff0c;同样也是使用socket服务&#xff0c;通信协议是基本类似的&#xff0c;在go中用的最多的、也是最简单的socket服务就是gorilla/websocket&#xff0c;它…

Mybatis 查询TypeHandler使用,转译查询数据(逗号分隔转List)

创建自定义的Hanndler /*** Package: com.datalyg.common.core.handler* ClassName: CommaSeparatedStringTypeHandler* Author: dujiayu* Description: 用于mybatis 解析逗号拼接字符串* Date: 2024/5/29 10:03* Version: 1.0*/ public class CommaSeparatedStringTypeHandle…

SAP Build引言

前言 SAP Build 似乎是一个整合了很多低代码或无代码产品的平台&#xff0c;最早的时候应该都是各自分开的几个产品&#xff0c;近年合并到一块上了SAP Build平台 现在看官网的介绍应该是有三四个产品被集成进来了&#xff0c;分别是SAP IRPA&#xff0c;SAP Workflow&#xf…