李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 读书观影
  • 系列
  • AI工具集
  • 论坛
  • 友圈
    • 友链
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
静亦定 动亦定
惟坚韧者始能遂其志
  1. 首页
  2. 后端
  3. 正文

Java中的字符和字符串

2022年7月18日 194 0 0
合集:Java第 2 篇 / 共 6 篇
  1. 1Java数组类型
  2. 2Java中的字符和字符串当前
  3. 3Java布尔运算
  4. 4Java浮点数运算
  5. 5Java整数运算
  6. 6Java中的变量和数据类型

在Java中,字符和字符串是两个不同的类型。

字符类型

字符类型char是基本数据类型,它是character的缩写。一个char保存一个Unicode字符:

char c1 = 'A';
char c2 = '中';

因为Java在内存中总是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。要显示一个字符的Unicode编码,只需将char类型直接赋值给int类型即可:

int n1 = 'A'; // 字母“A”的Unicodde编码是65
int n2 = '中'; // 汉字“中”的Unicode编码是20013

还可以直接用转义字符\u+Unicode编码来表示一个字符:

// 注意是十六进制:
char c3 = '\u0041'; // 'A',因为十六进制0041 = 十进制65
char c4 = '\u4e2d'; // '中',因为十六进制4e2d = 十进制20013

字符串类型

和char类型不同,字符串类型String是引用类型,我们用双引号"..."表示字符串。一个字符串可以存储0个到任意个字符:

String s = ""; // 空字符串,包含0个字符
String s1 = "A"; // 包含一个字符
String s2 = "ABC"; // 包含3个字符
String s3 = "中文 ABC"; // 包含6个字符,其中有一个空格

因为字符串使用双引号"..."表示开始和结束,那如果字符串本身恰好包含一个"字符怎么表示?例如:"abc"xyz",编译器就无法判断中间的引号究竟是字符串的一部分还是表示字符串结束。这个时候,我们需要借助转义字符\:

String s = "abc\"xyz"; // 包含7个字符: a, b, c, ", x, y, z

因为\是转义字符,所以,两个\\表示一个\字符:

String s = "abc\\xyz"; // 包含7个字符: a, b, c, \, x, y, z

常见的转义字符包括:

  • \" 表示字符"
  • \' 表示字符'
  • \\ 表示字符\
  • \n 表示换行符
  • \r 表示回车符
  • \t 表示Tab
  • \u#### 表示一个Unicode编码的字符

例如:

String s = "ABC\n\u4e2d\u6587"; // 包含6个字符: A, B, C, 换行符, 中, 文

字符串连接

Java的编译器对字符串做了特殊照顾,可以使用+连接任意字符串和其他数据类型,这样极大地方便了字符串的处理。例如:

// 字符串连接
public class Main {
    public static void main(String[] args) {
        String s1 = "Hello";
        String s2 = "world";
        String s = s1 + " " + s2 + "!";
        System.out.println(s);
    }
}

如果用+连接字符串和其他数据类型,会将其他数据类型先自动转型为字符串,再连接:

// 字符串连接
public class Main {
    public static void main(String[] args) {
        int age = 25;
        String s = "age is " + age;
        System.out.println(s);
    }
}

多行字符串

如果我们要表示多行字符串,使用+号连接会非常不方便:

String s = "first line \n"
         + "second line \n"
         + "end";

从Java 13开始,字符串可以用"""..."""表示多行字符串(Text Blocks)了。举个例子:

// 多行字符串
public class Main {
    public static void main(String[] args) {
        String s = """
                   SELECT * FROM
                     users
                   WHERE id > 100
                   ORDER BY name DESC
                   """;
        System.out.println(s);
    }
}

上述多行字符串实际上是5行,在最后一个DESC后面还有一个\n。如果我们不想在字符串末尾加一个\n,就需要这么写:

String s = """ 
           SELECT * FROM
             users
           WHERE id > 100
           ORDER BY name DESC""";

还需要注意到,多行字符串前面共同的空格会被去掉,即:

String s = """
...........SELECT * FROM
...........  users
...........WHERE id > 100
...........ORDER BY name DESC
...........""";

用.标注的空格都会被去掉。

如果多行字符串的排版不规则,那么,去掉的空格就会变成这样:

String s = """
.........  SELECT * FROM
.........    users
.........WHERE id > 100
.........  ORDER BY name DESC
.........  """;

即总是以最短的行首空格为基准。

不可变特性

Java的字符串除了是一个引用类型外,还有个重要特点,就是字符串不可变。考察以下代码:

// 字符串不可变
public class Main {
    public static void main(String[] args) {
        String s = "hello";
        System.out.println(s); // 显示 hello
        s = "world";
        System.out.println(s); // 显示 world
    }
}

观察执行结果,难道字符串s变了吗?其实变的不是字符串,而是变量s的“指向”。

执行String s = "hello";时,JVM虚拟机先创建字符串"hello",然后,把字符串变量s指向它:

      s
      │
      ▼
┌───┬───────────┬───┐
│   │  "hello"  │   │
└───┴───────────┴───┘

紧接着,执行s = "world";时,JVM虚拟机先创建字符串"world",然后,把字符串变量s指向它:

      s ──────────────┐
                      │
                      ▼
┌───┬───────────┬───┬───────────┬───┐
│   │  "hello"  │   │  "world"  │   │
└───┴───────────┴───┴───────────┴───┘

原来的字符串"hello"还在,只是我们无法通过变量s访问它而已。因此,字符串的不可变是指字符串内容不可变。

理解了引用类型的“指向”后,试解释下面的代码输出:

// 字符串不可变
public class Main {
    public static void main(String[] args) {
        String s = "hello";
        String t = s;
        s = "world";
        System.out.println(t); // t是"hello"还是"world"?
    }
}

空值null

引用类型的变量可以指向一个空值null,它表示不存在,即该变量不指向任何对象。例如:

String s1 = null; // s1是null
String s2; // 没有赋初值值,s2也是null
String s3 = s1; // s3也是null
String s4 = ""; // s4指向空字符串,不是null

注意要区分空值null和空字符串"",空字符串是一个有效的字符串对象,它不等于null。

小结

Java的字符类型char是基本类型,字符串类型String是引用类型;

基本类型的变量是“持有”某个数值,引用类型的变量是“指向”某个对象;

引用类型的变量可以是空值null;

要区分空值null和空字符串""。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

Java中的字符和字符串

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: JAVA 教程
最后更新:2026年7月14日

岁月同一天 10 月 29 日

回望过去的今天,你在写什么

  • 百科
    1 年前 2025年10月29日
    夏令时

    一、读懂夏令时:起源、范围与利弊 夏令时本质是一种“人为调整地方时间”的制度,核心目的是利用夏季充足的日照,减少照明能源…

  • 后端
    1 年前 2025年10月29日
    Spring HTTP客户端演进:从RestTemplate到WebClient与RestClient

    在Spring生态中,HTTP客户端一直是连接服务、集成外部API的核心组件。从早期的RestTemplate到如今的W…

  • 后端
    1 年前 2025年10月29日
    从万级到千万级:排行榜系统的6种实现方案深度解析(含原理、优化与实战)

    在业务开发中,排行榜是一个高频需求——游戏中的战力榜、电商的销量榜、内容平台的点赞榜、社交产品的热度榜……看似简单的“排…

  • 其他
    2 年前 2024年10月29日
    你总要学会往前走

    可能你走错了路 可能你看错了人 可能你哭的最伤心的夜 突然变成了大人 可能你少了天真 可能你多了爱恨 希望你见过所有的混…

相关文章
  • ThreadLocal如何解决内存泄漏问题2024年4月12日
  • @Resource 和 @Autowired 的区别2022年6月24日
  • 【收藏】Java问题排查相关工具工具箱2019年10月16日
  • SpringBoot集成Redis,从Redis中获取数据为null,但实际上Redis中是存在对应的数据的,是什么原因导致的呢?2021年1月19日
  • RocketMQ的push消费方式实现详解2022年8月9日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 合集上一篇
合集下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

试问岭南应不好,却道:此心安处是吾乡。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
AI的生成能力等于生产力吗? NGINX严重漏洞(CVE-2026-15176、CVE-2026-93479、CVE-2026-97205) Kratos-plus v1.1.27更新说明 php2shell远程执行漏洞修复(CVE-2026-109618 和 CVE-2026-109619) 聊一聊DeepSeek开放自研搜索API这事 Let's Encrypt宣布证书缩短至64天,手动时代彻底终结!
给主题增加了游客中心功能心气没了,干什么都不得劲我觉得是时候公布我的导航网站了游本昌去世关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能
Kratos+主题新功能介绍 SVN服务端和客户端的安装以及在MyEclipse中的配置 为什么生产环境不建议使用Executors快捷创建线程池? 出院了~~~ 在 SQL 中做范围查询时,使用 BETWEEN AND 和直接用 >/=/ 何时重构?
最近评论
李锋镝 发布于 2 天前(10月27日) 没毛病
李锋镝 发布于 2 天前(10月27日) AI还得人给它堆算力,而且现在放出来的AI都是阉割、限制版,不是完全体
fairy 发布于 2 天前(10月27日) 这就没办法了,本身就是双刃剑。AI本身只是工具而已。
Hary 发布于 2 天前(10月26日) AI能用AI完善它自己么,到时候程序员亲手把自己干掉了
海风心情 发布于 2 天前(10月26日) 生成能力只是起点,价值还得靠落地和验证,中间那些环节才是真功夫。
标签聚合
多线程 分布式 数据库 K8s 日常 SpringBoot AI编程 WordPress Redis Theme ElasticSearch SQL JAVA 架构 Spring IDEA Claude AI MySQL JVM
友情链接
  • 志文工作室
  • 林羽凡
  • 韩情脉脉
  • 彬红茶日记
  • 懋和道人
  • Serendipity
  • 韩小韩博客
  • 皮皮社
  • 知向前端
  • sssr7844的博客
  • 搬砖日记
  • 九仞之行
  • 瓦匠个人小站
  • 哥斯拉
  • lijie blog
  • 刘永博客
  • 老张博客
  • Mr.Sun的博客
  • Honesty

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com 十年之约虫洞

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号