String在Java中String是一个引用类型它本身也是一个class。但是Java编译器对String有特殊处理即可以直接用...来表示一个字符串String s1 Hello!;实际上字符串在String内部是通过一个char[]数组表示的因此按下面的写法也是可以的String s2 new String(new char[] {H, e, l, l, o, !});因为String太常用了所以Java提供了...这种字符串字面量表示方法。Java字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的private final char[]字段以及没有任何修改char[]的方法实现的。我们来看一个例子// String public class Main { public static void main(String[] args) { String s Hello; System.out.println(s); s s.toUpperCase(); System.out.println(s); } }根据上面代码的输出试解释字符串内容是否改变。字符串比较当我们想要比较两个字符串是否相同时要特别注意我们实际上是想比较字符串的内容是否相同。必须使用equals()方法而不能用。我们看下面的例子// String public class Main { public static void main(String[] args) { String s1 hello; String s2 hello; System.out.println(s1 s2); System.out.println(s1.equals(s2)); } }从表面上看两个字符串用和equals()比较都为true但实际上那只是Java编译器在编译期会自动把所有相同的字符串当作一个对象放入常量池自然s1和s2的引用就是相同的。所以这种比较返回true纯属巧合。换一种写法比较就会失败// String public class Main { public static void main(String[] args) { String s1 hello; String s2 HELLO.toLowerCase(); System.out.println(s1 s2); System.out.println(s1.equals(s2)); } }结论两个字符串比较必须总是使用equals()方法。要忽略大小写比较使用equalsIgnoreCase()方法。String类还提供了多种方法来搜索子串、提取子串。常用的方法有// 是否包含子串: Hello.contains(ll); // true注意到contains()方法的参数是CharSequence而不是String因为CharSequence是String实现的一个接口。搜索子串的更多的例子Hello.indexOf(l); // 2 Hello.lastIndexOf(l); // 3 Hello.startsWith(He); // true Hello.endsWith(lo); // true提取子串的例子Hello.substring(2); // llo Hello.substring(2, 4); ll注意索引号是从0开始的。去除首尾空白字符使用trim()方法可以移除字符串首尾空白字符。空白字符包括空格\t\r\n \tHello\r\n .trim(); // Hello注意trim()并没有改变字符串的内容而是返回了一个新字符串。另一个strip()方法也可以移除字符串首尾空白字符。它和trim()不同的是类似中文的空格字符\u3000也会被移除\u3000Hello\u3000.strip(); // Hello Hello .stripLeading(); // Hello Hello .stripTrailing(); // HelloString还提供了isEmpty()和isBlank()来判断字符串是否为空和空白字符串.isEmpty(); // true因为字符串长度为0 .isEmpty(); // false因为字符串长度不为0 \n.isBlank(); // true因为只包含空白字符 Hello .isBlank(); // false因为包含非空白字符替换子串要在字符串中替换子串有两种方法。一种是根据字符或字符串替换String s hello; s.replace(l, w); // hewwo所有字符l被替换为w s.replace(ll, ~~); // he~~o所有子串ll被替换为~~另一种是通过正则表达式替换String s A,,B;C ,D; s.replaceAll([\\,\\;\\s], ,); // A,B,C,D上面的代码通过正则表达式把匹配的子串统一替换为,。关于正则表达式的用法我们会在后面详细讲解。分割字符串要分割字符串使用split()方法并且传入的也是正则表达式String s A,B,C,D; String[] ss s.split(\\,); // {A, B, C, D}拼接字符串拼接字符串使用静态方法join()它用指定的字符串连接字符串数组String[] arr {A, B, C}; String s String.join(***, arr); // A***B***C格式化字符串字符串提供了formatted()方法和format()静态方法可以传入其他参数替换占位符然后生成新的字符串// String public class Main { public static void main(String[] args) { String s Hi %s, your score is %d!; System.out.println(s.formatted(Alice, 80)); System.out.println(String.format(Hi %s, your score is %.2f!, Bob, 59.5)); } }有几个占位符后面就传入几个参数。参数类型要和占位符一致。我们经常用这个方法来格式化信息。常用的占位符有%s显示字符串%d显示整数%x显示十六进制整数%f显示浮点数。占位符还可以带格式例如%.2f表示显示两位小数。如果你不确定用啥占位符那就始终用%s因为%s可以显示任何数据类型。要查看完整的格式化语法请参考JDK文档。类型转换要把任意基本类型或引用类型转换为字符串可以使用静态方法valueOf()。这是一个重载方法编译器会根据参数自动选择合适的方法String.valueOf(123); // 123 String.valueOf(45.67); // 45.67 String.valueOf(true); // true String.valueOf(new Object()); // 类似java.lang.Object636be97c要把字符串转换为其他类型就需要根据情况。例如把字符串转换为int类型int n1 Integer.parseInt(123); // 123 int n2 Integer.parseInt(ff, 16); // 按十六进制转换255把字符串转换为boolean类型boolean b1 Boolean.parseBoolean(true); // true boolean b2 Boolean.parseBoolean(FALSE); // false要特别注意Integer有个getInteger(String)方法它不是将字符串转换为int而是把该字符串对应的系统变量转换为IntegerInteger.getInteger(java.version); // 版本号11转换为char[]String和char[]类型可以互相转换方法是char[] cs Hello.toCharArray(); // String - char[] String s new String(cs); // char[] - String如果修改了char[]数组String并不会改变// String - char[] public class Main { public static void main(String[] args) { char[] cs Hello.toCharArray(); String s new String(cs); System.out.println(s); cs[0] X; System.out.println(s); } }这是因为通过new String(char[])创建新的String实例时它并不会直接引用传入的char[]数组而是会复制一份所以修改外部的char[]数组不会影响String实例内部的char[]数组因为这是两个不同的数组。从String的不变性设计可以看出如果传入的对象有可能改变我们需要复制而不是直接引用。例如下面的代码设计了一个Score类保存一组学生的成绩// int[] import java.util.Arrays; public class Main { public static void main(String[] args) { int[] scores new int[] { 88, 77, 51, 66 }; Score s new Score(scores); s.printScores(); scores[2] 99; s.printScores(); } } class Score { private int[] scores; public Score(int[] scores) { this.scores scores; } public void printScores() { System.out.println(Arrays.toString(scores)); } }观察两次输出由于Score内部直接引用了外部传入的int[]数组这会造成外部代码对int[]数组的修改影响到Score类的字段。如果外部代码不可信这就会造成安全隐患。请修复Score的构造方法使得外部代码对数组的修改不影响Score实例的int[]字段。字符编码在早期的计算机系统中为了给字符编码美国国家标准学会American National Standard InstituteANSI制定了一套英文字母、数字和常用符号的编码它占用一个字节编码范围从0到127最高位始终为0称为ASCII编码。例如字符A的编码是0x41字符1的编码是0x31。如果要把汉字也纳入计算机编码很显然一个字节是不够的。GB2312标准使用两个字节表示一个汉字其中第一个字节的最高位始终为1以便和ASCII编码区分开。例如汉字中的GB2312编码是0xd6d0。类似的日文有Shift_JIS编码韩文有EUC-KR编码这些编码因为标准不统一同时使用就会产生冲突。为了统一全球所有语言的编码全球统一码联盟发布了Unicode编码它把世界上主要语言都纳入同一个编码这样中文、日文、韩文和其他语言就不会冲突。Unicode编码需要两个或者更多字节表示我们可以比较中英文字符在ASCII、GB2312和Unicode的编码英文字符A的ASCII编码和Unicode编码┌────┐ ASCII: │ 41 │ └────┘ ┌────┬────┐ Unicode: │ 00 │ 41 │ └────┴────┘英文字符的Unicode编码就是简单地在前面添加一个00字节。中文字符中的GB2312编码和Unicode编码┌────┬────┐ GB2312: │ d6 │ d0 │ └────┴────┘ ┌────┬────┐ Unicode: │ 4e │ 2d │ └────┴────┘那我们经常使用的UTF-8又是什么编码呢因为英文字符的Unicode编码高字节总是00包含大量英文的文本会浪费空间所以出现了UTF-8编码它是一种变长编码用来把固定长度的Unicode编码变成14字节的变长编码。通过UTF-8编码英文字符A的UTF-8编码变为0x41正好和ASCII码一致而中文中的UTF-8编码为3字节0xe4b8ad。UTF-8编码的另一个好处是容错能力强。如果传输过程中某些字符出错不会影响后续字符因为UTF-8编码依靠高字节位来确定一个字符究竟是几个字节它经常用来作为传输编码。在Java中char类型实际上就是两个字节的Unicode编码。如果我们要手动把字符串转换成其他编码可以这样做byte[] b1 Hello.getBytes(); // 按系统默认编码转换不推荐 byte[] b2 Hello.getBytes(UTF-8); // 按UTF-8编码转换 byte[] b2 Hello.getBytes(GBK); // 按GBK编码转换 byte[] b3 Hello.getBytes(StandardCharsets.UTF_8); // 按UTF-8编码转换注意转换编码后就不再是char类型而是byte类型表示的数组。如果要把已知编码的byte[]转换为String可以这样做byte[] b ... String s1 new String(b, GBK); // 按GBK转换 String s2 new String(b, StandardCharsets.UTF_8); // 按UTF-8转换始终牢记Java的String和char在内存中总是以Unicode编码表示。延伸阅读对于不同版本的JDKString类在内存中有不同的优化方式。具体来说早期JDK版本的String总是以char[]存储它的定义如下public final class String { private final char[] value; private final int offset; private final int count; }而较新的JDK版本的String则以byte[]存储如果String仅包含ASCII字符则每个byte存储一个字符否则每两个byte存储一个字符这样做的目的是为了节省内存因为大量的长度较短的String通常仅包含ASCII字符public final class String { private final byte[] value; private final byte coder; // 0 LATIN1, 1 UTF16对于使用者来说String内部的优化不影响任何已有代码因为它的public方法签名是不变的。喜欢这个系列的同学可以关注我爆肝一个月Python 从入门到精通
企业数字化 ERP 产品动态
相关推荐
EAS Workflows 实战指南:从 0 到 1 搭建 Expo 应用商店发布 CI/CD 流水线 EAS Workflows 实战指南:从 0 到 1 搭建 Expo 应用商店发布 CI/CD 流水线 【免费下载链接】skills A collection of AI agent skills for working with Expo projects and Expo Application Services 项目地址: https://gitcode.com/GitHub_Trending/skills9/skil… · 2026/11/8 9:08:37
DeepSeek新模型编程基准超Claude,还开放了搜索API:RAG玩家先别急,AI话题解读 昨天 AI 圈最大的新闻,DeepSeek 把 V4.1 Flash 更新到了 1017 版本,还开放了自研搜索 API。编程基准 DeepSWE 拿了 77.0 分,超过了 Claude Opus 5。数字看着吓人,今天聊聊这事到底意味着什么,尤其是对做 RAG 的人。
先… · 2026/11/8 9:08:37
AI PPT 生成工具 PPT Master:把任意文档变成可编辑 PPT AI PPT 生成工具 PPT Master:把任意文档变成可编辑 PPT 【免费下载链接】ppt-master AI turns documents or topics into real, native PowerPoint decks—with native shapes, transitions and animations, data-backed charts and tables on demand, audio narrat… · 2026/11/7 23:13:21
嘉兴秀洲区低压电工证值不值得考?别被中介坑了,看完这篇你就懂 嘉兴秀洲区低压电工证值不值得考?别被中介坑了,看完这篇你就懂 你是不是也这样,听说要考低压电工证,但不知道去哪儿报,怕被中介坑,还担心这个证到底值不值得考?今天就从嘉兴秀洲区低压电工证入手,给你讲明白这事儿,看完你就知道该不该考了。… · 2026/11/8 9:08:12
上海考电工证官网入口怎么考,实操考试心里没底怕挂科?这份攻略帮你稳过 上海考电工证官网入口怎么考,实操考试心里没底怕挂科?这份攻略帮你稳过 实操考试心里没底怕挂科?你不是一个人。在上海,电工证含金量高、适用范围广,但很多人就是卡在实操考试这一关。今天不讲大道理,只讲实操怎么练、怎么考、怎么保过,特别是对于平顶… · 2026/11/8 9:08:12
西安市电工证在哪报名?真实经历告诉你怎么高效通关 西安市电工证在哪报名?真实经历告诉你怎么高效通关 工地太忙根本没时间复习考试,这事儿我懂,去年我在安阳做工地电工的时候,就是这么过来的。那天晚上,我一个人在工棚里,一边看着手机里的电工证报名信息,一边看着手里已经快磨破的绝缘手套,心里真是五… · 2026/11/8 9:08:12
临汾办电工证怎么转?良心建议帮你解决跨省考证难题 临汾办电工证怎么转?良心建议帮你解决跨省考证难题 之前考的证在外省能不能转过来?这几乎是每个跨省工作的电工从业者最关心的问题。别急,临汾办电工证虽然流程有点复杂,但只要掌握对方法, 良心建议… · 2026/11/8 9:08:12
盐城电工证怎么考 2026河南最新政策下怎么规划 盐城电工证怎么考 2026河南最新政策下怎么规划 急需特种作业证才能上岗找工作,盐城电工证怎么考?这是很多正在找工作的朋友最关心的问题。尤其是2026年河南最新政策下,特种作业证的要求和考试流程都发生了不少变化,不了解这些细节,不仅耽误时间… · 2026/11/8 9:08:12
电工证可推迟吗官方回应来了实操考试心里没底怕挂科 电工证可推迟吗官方回应来了实操考试心里没底怕挂科 实操考试心里没底怕挂科,这几乎是每个准备报考电工证的学员最真实的心声。尤其是对于初次接触特种作业的学员来说,电工证的报考流程、考试内容、合格标准都充满未知。最近有不少人关心:… · 2026/11/8 9:07:11
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/8 0:00:20
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/8 0:00:20
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/8 0:00:20
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/8 0:00:20
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/8 0:00:20
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/8 0:00:20
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/8 1:18:25