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类详解 的相关文章

  • TaskSchedulerImpl:初始作业尚未接受任何资源;

    这就是我正在尝试做的事情 我创建了DataStax企业集群的两个节点 在其上创建了一个java程序来获取一张表 Cassandra数据库表 的计数 该程序是在 eclipse 中构建的 实际上是来自 windows 盒子 从 Windows
  • Android Canvas.DrawBitmap 没有模糊/抗锯齿?

    我正在尝试使用精灵 或非常像素化的角色 背景等 制作一个Android游戏 我把它们画在画布上 就像这样 matrix preScale xrat yrat canvas drawBitmap img matrix null 其中 img
  • 使用 System.loadLibrary() 时出现不满意的链接错误?

    由于某种原因 我在我的 java 应用程序中遇到了令人讨厌的不满意链接错误 这是所涉犯罪者 System loadLibrary psjw 尽管库 psjw dll 显然与此类位于同一源包中 请帮忙 确保 psjw dll 位于您的 PAT
  • 使用Optional验证输入

    我有一个 CreateOrder 实例 其中包含一些 String Integer 和 Double 状态 当我在 JUnit 测试中为 CreateOrder 创建一个对象并将其发送出去时 我可以使用可选 API 验证 String 属性
  • System.out 什么时候不会出现在 Java 控制台中?

    我明白任何要标准化的东西 System out 将出现在 Java 控制台窗口中 启用时 我在某个地方发现 在某些情况下可能无法尝试这样做 例如 在 Swing 应用程序中 是这样吗 基本上 什么情况或设置我不希望在控制台中看到标准输出 例
  • Java并发中的AbstractQueuedSynchronizer

    What is AbstractQueuedSynchronizer在Java中concurrent locks包用来做什么 有人可以阐明它的方法吗doAcquireInterruptibly and parkAndCheckInterru
  • 查找“”之间的字符串的正则表达式是什么

    我有一个字符串如下 http 172 1 10 1 3 http 192 168 15 2 6 http 192 168 1 100 1 2 8 内的字符串是一个标签 内的字符串是前面标签的值 返回我的正则表达式是什么 标签 http 17
  • Xstream:删除类属性

    我该如何删除类 某事 Xstream 中的属性 我使用带注释的 Xstream 我读了它的代码 发现你的类不是mapper defaultImplementationOf fieldType 它会为你添加默认的类属性 除非类属性名称为nul
  • 如何在活动之间传递大型集合(主从流)

    背景 我正在实现一个从网络服务读取有关电影信息的应用程序 该网络服务返回有关每部电影的一些信息 标题 日期 海报网址 导演 演员等 该 Web 服务支持分页 因此电影以 100 部为一组加载 执行 这个想法是显示一个包含所有海报的网格 当用
  • Spring方法获取给定类型的所有bean

    我试图从一个相同类型的豆子中获取所有豆子FileSystemXmlApplicationContext 我正在使用factory getBeansOfType SomeType class 但我注意到它只返回顶级 bean 是否有任何其他方
  • Struts 2 - 使用 CKEditor 拦截上传的图像文件

    我有一个CKEditor在网站的不同页面上 所以我将上传内容设置为true以及让它工作的所有配置内容 并且图像上传工作得很好 Send it to the Server 标签 但从这里我想拦截或互动upload函数能够将图像上传到文件夹中
  • Java 接口合成方法生成,同时缩小返回类型

    我有 2 个接口和 2 个返回类型 interface interfaceA Publisher
  • 为什么这个 SimpleDateFormat 无法解析这个日期字符串?

    简单日期格式 SimpleDateFormat pdf new SimpleDateFormat MM dd yyyy hh mm ss SSSaa 抛出的异常pdf parse Mar 30 2010 5 27 40 140PM java
  • Servlet上下文和Spring应用程序上下文的本质区别

    我正在阅读 spring 框架文档 现在我在应用范围概念 http docs spring io spring docs current spring framework reference htmlsingle beans factory
  • JPA 的 commit() 方法是否使实体分离?

    我现在一直在搜索JPA实体生命周期 但现在 关于实体生命周期存在一些缺失的点 我在 stackoverflow 的一篇帖子中找到了下图 请记住该图已被投票 根据此图 当我们持久化实体时 它就变成了托管实体 好的 没问题 当我们提交时 数据会
  • Big O 用于有限、固定大小的可能值集

    这个问题 https stackoverflow com questions 12305028 java what is the best way to find first duplicate character in a string引
  • java:如何仅选择jtable中的一个单元格而不是整行

    在 jTable 中 我希望当用户单击单元格时 这句话会打印在屏幕上 I am cell in row X and column Y 其中 x 和 Y 是单击单元格的行和列 但我得到的是 例如 当我单击第 1 行和第 4 列中的单元格时 我
  • 如何在Windows上启动JBoss AS 7.1.1?

    我是新来的JBOSS 我下载了jboss as 7 1 1 Final zip并解压缩该 zip 文件 然后我转到 bin 文件夹并双击standalone bat 但新的 cmd 窗口在 2 3 秒内打开和关闭 我尝试通过cmd启动服务器
  • onActivityresult 数据为空

    这是我的相机应用程序 我想在其中捕获图像并裁剪它 但它拍照保存在我的 myimage 目录中 但不执行裁剪功能 请我需要帮助 我是这个领域的新人 这是我的相机开源代码 Intent intent new Intent MediaStore
  • Android 并获取 id 转换为字符串的视图

    在 Android 项目的 Java 代码中 如果您想要视图资源的引用 您可以执行以下操作 View addButton findViewById R id button 0 在上面的 R id button 0 不是一个字符串 是否可以通

随机推荐

  • 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