Java程序基础——5.字符与字符串
Java中的字符与字符串
在Java编程中,字符(char
)和字符串(String
)是处理文本数据的核心元素。尽管它们都与文本相关,但在Java中属于不同的类型系统。
字符类型(char):单个Unicode字符的表示
字符类型char
是Java的基本数据类型之一,专门用于表示单个字符。Java对字符的处理采用Unicode编码标准,这使得它能够支持全球几乎所有的文字系统。
字符的定义与初始化
定义char
类型变量时,使用单引号'
包裹字符:
char c1 = 'A'; // 英文字符
char c2 = '中'; // 中文字符
char c3 = '€'; // 欧元符号
char c4 = ''; // Emoji表情(Unicode补充平面字符)
由于Java使用Unicode编码,每个char
类型变量无论表示什么字符,都占用2个字节的内存空间。
字符与Unicode编码的转换
char
类型可以直接与整数类型相互转换,转换的依据是字符的Unicode编码值:
// 字符转Unicode编码
int codeA = 'A'; // 65,'A'的Unicode编码
int codeZh = '中'; // 20013,'中'的Unicode编码
// Unicode编码转字符
char char65 = (char) 65; // 'A'
char char20013 = (char) 20013; // '中'
还可以使用Unicode转义序列\u
来定义字符,其中\u
后面跟随4位十六进制数:
char c5 = '\u0041'; // 等同于 'A',0041是65的十六进制表示
char c6 = '\u4e2d'; // 等同于 '中',4e2d是20013的十六进制表示
这种表示方法特别适合在不能直接输入某些特殊字符的环境中使用。
字符串类型(String):字符序列的集合
字符串类型String
是Java中最常用的引用类型之一,用于表示一个字符序列。与char
不同,String
可以存储0个到任意多个字符。
字符串不可变性
Java中的字符串具有不可变特性,即字符串对象一旦创建,其内容就不能被修改。表面上的"修改"实际上是创建了新的字符串对象:
String s = "hello";
s = s + " world"; // 看似修改了s,实则创建了新字符串"hello world"
上述代码的执行过程:
- 创建字符串"hello",变量
s
指向它 - 创建新字符串"hello world"(通过连接"hello"和" world")
- 变量
s
转而指向新创建的字符串 - 原字符串"hello"仍然存在,只是不再被
s
引用
不可变性的好处:
- 线程安全:不可变对象天然线程安全
- 可以安全地共享:字符串常量池机制基于此
- 作为哈希表的键更安全:哈希值不会变化
转义字符:处理特殊字符
当字符串中需要包含特殊字符(如双引号、反斜杠等)时,需要使用转义字符\
:
转义序列 | 表示的字符 |
---|---|
\" |
双引号 |
\' |
单引号 |
\\ |
反斜杠 |
\n |
换行符 |
\r |
回车符 |
\t |
制表符(Tab) |
\uXXXX |
Unicode字符 |
示例:
String quote = "He said \"Hello\" to me"; // 包含双引号
String path = "C:\\Program Files\\Java"; // 包含反斜杠
String multiLine = "Line 1\nLine 2\tTabbed"; // 包含换行和制表符
String unicode = "Hello \u4e16\u754c"; // 包含Unicode转义的"世界"
多行字符串:简化复杂文本
从Java 13开始,引入了文本块(Text Blocks)特性,使用三个双引号"""
来表示多行字符串,极大简化了多行文本的表示:
String sql = """
SELECT id, name, email
FROM users
WHERE status = 'active'
ORDER BY created_at DESC
""";
文本块的特性:
- 自动保留换行符,无需显式添加
\n
- 会自动去除各行前面的共同缩进空格
- 以最短行的缩进为基准去除空格
- 可以通过调整结束
"""
的位置控制是否包含最后的换行符
示例:
// 不包含最后换行符的多行字符串
String poem = """
床前明月光
疑是地上霜
举头望明月
低头思故乡""";
空值与空字符串
在处理字符串时,必须区分null
(空值)和空字符串""
:
String nullStr = null; // 不指向任何对象
String emptyStr = ""; // 指向一个包含0个字符的有效字符串对象
两者的区别:
null
表示变量未指向任何对象,操作null
会抛出NullPointerException
- 空字符串是一个有效的
String
对象,长度为0,可以安全调用字符串方法
判断示例:
// 检查是否为null
if (str == null) {
System.out.println("字符串为null");
}
// 检查是否为空字符串
if (str != null && str.isEmpty()) {
System.out.println("字符串为空字符串");
}
// 检查是否为null或空字符串(Java 11+)
if (str.isBlank()) {
System.out.println("字符串为null、空或仅包含空白字符");
}
字符串常量池:优化内存使用
为了优化内存占用,Java引入了字符串常量池(String Constant Pool)机制:
- 直接使用双引号定义的字符串会被放入常量池
- 相同内容的字符串在常量池中只会存储一份
- 通过
new String("...")
创建的字符串不会直接进入常量池
示例:
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
System.out.println(s1 == s2); // true,指向常量池中的同一对象
System.out.println(s1 == s3); // false,s3指向新创建的对象
System.out.println(s1.equals(s3)); // true,内容相同
可以使用intern()
方法将字符串加入常量池:
String s4 = s3.intern(); // 将s3的内容加入常量池并返回引用
System.out.println(s1 == s4); // true,现在指向同一对象
总结:
- 字符
char
:char
表示单个Unicode字符,占用2字节- 掌握字符与Unicode编码的转换
- 字符串
String
:String
是引用类型,表示字符序列,具有不可变性- 掌握使用转义字符
\
用于表示常见特殊字符 - 了解Java 13开始,多行字符串使用
"""
定义 - 留意区分比较
null
(空值)和""
(空字符串),避免空指针异常 - 掌握字符串常量池的规则,如何优化了相同字符串的内存占用
后续会单独整理String
类章节,包括字符串的各种操作,如创建、查找、替换、截取等。本节了解即可。
Java程序基础——5.字符与字符串的更多相关文章
- 廖雪峰Java1-2程序基础-8字符和字符串
1.字符类型char char是基本的数据类型 char:保存一个字符,如英文字符.中文字符. Java使用unicode表示字符,可以将char赋值给int类型,查看字符对应的unicode编码. ...
- 使用.bat来执行Java程序基础
将java程序做成可运行的jar后,又希望使用.bat文件来调用jar时,有几点需要注意的. 1.设置path和classpath .bat文件中扥的内容如下: @echo off set MY_HO ...
- Java程序基础编程基础
1.在屏幕上输出"你好" //Programmer name Helloword.javapublic class Helloword { public static void m ...
- java,数字,字符,字符串之间的转化
首先,先看一道编程题目: A除以B (20) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 本题要求计算A/B ...
- Java程序猿学习C++之字符串
#include <iostream> #include <string.h> using namespace std; int my_len(const char *str) ...
- Julia基础语法字符和字符串
1.Julia字符串 2.字符
- C/C++程序基础 (四)字符串
字符串与数字转化 数字转换字符串:itoa, ltoa, ultoa ; gcvt, ecvt, fcvt 字符串转数字:atoi, atof(双精度浮点), atol:strtod(双精度浮点), ...
- java程序基础
- 到头来还是逃不开Java - Java13程序基础
java程序基础 没有特殊说明,我的所有学习笔记都是从廖老师那里摘抄过来的,侵删 引言 兜兜转转到了大四,学过了C,C++,C#,Java,Python,学一门丢一门,到了最后还是要把Java捡起来. ...
- 字符和字符串在Java中的旅程
以下是个人对java中字符和字符串的见解,如有疏漏之处,还请不吝赐教. 下面通过一个简单的程序来说明字符和字符串在Java中的旅程. 以字符 ' 中 '为例, 它的GBK编码是2个字节:0xd6d0, ...
随机推荐
- CF1992E Novice's Mistake
CF1992E Novice's Mistake 同步于个人博客. Problem Noobish_Monk 有 \(n\in [1,100]\) 个朋友.每个朋友都给了他 \(a\in [1,100 ...
- 图神经网络(GNN)模型的基本原理
一.概述 在人工智能领域,数据的多样性促使研究人员不断探索新的模型与算法.传统的神经网络在处理像图像.文本这类具有固定结构的数据时表现出色,但面对具有不规则拓扑结构的图数据,如社交网络.化学分子结 ...
- JVM 类加载过程与字节码执行深度解析
在 Java 高级程序员面试中,类加载机制与字节码执行原理是 JVM 模块的核心考察点.本文从类加载生命周期.类加载器协作机制.字节码执行引擎及面试高频问题四个维度,结合 JVM 规范与 HotSpo ...
- HyperWorks使用六面体和三棱柱单元进行实体网格剖分
本节将演示如何使用 solid map 功能对一个复杂的几何实体进行网格剖分.剖分的思路是:首先对该实体进行适当的切割,以使其各个部分均处于 mappable 的状态:然后分别对各个子块进行 soli ...
- C#.Net筑基-优雅LINQ的查询艺术
Linq(Language Integrated Query,集成查询语言),顾名思义就是用来查询数据的一种语言(可以看作是一组功能.框架特性的集合).在.NETFramework3.5(大概2007 ...
- 使用 Spread.net将 Excel 中的文本拆分为多段
引言: 在 .NET 应用程序中处理 Excel 数据时,常常会碰到需要把文本拆分成多段的情况.例如在数据清洗.数据分析等场景下,将长文本按照特定规则拆分为多段能让数据更便于处理和分析.Spread. ...
- C# DataGridView 通过Model 直接定义字段(您不用再设计器中添加字段了)
//取属性上的自定义特性给DataGridView赋值 Type objType = typeof(Models.Model); foreach (PropertyInfo propInfo in o ...
- java--struts的数据处理、文件上传
Struct2配置 如果项目中用到了其他拦截器,在配置文件(web.xml)中一定要写到Struts拦截器上面 Struts2的Action的几种开发模式 1.继承 ActionSupport(一般使 ...
- android实现QQ登录界面(大学作业一)
实验项目: QQ登录界面 实验地点: 躬行楼718 实验时间: 2018.10.13 一.实验目的: 1.掌握Android中布局的概念和用法 2.熟练掌握Android中Button.ImageVi ...
- vue3组合式api 和 react自定义hooks
前言 其实两者是一个东西,只是叫法不通 而且显然这次是vue抄袭了react 为了对比,我举了两个例子,都用了一套数据 Mock.mock("/getStudent",option ...