Java 中String对象详解
Java语言中的String对象是一个非常常见的数据类型,大多数情况下我们都是在使用String对象来表示字符串类型的数据。Java中的String类是一个final class,它是不可被继承的。本文将对Java中的String对象进行详细全面的描述,包括以下几个方面:
一、String类的概述
在 Java 中,字符串是一种常见的数据类型,经常用于存储一些文本信息。而String类则是Java提供的专门用于字符串操作的类,在Java标准库中,它位于java.lang包中。
String类是不可被继承的final类,即它不能被其他类所继承,也就是说它不能被修改。String类是通过使用Unicode字符集来表示字符串的,这使得Java支持多语言字符集。由于String类的不可变性(immutable),所以它可以作为安全的参数发送给诸如网络连接或数据库链接之类的方法,而不必担心其被篡改。String对象可以用来存储任何字符串类型的数据,包括HTML、XML等格式的字符串。
二、String类的构造函数
在 Java 中,String类提供了多种构造函数,可以用于创建字符串对象。下面是String类的一些常用构造函数:
- String(char[] value):根据字符数组value来创建String对象。
- String(char[] value, int offset, int count):根据字符数组value的指定部分(offset开始的count个字符)来创建String对象。
- String(byte[] bytes):根据字节数组bytes来创建String对象,使用平台默认的字符集。
- String(byte[] bytes, Charset charset):根据字节数组bytes来创建String对象,使用指定的字符集charset。
- String(String original):根据原始字符串original来创建String对象。
例如:
String str1 = new String("Hello World!");
char[] charArray = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
String str2 = new String(charArray);
三、String类的常用方法
在Java中,String类还提供了很多常用的方法,下面我们来介绍一些常用的方法:
3.1、字符串拼接
- String concat(String str):连接指定的字符串参数到此字符串的末尾。
例如:
String s1 = "Hello";
String s2 = "World";
String s3 = s1.concat(s2); // s3 = "HelloWorld"
3.2、字符串截取
- char charAt(int index):返回指定索引处的 char 值。
- int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
- int indexOf(int ch, int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
- int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引。
- int lastIndexOf(int ch):返回指定字符在此字符串中最后一次出现处的索引。
- int lastIndexOf(int ch, int fromIndex):返回指定字符在此字符串中从指定位置前最后一次出现处的索引。
- int lastIndexOf(String str):返回指定子字符串在此字符串中最后一次出现处的索引。
- String substring(int beginIndex):返回一个新的字符串,它是此字符串的一个子字符串。
- String substring(int beginIndex, int endIndex):返回一个新的字符串,它是此字符串的一个子字符串。
例如:
String str = "Java is the best programming language!";
System.out.println(str.charAt(5)); // out: 'i'
System.out.println(str.indexOf("the")); // out: 8
System.out.println(str.substring(0, 4)); // out: "Java"
3.3、字符串替换
- String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
- String replace(CharSequence target, CharSequence replacement):使用指定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
例如:
String str = "Java is the best programming language!";
System.out.println(str.replace('a', 'A')); // out: "JAvA is the best progrAmming lAnguAge!"
System.out.println(str.replace("the", "a")); // out: "Java is a best programming language!"
3.4、字符串分割
- String[] split(String regex):根据指定的正则表达式拆分此字符串。
- String[] split(String regex, int limit):根据指定的正则表达式拆分此字符串,最多拆分出limit个子字符串。
例如:
String str = "Java is the best programming language!";
String[] words1 = str.split(" ");
System.out.println(Arrays.toString(words1));
// out: ["Java", "is", "the", "best", "programming", "language!"]String[] words2 = str.split(" ", 3);
System.out.println(Arrays.toString(words2));
// out: ["Java", "is", "the best programming language!"]
3.5、大小写转换
- String toLowerCase():使用默认语言环境的规则将此 String 所有字符都转换为小写。
- String toUpperCase():使用默认语言环境的规则将此 String 所有字符都转换为大写。
例如:
String str = "Java is the best programming language!";
System.out.println(str.toUpperCase()); // out: "JAVA IS THE BEST PROGRAMMING LANGUAGE!"
3.6、字符串比较
- boolean equals(Object anObject):将此字符串与指定对象进行比较。如果两个对象相等,则返回 true;否则返回 false。
- boolean equalsIgnoreCase(String anotherString):将此 String 与另一个 String 进行比较,不考虑大小写。
- boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始。
- boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束。
- int compareTo(String anotherString):按字典顺序比较两个字符串。
例如:
String str1 = "Java is awesome!";
String str2 = "Java is great!";
System.out.println(str1.equals(str2)); // out: false
System.out.println(str1.startsWith("Java")); // out: true
System.out.println(str2.endsWith("great!")); // out: true
System.out.println(str1.compareTo(str2)); // out: -6
四、String类的不可变性原理及优缺点
String类在Java中是不可变的(immutable)的,这意味着一旦创建了一个String对象,它的值就不能被修改。String类的不可变性主要由以下两个方面造成:
4.1、String类的存储结构
在Java中,String对象实际上是一个包含字符数组的引用和一个表示字符串长度的整数。因此,在进行字符串操作时,String对象的引用和长度是不会变化的,只有字符数组才会被修改。而由于Java数组是一个固定长度的数据结构,因此String对象的不可变性就被保证了。
4.2、String类的操作方法
在Java中,String对象提供了很多用于字符串操作的方法(例如substring、concat等)。这些方法都是返回一个新的String对象,而不会在原有的String对象上进行修改,这也保证了String对象的不可变性。
String对象的不可变性带来了下面的优点:
- 线程安全:由于String对象的不可变性,多个线程可以对同一个String对象进行访问操作,而不必担心数据的安全问题。
- 安全性:由于String对象不可变,它不能被篡改,从而可以避免一些恶意攻击。
- 性能优化:由于String对象是不可变的,因此可以进行一些性能方面的优化。例如,String类实现了字符串池这个概念。
同时也存在以下缺点:
- 内存占用:由于每次使用String类进行字符串操作时,都会创建一个新的String对象,并且原有的String对象不会被修改,这样就会占用更多的内存空间。
- 创建大量垃圾对象:由于String对象的不可变性,每进行一次字符串操作就会创建一个新的String对象,如果进行大量的字符串操作,就会创建大量的垃圾对象,导致垃圾回收器的频繁运行。
- 字符串拼接效率低:由于每进行一次字符串拼接操作,就会创建一个新的String对象,效率较低。
五、String类的实现原理及性能问题
在 Java 中,String对象是通过char[]字符数组来存储字符串的。StringBuilder和StringBuffer也是通过char[]数组来存储字符串的,只不过它们在进行字符串操作时,会在原有的char[]数组上进行修改,而不是每次都创建一个新的char[]数组。
由于String对象的不可变性,每次对String对象进行字符串操作时都会创建一个新的String对象,这样会导致大量的内存开销和垃圾对象的产生,因此在进行大量的字符串操作时,应该尽量使用StringBuilder或StringBuffer来避免这些问题。
StringBuilder和StringBuffer都继承了AbstractStringBuilder类,它们之间的区别在于StringBuilder是线程不安全的,而StringBuffer是线程安全的。如果多个线程需要对同一个字符串进行操作时,应该使用StringBuffer来保证线程安全性。
在进行字符串操作时,如果需要创建一个新的String对象,可以使用静态方法String.valueOf()或者直接将字符数组传递给String类的构造函数来创建新的String对象,这样可以避免产生大量的垃圾对象。
六、字符串池的工作原理
Java中有一种称为字符串池(String Pool)的机制,它的主要作用是避免创建重复的String对象,从而节省内存空间。
当创建一个字符串时,JVM首先会在字符串池中查找该字符串是否已经存在。如果存在,则返回该字符串在字符串池中的引用;否则,在字符串池中创建该字符串,并返回该字符串在字符串池中的引用。
下面是一个示例代码:
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");System.out.println(str1 == str2); // true,因为str1和str2都指向字符串池中的同一个对象
System.out.println(str1 == str3); // false,因为str3指向堆内存中新创建的String对象
因此,如果需要创建多个相同的字符串对象,可以直接使用字符串池中已有的对象,这样可以节省内存空间。
七、String类与StringBuilder、StringBuffer的比较
在进行字符串操作时,Java中常用的有String、StringBuilder和StringBuffer三种类。
- String:String类是不可变的,每次进行字符串操作时都会创建一个新的String对象。因此,在需要大量字符串操作时,使用String类效率较低。
- StringBuilder:StringBuilder是可变的,它可以在原有的字符数组上进行修改,而不用每次都创建一个新的字符数组。因此,在需要大量字符串操作时,使用StringBuilder类可以提高效率。
- StringBuffer:StringBuffer也是可变的,并且是线程安全的,因此适用于多个线程对同一字符串进行操作的场景。
下面是一个比较字符串拼接效率的示例代码:
String s = "";
for (int i = 0; i < 10000; i++) {s += "a";
}
上述代码中使用了String来进行字符串拼接操作,每次都会创建一个新的String对象,因此效率较低。下面是使用StringBuilder进行字符串拼接的代码示例:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {sb.append("a");
}
String s = sb.toString();
由于StringBuilder是可变的,因此在进行字符串操作时效率较高。
总之,在进行大量的字符串操作时,应该尽量使用StringBuilder或StringBuffer,避免使用String类导致效率低下。
相关文章:
Java 中String对象详解
Java语言中的String对象是一个非常常见的数据类型,大多数情况下我们都是在使用String对象来表示字符串类型的数据。Java中的String类是一个final class,它是不可被继承的。本文将对Java中的String对象进行详细全面的描述,包括以下几个方面&am…...
k8s nfs运行问题、etcd问题、calico网络问题
服务器重启后nfs运行问题导致服务不能正常重启 解决办法 在每个节点下使用如下命令进行查看nfs是否正常启动 systemctl status nfs 如果没有启动,则使用如下命令启动,保证三个节点下的nfs都正常启动 systemctl start nfs 再次查看nfs是否正常启动 syst…...
Qt--QString字符串类、QTimer定时器类
目录 1. QString 字符串类 dialog.cpp 2. 容器类 2.1 顺序容器 QList 示例代码: student.h student.cpp dialog.h dialog.cpp 运行结果: 2.2 关联容器 QMap 示例代码: dialog.h dialog.cpp 运行结果: 3. Qt类型 3.1 跨平台数据类型…...
2023.5.13>>Eclipse+exe4j打包Java项目及获取exe所在文件的路径
Eclipseexe4j打包Java项目及获取exe所在文件的路径 1、打包exe文件1.1 打jar包1.2 打包exe2、在程序中获取exe所在路径3、遇到问题4、JDK version和class file version(Class编译版本号)对应关系5、参考文章 1、打包exe文件 1.1 打jar包 右单击项目选择“Export…” 1.2…...
Centos系统的使用基本教程
Centos是一款流行的Linux操作系统,它基于Red Hat Enterprise Linux系统,是一款稳定、可靠、安全的操作系统。本文将介绍Centos系统的基本使用方法,包括安装、命令行操作、软件安装和系统管理等方面的内容。 安装Centos系统 Centos系统可以从…...
IDEA生成ER图、UML类图、时序图、流程图等的插件推荐或独立工具推荐
以下是几个常用的IDEA插件和独立工具,可以用于生成ER图、UML类图、时序图、流程图等: Visual Paradigm (独立工具) Visual Paradigm是一个强大的建模工具,可以生成UML类图、时序图、流程图等。它支持多种语言和框架,包括Java、Spr…...
Python心经(3)
这一节总结点demo和常用知识点 目录 有关字符串格式化打印的 lambda匿名函数,,将匿名函数作为参数传入 文件读写 生成器 python的装饰器 简单的网站代码: 有关三元运算 推导式: 新浪面试题: 有关面向对象里…...
单工,半双工,全双工通讯
对于点对点之间的通信,按照消息传送的方向与时间关系,通信方式可分为单工通信、半双工通信及全双工通信三种。 单工通信 单工通信(Simplex Communication)是指消息只能单方向传输的工作方式。 在单工通信中,通信的信…...
【2023-05-09】 设计模式(单例,工厂)
2023-05-09 设计模式(单例,工厂) 单例模式 顾名思义,就是整个系统对外提供的实例有且只有一个 特点: 1、单例类只有一个实例 2、必须是自己创建唯一实例 3、必须给所以对象提供这个实例 分类ÿ…...
批量任务导致页面卡死解决方案
需求背景 需要基于高德地图展示海量点位(大概几万个),点位样式要自定义(创建DOM),虽然使用了聚合点,但初始化时仍需要将几万个点位的DOM结构都创建出来。 这里补充一句,高德地图在2.…...
避免“文献综抄”,5种写作结构助你完成文献综述→
很多作者可能有过这样的体验:读了很多文献,但在写综述的时候总感觉不像是在写文献综述,更像在写文献总结 如果引用方面不注意,甚至会成为文献综抄。 那么,你可以参考下我们整理的以下资料哦~ 01 文献总结和文献综述的…...
Java异常和反射
JAVA 异常分类及处理 概念 } final Entry<K,V> getEntryUsingComparator(Object key) { K k (K) key; // 获取该 TreeMap 的 comparator Comparator<? super K> cpr comparator; if (cpr ! null) { // 从根节点开始 Entry<K,V> p …...
Accesss数据库的那点事
Accesss数据库的那点事 1.Access的简介 Access(全称为Microsoft Access)是一个关系型数据库管理系统(RDBMS)。它是由微软公司开发的数据库软件,用于创建、管理和操作数据库应用程序。 Access提供了一个可视化的开发环…...
网络基础学习:osi网络七层模型
osi网络七层模型 什么是OSI,什么是ISO?为什么ISO要提出OSI网络七层模型?OSI七层的划分以及具体内容第七层 应用层第六层 表示层第五层 会话层第四层 传输层第三层 网络层第二层 数据链路层第一层 物理层 每一层与设备的对应关系 什么是OSI,什…...
EndNote X9 引用参考 单击文献编号,不能跳转到文尾文献列表处,咋解决?文献编号 不能跳转 ,怎么办?
文章目录 1 正常情况下 引用文献编号 是可以跳转的2 问题分析3 解决方法4 EndNote X9 插入参考文献常见问题总结5 EndNote X9 快速上手教程(毕业论文参考文献管理器) 1 正常情况下 引用文献编号 是可以跳转的 正确的插入文献后, 正常情况下&a…...
用免费蜜罐工具配置Modbus工控蜜罐
导语:本文将用DecoyMini免费蜜罐工具来配置自定义的ModbusTCP工控仿真模板,并介绍部署后的Modbus蜜罐的使用效果。 DecoyMini是一个免费的蜜罐工具,其特色是仿真能力采用与软件松耦合的仿真模板来进行管理。通过一键式导入云端仿真模板库里的…...
DataGridXL中快速搜索单元格和底部全屏模式区域隐藏
DataGridXL表格是在2020年发布,DataGridXL在设计时就考虑到了性能。提供最快、最简单、最可靠的数据网格。DataGridXL支持所有常用所有的浏览器,为 Web 应用程序提供类似于 Microsoft Excel 的体验,它支持前端框架有Vue、React、Angular等。 …...
DotNet几种微服务框架,你用过吗?
最近有群友问,.NET有哪些微服务框架?.NET的微服务框架还真不多,一般企业都会自己搭建微服务框架,或者基于其它框架搭建微服务(比如abp)。本文将介绍几种微服务框架,供大家学习参考。 一、Servi…...
Nature | 生成式人工智能如何构建更好的抗体
疫情高峰期,研究人员竞相开发一些首批有效的COVID-19治疗方法:从已经康复的人的血液中分离出来的抗体分子。 现在,科学家已经证明,生成式人工智能(AI)可以通过一些繁琐的过程提供捷径,提出增强抗…...
【hive】基于Qt5和libuv udp 的lan chat
作者已经不更新了,但是很棒 在线用户列表: 聊天窗口 主程序 单独的网络线程: network_thread data管理关联网络管理的 程序update升级更新 和消息收到 即可...
Android 11开发避坑:为什么你的App获取的Wifi MAC地址总是变?手把手教你配置固定MAC
Android 11开发实战:彻底解决Wifi MAC地址随机化问题最近在开发一个设备管理系统时,遇到了一个棘手的问题:我们的App在Android 11设备上获取的Wifi MAC地址每次都不一样,导致基于MAC地址的设备识别功能完全失效。经过一周的深入研…...
信息系统项目管理师核心知识点精讲
一、项目整合管理(重点:项目章程与项目管理计划) 知识点详解: 项目整体管理是项目管理知识体系的核心,它确保项目各要素协调统一。在考试中,特别要掌握项目章程和项目管理计划的区别与联系。 项目章程是项目的“出生证明”,由项目发起人发布。它正式授权项目,赋予项…...
从分立逻辑到单片机:基于ATmega8的MIDI通道分析仪设计与实现
1. 项目概述:从分立逻辑到单片机的MIDI通道分析仪进化史二十年前,当我在《Elektor》杂志上发表第一版MIDI通道分析仪时,整个数字音乐世界还处于一个相当“硬核”的阶段。那个版本的设计,用今天的话来说,简直就是一场“…...
别再盲跑了!手把手教你用Arduino Zero在IDE 2.0里设置断点单步调试
告别盲跑时代:Arduino Zero与IDE 2.0的源码级调试实战指南 当你的Arduino项目逻辑越来越复杂,仅靠串口打印调试就像在迷宫里摸黑前行——直到遇见Arduino Zero与IDE 2.0的调试组合。本文将揭示如何用这套工具实现 源码级精准调试 ,即使你手…...
如何从零构建智能FOC轮腿机器人:完整开源硬件系统终极指南
如何从零构建智能FOC轮腿机器人:完整开源硬件系统终极指南 【免费下载链接】foc-wheel-legged-robot Open source materials for a novel structured legged robot, including mechanical design, electronic design, algorithm simulation, and software developme…...
长期使用Taotoken聚合服务对项目月度账单的可预测性提升
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken聚合服务对项目月度账单的可预测性提升 在AI驱动的项目开发与运营中,成本控制与预算规划是团队管理者…...
巧用对称性与平均值原理:低成本实现高精度电阻分压器校准
1. 项目概述:用数学思维突破测量设备的精度极限在电子实验室里捣鼓精密电路,尤其是涉及到电压基准、信号调理或者高精度ADC前端时,一个绕不开的坎就是精密分压器。你可能在设计一个需要0.1%甚至更高精度的分压网络,但手头的万用表…...
Airtest Poco实战:5分钟搞定微信小程序自动化测试环境搭建与元素抓取
Airtest Poco实战:5分钟搞定微信小程序自动化测试环境搭建与元素抓取微信小程序作为轻量级应用的代表,已经渗透到电商、社交、工具等各个领域。随着小程序功能的日益复杂,自动化测试成为保障产品质量的重要手段。本文将带你快速搭建微信小程序…...
从安装到排错:手把手解决Linux服务器上Nacos启动失败的十大常见问题
从安装到排错:手把手解决Linux服务器上Nacos启动失败的十大常见问题当你在Linux服务器上部署Nacos时,是否遇到过启动失败却无从下手的困境?作为阿里巴巴开源的服务发现和配置管理平台,Nacos在微服务架构中扮演着重要角色。然而&am…...
如何用Python脚本榨干百度网盘带宽:pan-baidu-download终极指南
如何用Python脚本榨干百度网盘带宽:pan-baidu-download终极指南 【免费下载链接】pan-baidu-download 百度网盘下载脚本 项目地址: https://gitcode.com/gh_mirrors/pa/pan-baidu-download 在数字时代,百度网盘已成为我们存储和分享大型文件的默认…...
