String类详解

2023-11-18

目录

一、创建字符串的四种方式

1.直接赋值

2.通过构造方法创建对象

3.通过字符数组创建对象

4.通过String类的静态方法valueOf(任意数据类型)->转为字符串

二、字符串比较相等

.equals方法

.equalsIgnoreCase方法

判空处理

三、常量池问题

什么是常量池

常量池中的对象从何而来?

1.直接赋值产生

2.构造方法产生

手工入池:intern方法

例子:

1.

2.

3.

四、字符串的不可变性

 五、修改字符串的内容

1.通过反射破坏value数组的封装

2.使用StringBuilder类或者StringBuffer类

二者的区别

创建方法:

方法使用:

六、字符串的其他常见操作

1.字符串比较

 2.字符与字符串的相互转换

char->String

 String->char

 如何判断一个字符串是由纯数字组成的

3. 字符串和字节的相互转换

String->byte[]

 byte[] ->String

 4.字符串的查找操作

 5.字符串的替换操作

 6.字符串的拆分操作

以括号中的内容进行拆分,可指定拆分最大个数

 当用到特殊字符时,我们可以用\\进行转义处理

 7.字符串的截取操作

 8.字符串的其他常用方法

 写一个方法将字符串的首字母大写


String类算是比较特殊的类型了,作为初学者我们甚至把这个引用类型时不时当成基本类型来用,而且发现,竟然差不多。然而实际呢?我们太年轻,差的真的很多,今天就来详细讲一讲到底差在哪。

一、创建字符串的四种方式

1.直接赋值

直接赋值,在堆中的常量池中创建该字符串对象

String str1 = "HelloWorld";

2.通过构造方法创建对象

在堆中创建对象,并把该对象的拷贝放到常量池中

String str2 = new String("HelloWorld");

3.通过字符数组创建对象

首先创建字符数组,并且通过构造方法传入此数组来创建对象,此对象不入常量池

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

4.通过String类的静态方法valueOf(任意数据类型)->转为字符串

String str4 = String.valueOf(15);

二、字符串比较相等

字符串比较相等采用String内置的.equals方法

若非要是用等于号(==)则遵循此规律:若引用指向常量池中的对象,则相等;否则因为指向地址不同,均不相等。

.equals方法

正常比较两个字符串的方法

String str1 = new String("Hello");
String str2 = new String("hello");
//        System.out.println(str1==str2);
引用类型比较,用.equals方法
System.out.println(str1.equals(str2));

.equalsIgnoreCase方法

此方法可以忽略字符串的大小写

System.out.println(str1.equalsIgnoreCase(str2));

判空处理

当我们实际应用此方法时,要站在用户的角度考虑,用户什么牛鬼蛇神都会给你输进去,啥都不输也有可能,所以当我们涉及用户输入时,应该把准备好的字符串作为方法的调用者,避免空指针异常

//        //这个变量由用户从浏览器输入
//        String userName = null;
//        System.out.println(userName.equals("小王"));
//        //把给定的字符串放在前面,方便处理userName为空的问题
//        System.out.println("小王".equals(userName));

三、常量池问题

什么是常量池

眼尖的童鞋已经发现了,上面一直在提常量池,啥是个常量池,请看图。

 当我们创建一个字符串对象时,它可能会出现在常量池中或者堆中的空间。

常量池中的对象从何而来?

1.直接赋值产生

若此字面量为第一次产生,比如我想引入一个“name”字符串,那么我就直接 String name = “name”;name这个词在之前从未出现过,我就会把此字符串创建并且安放到常量池当中,但若是常量池已经存在过该字符串,那么就不会再创建新的字符串对象,而是直接引用常量池中旧的字符串对象。

2.构造方法产生

当我第一次通过构造方法产生字符串时,会在堆中和常量池中同时产生对象,也就是会产生两个对象,若不是第一次的话照旧在堆中产生新的对象。

手工入池:intern方法

调用intern方法可以将未入常量池的对象入池,并直接引用常量池中的对象。

若调用该方法发现此字符串已经存在于池中了,则返回常量池中的引用。

例子:

1.

该打印结果为true,因为全部为常量池中的同一地址引用

String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1==str2);

2.

该打印结果为false,因为str1.intern() 虽然返回了常量池中的地址,但是没有接收

String str1 = new String("Hello");
str1.intern();
str1 = str1.intern();
String str2 = "Hello";
System.out.println(str1==str2);

3.

 该结果为ture 因为此场景下的intern方法,由于因字符数组产生的字符串是不会入池的,所以会直接将str1的引用入池,并且str1的地址就是常量池的地址。

char[] data = new char[]{'a','b','c'};
String str1 = new String(data);
str1.intern();
String str2 = "abc";
System.out.println(str1==str2);

四、字符串的不可变性

我们通过查找String类型的源代码可以得知,String类型本身是由一个叫做value[ ]的字符数组,存在String类中,而且由final修饰并且封装,不可变,而且也没有相关的getter和setter方法。

 五、修改字符串的内容

1.通过反射破坏value数组的封装

这种方法不推荐,目前来说了解即可。

2.使用StringBuilder类或者StringBuffer类

这两种类已经不是String类了

二者的区别

两种类型所包含的方法并无区别,StringBuilder的性能好,适合单线程,而StringBuffer更为安全,适合多线程。

创建方法:

有两种将String转换为StringBuilder类的方式

1.通过构造方法传入字符串

2.通过.append方法传入字符串

        StringBuilder sb = new StringBuilder("hello");
        sb.append("123");

若想转变回String类,则采用toString方法

String str1 = sb.toString();
System.out.println(str1);

方法使用:

1.拼接方法

sb.append("123");

2.反转方法

sb.reverse();

3.插入方法

指在索引index的位置,插入的元素

sb.insert(0,10);

4.删除方法

区域为[start,end)

sb.insert(0,10);

六、字符串的其他常见操作

1.字符串比较

比较是否相同采用.equals方法

.equalsIgnoreCase不区分字符串大小写

String类也实现了comparable接口,可以使用compareTo方法,比较两个字符串的ASCII码值

 2.字符与字符串的相互转换

char->String

1.通过构造方法转换

2. 也可以转换部分字符数组内容

 String->char

1.charAT方法可取出对应位置的字符

 2.toCharArray可将字符串转换为字符数组

 如何判断一个字符串是由纯数字组成的

直接上图 ,不多解释

3. 字符串和字节的相互转换

String->byte[]

byte会将String当前的字符编码转换为字节,且可以设定转码格式

 

  可以设定gbk编码格式

 byte[] ->String

将字节数组转换为字符串,按照byte中存储的ASCII码值转换为字符串中的字符

 4.字符串的查找操作

 

 5.字符串的替换操作

 6.字符串的拆分操作

以括号中的内容进行拆分,可指定拆分最大个数

 当用到特殊字符时,我们可以用\\进行转义处理

 7.字符串的截取操作

如果不规定截取范围,会从指定位置截取到结尾。

或者指定截取范围,左闭右开 

 8.字符串的其他常用方法

 写一个方法将字符串的首字母大写

利用截取方法和转换大写方法相加即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

String类详解 的相关文章

  • 如何使用 Apache POI API 将图像添加到 pptx 中添加的图像占位符?

    我已经预定义了带有文本和图像占位符的 pptx 模板 我如何从模板访问和修改这些占位符 我可以使用 POI pptx API 直接将图像和文本添加到幻灯片中 但如何将其添加到模板的占位符中 请参阅链接以了解如何添加占位符来创建固定模板 ht
  • Eclipse 在源代码管理中保存操作

    我们希望找到一种在签入之前执行代码标准的 轻量级 方法 我们真的很喜欢使用 Eclipse 内置的想法保存操作 go to Preferences gt gt Java gt gt Editor gt gt Save Actions 其中有
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • OSGi:如果不取消服务会发生什么

    这是我获取 OSGi 服务的方式 ServiceReference reference bundleContext getServiceReference Foo class getName Foo foo Foo bundleContex
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • 比较两个文本文件的最快方法是什么,不将移动的行视为不同

    我有两个文件非常大 每个文件有 50000 行 我需要比较这两个文件并识别更改 然而 问题是如果一条线出现在不同的位置 它不应该显示为不同的 例如 考虑这个文件A txt xxxxx yyyyy zzzzz 文件B txt zzzzz xx
  • Hibernate.createBlob() 方法从 Hibernate 4.0.1 开始已弃用,并移至 Hibernate.getLobCreator(Session session).createBlob()

    Method Hibernate createBlob 已弃用自休眠4 0 1并搬到Hibernate getLobCreator Session session createBlob 任何解决方案我应该在方法内传递什么getLobCrea
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话

随机推荐

  • ggplot2作图之系统发育树

    library ape tree lt read tree text A B C D E F G H I J K L M N O P library ggtree ggtree tree branch length none ladderi
  • BQ40Z50 调试

    一 简介 BQ40Z50 R1的特点与功能 1 这是一颗单芯片解决方案 集成电池 充放电保护 均衡 电量测量三大主要功能 2 支持1 2 3 4节串联锂离子或锂聚合物电池组 二 使用 1 BQ40Z50 R1 评估版一块 2 调试器一个 3
  • 什么是COBOL? COBOL编程说明

    有些技术永不消亡 它们只是逐渐消失在木制品中 向普通软件开发人员询问有关COBOL 面向通用商业语言 的信息 他们会看着您 就像您提到复写纸 含铅汽油或78 RPM记录一样 与Go或Python甚至Pascal或C 之类的现代语言相比 CO
  • winform多文件上传接口服务器,winform向云服务器上传文件

    winform向云服务器上传文件 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ exe 在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器
  • C++ tuple元组的基本用法(总结)

    1 元组简介 tuple是一个固定大小的不同类型值的集合 是泛化的std pair 我们也可以把他当做一个通用的结构体来用 不需要创建结构体又获取结构体的特征 在某些情况下可以取代结构体使程序更简洁 直观 std tuple理论上可以有无数
  • 操作型bi研究报告(转)

    操作型bi是bi发展过程中的转折点 传统上认为 bi是从海量历史数据中利用成熟的分析工具发现业务中的模式和趋势 从战略上和战术上辅助决策的一种技术 但是操作型bi改变了这种观点 它将bi从后台搬出来并且嵌入到业务操作流程的细节中 驱动着日以
  • 影之刃3服务器维护,影之刃33月4日维护公告 内容公告预览

    影之刃3 将于3月4日10 00 12 00对全部服务器停服维护 维护期间将无法登录游戏 给您带来的不便敬请谅解 感谢您的理解和支持 本次维护预计持续2小时 维护时间可能延长或提前结束 具体时间请以开服时间为准 维护结束后 我们将为全服玩家
  • 域名能查到服务器信息么,域名查服务器信息

    域名查服务器信息 内容精选 换一换 用户可以通过查询域名注册信息 确认域名所属的DNS服务器信息 然后再根据域名所属的DNS服务器信息进行DNS验证的相关操作 当 Name Servers 显示如所图1示时 则表示域名所属的DNS服务器为华
  • RTX 3080 Linux和Windows 平台兼容性问题

    好不容易 在某电商平台抢到了一块3080显卡 高高兴兴的装机准备大搞游戏开始深度学习 却遇到了很多麻烦 当然经过多方探索 终于也是解决了linux和Windows双平台的兼容性问题 目前Pytorch和TensorFlow都能使用 首先是l
  • Windows系统下如何运行.sh脚本文件

    前言 sh文件是一种命令脚本文件 在Windows系统下可以通过命令行工具打开运行 通常可以使用Git工具来打开运行 sh脚本文件 不过很多第一次使用Git的人 可能对Git工具不熟悉 sh文件在命令行运行时是有固定写法的 下面介绍详细步骤
  • 【Linux】---进程控制(创建、终止、等待、替换)

    文章目录 进程创建 fork 进程退出 进程退出场景 进程退出方法 退出码 exit exit 进程等待 进程等待的方法 wait waitpid 阻塞和非阻塞 进程替换 替换的原理 替换所用到的函数 execl execlp execle
  • shell 字符串处理汇总(查找,替换等等)

    字符串 简称 串 有限字符的序列 数据元素为字符的线性表 是一种数据的逻辑结构 在计算机中可有不同的存储结构 在串上可进行求子串 插入字符 删除字符 置换字符等运算 字符 计算机程序设计及操作时使用的符号 包括字母 数字 空格符 提示符及各
  • 【Java基础知识 3】为何要配置环境变量?

    Java基础教程系列 Java基础教程系列 Java学习路线配套文章 搬砖工逆袭Java架构师 Java经典面试题大全 10万字208道Java经典面试题总结 附答案 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗
  • 模拟电路设计(33)---电源变换器简介

    概述 电子设备都需要供电 其电能来源于火力 水力 核子发电厂提供的交流电 这些交流电通过电源设备变换为直流电 但是 这种直流电源不符合需要 仍需变换 这称为DC DC变换 常规的变换器是串联线性稳压电源 其调整元件工作于线性放大区 通过的电
  • 学习Kali渗透测试笔记

    Kali渗透测试 一 什么是渗透测试 1 软件测试 2 安全测试与渗透测试 3 渗透测试 二 渗透测试的目标 1 网络硬件设备 2 主机操作系统 3 应用系统 4 数据库系统 三 渗透测试的意义 四 渗透测试的方法分类 1 按照信息掌握程度
  • LiteOrm "cannot be instantiated"

    错误提示 java lang Class
  • 【深度强化学习】(5) DDPG 模型解析,附Pytorch完整代码

    大家好 今天和各位分享一下深度确定性策略梯度算法 Deterministic Policy Gradient DDPG 并基于 OpenAI 的 gym 环境完成一个小游戏 完整代码在我的 GitHub 中获得 https github c
  • 网络管理服务器篇之Apache

    一 软件简介 1 Apache是最流行的Web服务器端软件之一 快速 可靠 可通过简单的API扩展 Perl Python解释器可被编译到服务器中 完全免费 完全源代码开放 如果你需要创建一个每天有数百万人访问的Web服务器 Apache可
  • 【文件上传绕过】五、文件后缀大小写绕过

    文章目录 一 黑名单 二 源码 三 大小写绕过 一 黑名单 本pass禁止上传 php php5 php4 php3 php2 php1 html htm phtml pHp pHp5 pHp4 pHp3 pHp2 pHp1 Html Ht
  • String类详解

    目录 一 创建字符串的四种方式 1 直接赋值 2 通过构造方法创建对象 3 通过字符数组创建对象 4 通过String类的静态方法valueOf 任意数据类型 gt 转为字符串 二 字符串比较相等 equals方法 equalsIgnore