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. CF1992E Novice's Mistake

    CF1992E Novice's Mistake 同步于个人博客. Problem Noobish_Monk 有 \(n\in [1,100]\) 个朋友.每个朋友都给了他 \(a\in [1,100 ...

  2. 图神经网络(GNN)模型的基本原理

    一.概述   在人工智能领域,数据的多样性促使研究人员不断探索新的模型与算法.传统的神经网络在处理像图像.文本这类具有固定结构的数据时表现出色,但面对具有不规则拓扑结构的图数据,如社交网络.化学分子结 ...

  3. JVM 类加载过程与字节码执行深度解析

    在 Java 高级程序员面试中,类加载机制与字节码执行原理是 JVM 模块的核心考察点.本文从类加载生命周期.类加载器协作机制.字节码执行引擎及面试高频问题四个维度,结合 JVM 规范与 HotSpo ...

  4. HyperWorks使用六面体和三棱柱单元进行实体网格剖分

    本节将演示如何使用 solid map 功能对一个复杂的几何实体进行网格剖分.剖分的思路是:首先对该实体进行适当的切割,以使其各个部分均处于 mappable 的状态:然后分别对各个子块进行 soli ...

  5. C#.Net筑基-优雅LINQ的查询艺术

    Linq(Language Integrated Query,集成查询语言),顾名思义就是用来查询数据的一种语言(可以看作是一组功能.框架特性的集合).在.NETFramework3.5(大概2007 ...

  6. 使用 Spread.net将 Excel 中的文本拆分为多段

    引言: 在 .NET 应用程序中处理 Excel 数据时,常常会碰到需要把文本拆分成多段的情况.例如在数据清洗.数据分析等场景下,将长文本按照特定规则拆分为多段能让数据更便于处理和分析.Spread. ...

  7. C# DataGridView 通过Model 直接定义字段(您不用再设计器中添加字段了)

    //取属性上的自定义特性给DataGridView赋值 Type objType = typeof(Models.Model); foreach (PropertyInfo propInfo in o ...

  8. java--struts的数据处理、文件上传

    Struct2配置 如果项目中用到了其他拦截器,在配置文件(web.xml)中一定要写到Struts拦截器上面 Struts2的Action的几种开发模式 1.继承 ActionSupport(一般使 ...

  9. android实现QQ登录界面(大学作业一)

    实验项目: QQ登录界面 实验地点: 躬行楼718 实验时间: 2018.10.13 一.实验目的: 1.掌握Android中布局的概念和用法 2.熟练掌握Android中Button.ImageVi ...

  10. vue3组合式api 和 react自定义hooks

    前言 其实两者是一个东西,只是叫法不通 而且显然这次是vue抄袭了react 为了对比,我举了两个例子,都用了一套数据 Mock.mock("/getStudent",option ...