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"

上述代码的执行过程:

  1. 创建字符串"hello",变量s指向它
  2. 创建新字符串"hello world"(通过连接"hello"和" world")
  3. 变量s转而指向新创建的字符串
  4. 原字符串"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.字符与字符串的更多相关文章

  1. 廖雪峰Java1-2程序基础-8字符和字符串

    1.字符类型char char是基本的数据类型 char:保存一个字符,如英文字符.中文字符. Java使用unicode表示字符,可以将char赋值给int类型,查看字符对应的unicode编码. ...

  2. 使用.bat来执行Java程序基础

    将java程序做成可运行的jar后,又希望使用.bat文件来调用jar时,有几点需要注意的. 1.设置path和classpath .bat文件中扥的内容如下: @echo off set MY_HO ...

  3. Java程序基础编程基础

    1.在屏幕上输出"你好" //Programmer name Helloword.javapublic class Helloword { public static void m ...

  4. java,数字,字符,字符串之间的转化

    首先,先看一道编程题目: A除以B (20) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 本题要求计算A/B ...

  5. Java程序猿学习C++之字符串

    #include <iostream> #include <string.h> using namespace std; int my_len(const char *str) ...

  6. Julia基础语法字符和字符串

    1.Julia字符串  2.字符

  7. C/C++程序基础 (四)字符串

    字符串与数字转化 数字转换字符串:itoa, ltoa, ultoa ; gcvt, ecvt, fcvt 字符串转数字:atoi, atof(双精度浮点), atol:strtod(双精度浮点), ...

  8. java程序基础

  9. 到头来还是逃不开Java - Java13程序基础

    java程序基础 没有特殊说明,我的所有学习笔记都是从廖老师那里摘抄过来的,侵删 引言 兜兜转转到了大四,学过了C,C++,C#,Java,Python,学一门丢一门,到了最后还是要把Java捡起来. ...

  10. 字符和字符串在Java中的旅程

    以下是个人对java中字符和字符串的见解,如有疏漏之处,还请不吝赐教. 下面通过一个简单的程序来说明字符和字符串在Java中的旅程. 以字符 ' 中 '为例, 它的GBK编码是2个字节:0xd6d0, ...

随机推荐

  1. odoo14的qweb打印单样式丢失问题

    问题:在开发odoo14的打印单过程中:Wkhtmltopdf打印插件已安装的情况下,发现样式丢失了,如下图 问题的原因: 1.可能是外网与内网服务转换时候造成的样式丢失,有时候是端口不一致导致的某些 ...

  2. 全球首个无限执行的 AI 出现!给我玩爽了

    给 AI 一句话,它就能自主执行任务,生成复杂的大型网站.几十页的 PPT.万字爆款图文.千万字长篇小说? 据说这是世界上第一款无限的 AI 智能体 -- Flowith. 无限这个词听起来有点东西啊 ...

  3. python库使用总结

    python库的使用 1:print(补充) 2:math 2.1:math库包括的4个数学常数 2.2math库中的函数 幂对数函数 三角曲线函数 3:字符串处理函数 补充:sorted(str) ...

  4. Springboot笔记<11>面向切面编程AOP

    面向切面编程AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中 ...

  5. ArrayList与LinkedList的增删改查

    ArrayList: 1 package com.lv.study.am.first; 2 3 //ArrayList 有下标 可重复 有序(添加到集合里面的顺序)不等于排序 4 5 6 import ...

  6. 当我们在聊「开源大数据调度系统Taier」的数据开发功能时,到底在讨论什么?

    原文链接:当我们在聊「开源大数据调度系统Taier」的数据开发功能时,到底在讨论什么? 课件获取:关注公众号__ "数栈研习社",后台私信 "Taier"__ ...

  7. 保姆级教程!HyperMesh施加正弦荷载

    HyperMesh怎么施加正弦荷载? 在HyperMesh中施加正弦荷载,可以通过定义载荷方程(equation)来实现.正弦荷载通常用于模拟周期性变化的力或压力,比如振动或波动载荷.以下是一般的步骤 ...

  8. 自用的springboot后端增删改查模板

    Springboot后端简易方式快速搭建 前言 快速学了下.和传统的springboot项目相比,没有用service和serviceImpl.比较不合规,但够简单.可以用于快速开发. 前后端分离.前 ...

  9. Faiss能解决什么问题?Faiss是什么?

    1. Faiss能解决什么问题? 为了比较两个结构化的数据是否相似,例如两张图片是不是类似,两段文本表达的含义是否类似,则需要将非结构化的数据先转成向量数据,然后再进行相似度比较. 如何通过向量化技术 ...

  10. 前端开发系列059-网络篇之网络基础知识和HTTP协议

    一.网络编程基本概念 1.1 客户端和服务器的基本概念 客户端(Client)能从服务器获取资源为客户提供服务的程序(设备). 服务器(Server)为客户端提供服务.提供数据.提供资源的机器. 说明 ...