当前位置: 首页 > news >正文

Java基础知识-char

char的真正含义

我们应该对字符和文本的编码和乱码有了一个清晰的认识,但前面小节基本是与编程语言无关的,我们还是不知道怎么在程序中处理字符和文本。本节讨论在Java中进行字符处理的基础char,Java中还有Character、String、StringBuilder等类用于文本处理,它们的基础都是char,我们在到后面再一一再介绍这些类。

char看上去是很简单的,正如我们在1.2节所说,char用于表示一个字符,这个字符可以是中文字符,也可以是英文字符。赋值时把常量字符用单引号括起来,例如:

char c = 'A';

char z = '马';

但为什么字符类型也可以进行算术运算和比较呢?它的本质到底是什么呢?

在Java内部进行字符处理时,采用的都是Unicode,具体编码格式是UTF-16BE。简单回顾一下,UTF-16使用两个或4个字节表示一个字符,Unicode编号范围在65536以内的占两个字节,超出范围的占4个字节,BE就是先输出高位字节,再输出低位字节,这与整数的内存表示是一致的。

char本质上是一个固定占用两个字节的无符号正整数,这个正整数对应于Unicode编号,用于表示那个Unicode编号对应的字符。

由于固定占用两个字节,char只能表示Unicode编号在65536以内的字符,而不能表示超出范围的字符。那超出范围的字符怎么表示呢?使用两个char。

在这个认识的基础上,我们再来看下char的一些行为。

char有多种赋值方式:

1. char c = 'A'
2. char c = '马'
3. char c = 39532
4. char c = 0x9a6c
5. char c = '\u9a6c'

第1种赋值方式是最常见的,将一个能用ASCII码表示的字符赋给一个字符变量。第2种赋值方式也很常见,但这里是个中文字符,需要注意的是,直接写字符常量的时候应该注意文件的编码,比如,GBK编码的代码文件按UTF-8打开,字符会变成乱码,赋值的时候是按当前的编码解读方式,将这个字符形式对应的Unicode编号值赋给变量,“马”对应的Unicode编号是39532,所以第2种赋值方式和第3种赋值方式是一样的。第3种赋值方式是直接将十进制的常量赋给字符。第4种赋值方式是将十六进制常量赋给字符,第5种赋值方式是按Unicode字符形式。所以,第2、3、4、5种赋值方式都是一样的,本质都是将Unicode编号39532赋给了字符。

由于char本质上是一个整数,所以可以进行整数能做的一些运算,在进行运算时会被看作int,但由于char占两个字节,运算结果不能直接赋值给char类型,需要进行强制类型转换,这和byte、short参与整数运算是类似的。char类型的比较就是其Unicode编号的比较。

char的加减运算就是按其Unicode编号进行运算,一般对字符做加减运算没什么意义,但ASCII码字符是有意义的。比如大小写转换,大写A~Z的编号是65~90,小写a~z的编号是97~122,正好相差32,所以大写转小写只需加32,而小写转大写只需减32。加减运算的另一个应用是加密和解密,将字符进行某种可逆的数学运算可以做加解密。

char的位运算可以看作是对应整数的位运算,只是它是无符号数,也就是说,有符号右移>>和无符号右移>>>的结果是一样的。既然char本质上是整数,查看char的二进制表示,同样可以

Integer的方法,如下所示:

char c = '马';

System.out.println(Integer.toBinaryString(c));

输出为:

1001101001101100

至此,关于整数、小数以及字符的二进制表示就介绍完了,下一章让我们一起来探索类的世界。

在这里小编给大家分享一个Java入门的视频教程,适合零基础想要入门的小伙伴,有经验的程序员也可以加以巩固。

为初学者而著!

适合零基础的小伙伴们学习Java

感兴趣的小伙伴可以点视频链接和小编一起学习,共同进步!

https://www.bilibili.com/video/BV17g411h7Z6/?spm_id_from=333.999.0.0&vd_source=a7816e3b2a3a67ac39dc87f6bf92421cicon-default.png?t=M85Bhttps://www.bilibili.com/video/BV17g411h7Z6/?spm_id_from=333.999.0.0&vd_source=a7816e3b2a3a67ac39dc87f6bf92421c

相关文章:

  • JAVA的NIO和BIO底层原理分析
  • 佳能机械制造将莅临2024第13届生物发酵产品与技术装备展
  • docker-compose mysql
  • 厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能原理篇
  • python笔记(6)String(字符串)
  • 题目 2906: 笨小猴
  • 防御保护:VPN
  • 基于Java学生管理系统设计与实现(源码+部署文档)
  • Mac安装Appium
  • Spark集群搭建的三种方式详解
  • R3F(React Three Fiber)基础篇
  • 单机取证-信息安全管理与评估-2022年国赛真题-环境+wp
  • 小程序是什么?
  • Springboot 对接云端服务器
  • PyTorch之数据集随机值
  • #边学边记 必修4 高项:对事的管理 第六章 项目质量管理之质量控制
  • docker的网络模式
  • 集中供暖热计量温控一体化管理系统
  • mybatis案例--mapper代理开发
  • 【程序运行时的两种环境】
  • vue的相关概念
  • python驾到~障碍通通闪开,美女批量入内存~
  • 【UV打印机】RYPC打印软件教程(六)-系统维护
  • 数据库语句的基本
  • 【备战蓝桥杯 | 软件Java大学B组】十三届真题深刨详解(1)
  • 【MATLAB教程案例25】常用图像变换域的matlab仿真分析——DFT频域,DCT域,小波域等
  • VcXsrv XLaunch 闪退 failed to bind listener 的解决方法
  • 一些特殊SQL使用Mybatis的#{}和${}注意点
  • rpcs3模拟器配置要求是什么?
  • paddleNLP 安装
  • 【算法笔记】位运算详解
  • 《设计模式》装饰者模式