首页 > 编程语言 >java数据类型-字符型详解

java数据类型-字符型详解

时间:2024-12-31 23:25:50浏览次数:3  
标签:编码 java 字符 数据类型 System char 详解 println out

目录

一、基本定义

二、表示方式

1.字符字面量:

2.字符变量声明与赋值:

3.常见操作

(1)、获取字符的 Unicode 值(码点):

(2)、通过 Unicode 码点获取字符:

(3)、字符的比较操作:

(4)、字符参与运算(与其他数据类型结合):

(5)、byte short char混合运算时,各自会先转换成int再做运算

三、字符串相关联系

   1. 字符组成字符串:

   2. 从字符串获取字符:

四、字符编码

1.基本概念

2.常见字符编码方式

(1).ASCII 编码:

(2).Unicode 编码:

(3).GB 系列编码(以 GB2312、GBK、GB18030 为例):

(4).其他

(5).Unicode码表的一部分

3.字符编码转换

五、什么是编码?什么是解码?乱码是怎么产生的?

六、java转义字符

\t(制表符)

\n(换行符)

"(双引号)

'(单引号)

\(反斜线)

  七、应用场景


一、基本定义

Java 的字符型用于表示单个字符,使用 char 关键字来声明。它基于 Unicode 编码标准,这意味着它能够表示世界上众多语言中的各种字符,涵盖了基本的英文字母、数字、标点符号以及其他各种语言里的文字符号等,总共可以表示超过 65536 个不同的字符。

二、表示方式

1.占用两个字节,0~65535,和short容量相同,但char可以取更大的整数

2.单个字符,使用单引号括起来,不能是多个字符

3.可以保存一个汉字

4.char c = ‘’; 这是不允许的

5.char c = ‘\u0000’; 这表示一个空字符,也是char的默认值。\u0000是一个Unicode码。

6.空字符与空格字符是不同的。空字符表示什么也没有。空格字符表示一个空格。

1.字符字面量:

使用单引号括起来表示一个字符,例如 'A' 表示大写字母 A,'5' 表示数字字符 5,'你' 可以表示汉字 “你”(因为支持 Unicode 编码,所以能表示汉字等非英文字符)。需要注意的是,单引号内只能有且仅有一个字符,像 '' (空字符)是合法的,但 'abc' 这样的写法就是错误的。

2.字符变量声明与赋值:

char myChar = 'a';

上述代码声明了一个名为 myChar 的 char 类型变量,并将字符 a 赋值给它。可以通过变量名来访问和操作这个字符。

3.常见操作

(1)、获取字符的 Unicode 值(码点):

可以使用强制类型转换将 char 类型转换为 int 类型来获取对应字符的 Unicode 码点,例如:

char ch = 'A';
int unicodeValue = (int) ch;
System.out.println(unicodeValue);  // 输出65,因为大写字母A的Unicode码点是65

(2)、通过 Unicode 码点获取字符:

反过来,也可以利用 char 类型的特性,通过给定的 Unicode 码点(整数)来得到对应的字符,例如:

int codePoint = 97;  // 小写字母a的Unicode码点是97
char character = (char) codePoint;
System.out.println(character);  // 输出 'a'

(3)、字符的比较操作:

可以使用关系运算符(如 == 、 != 、 < 、 > 等)来比较两个字符的 Unicode 码点大小,从而判断它们在编码顺序上的先后关系等,例如:

char char1 = 'a';
char char2 = 'b';
System.out.println(char1 < char2);  // 输出 true,因为小写字母a的Unicode码点小于小写字母b的码点

(4)、字符参与运算(与其他数据类型结合):

字符型数据可以参与一些算术运算,例如:在字符的基础上进行加减法操作,实际上是对其 Unicode 码点进行相应运算,运算结果可以再转换回字符型或者其他合适的数据类型来查看效果,比如:

char initialChar = 'A';
char shiftedChar = (char) (initialChar + 3);  // 将大写字母A的Unicode码点加3
System.out.println(shiftedChar);  // 输出 'D',因为按Unicode编码顺序,码点加3后对应大写字母D

(5)、byte short char混合运算时,各自会先转换成int再做运算

public class Chartest04 {
    public static void main(String[] args) {
        /*有一个运算规则需记住:
        byte short char混合运算的时候,各自先转换成int再做运算。
        */
        System.out.println('a'+1);//98

        char x='a'+1;
        System.out.println(x);//b

        byte b = 1;
        short s = 1;
        char c = 1;
        //short num = b + s + c;//报错

        //第一种修改方式
        //int num=b+s+c;

        //第二种修改方式
        short num =(short)(b+s+c);
        System.out.println(num);

        /*
        多种数据类型混合运算的时候,各自转换成最大的再做运算
       */
        int k=100;
        short e=200;
        long f=300L;
        double d=3.0;
         //long result=k+e+f+d;//错误的
        double result =k+e+f+d;
        System.out.println(result);

    }
}

运行结果:

三、字符串相关联系

在 Java 中,字符串是用双引号括起来的字符序列,属于 String 类的对象,和 char 类型有密切联系又有所不同。

   1. 字符组成字符串:

可以通过多个 char 类型的字符来构建字符串,例如:

char char1 = 'H';
char char2 = 'e';
char char3 = 'l';
char char4 = 'l';
char char5 = 'o';
String word = "" + char1 + char2 + char3 + char4 + char5;
System.out.println(word);  // 输出 "Hello"

当然,实际应用中更常用的是直接用双引号来定义字符串,像 String str = "Java"; 。

   2. 从字符串获取字符:

可以通过 charAt() 方法从字符串中获取指定位置的单个字符,字符串中字符的索引从 0 开始计数,例如:

String text = "Hello World";
char firstChar = text.charAt(0);
System.out.println(firstChar);  // 输出 'H'

四、字符编码

1.字符编码是人为规定的文字与二进制之间的转换关系。

2.在早期计算机系统中,字符编码主要采用的是 ASCII 编码,采用1个字节编码。最多可以表示256个字符。(实际上ASCII码表只用了128个。)

程序员需要记住这几个:

a 对应ASCII码 97(b是98,以此类推)
A 对应ASCII码 65(B是66,以此类推)
0 对应ASCII码 48(1是49,以此类推)

1.基本概念

字符在日常生活中以各种形式存在,如英文字母、汉字、标点符号等,但计算机只能处理二进制数据(0 和 1 组成的数据)。字符编码就相当于一座桥梁,它规定了如何把我们所看到的形形色色的字符映射成对应的二进制编码,并且在需要时又能依据编码规则准确地将二进制数据再转换回相应的字符.

2.常见字符编码方式

(1).ASCII 编码:

概述:全称为美国信息交换标准代码(American Standard Code for Information Interchange),是最早广泛使用的字符编码标准。它使用 7 位二进制数来表示 128 个常见的字符,包括英文字母(大写和小写)、数字、标点符号以及一些控制字符等,例如字母 A 对应的 ASCII 码是十进制的 65,用二进制表示就是 01000001 。

局限:由于只使用 7 位,所能表示的字符数量有限,无法涵盖世界上众多其他语言的字符,比如中文汉字等复杂字符就不在其表示范围内。

(2).Unicode 编码:

概述:是一种为了解决全球字符表示问题而诞生的字符编码标准,旨在给世界上所有的字符提供一个统一的、唯一的编号(码点),无论是什么语言、什么文字体系的字符都能在 Unicode 中找到对应的编码。它有多种编码实现方式,如 UTF-8、UTF-16、UTF-32 等。

UTF-8:一种可变长的编码方式,它能根据字符的不同,使用 1 到 4 个字节来进行编码。对于 ASCII 码中的字符,UTF-8 和 ASCII 编码保持一致,只用 1 个字节表示,这样很好地兼容了早期的 ASCII 编码系统。例如英文字母等常见字符用 1 个字节,而像汉字等复杂字符则可能用 2 到 3 个字节编码,大大节省了存储空间,是目前互联网上应用最为广泛的字符编码方式之一。

UTF-16:采用固定长度或可变长度的编码方式,多数情况下使用 2 个字节来编码一个字符,但对于一些非常用的、比较特殊的字符可能需要 4 个字节来编码,常用于一些操作系统内部对字符的处理等场景。

UTF-32:使用固定的 4 个字节来编码每个字符,虽然这种方式能简单直接地表示所有 Unicode 字符,但会占用较多的存储空间,所以相对使用场景没有 UTF-8 那么广泛。

(3).GB 系列编码(以 GB2312、GBK、GB18030 为例):

GB2312:是中国国家标准的简体中文字符集编码标准,主要用于对汉字及一些常用的非汉字字符进行编码,它采用双字节编码,能表示 6763 个汉字以及 682 个非汉字字符,满足了早期计算机在国内处理简体中文信息的基本需求。

GBK:是对 GB2312 的扩展,它在 GB2312 的基础上增加了对更多汉字以及一些少数民族文字等的编码,编码范围更广,同样采用双字节编码为主,但也支持部分四字节编码,能够涵盖绝大部分的中文及常用少数民族文字等内容,在国内很多本地化软件等应用场景中有较多使用。

GB18030:是更新的国家标准,进一步扩充了编码范围,能够支持更多的汉字、少数民族文字以及一些生僻字等,它可以采用单字节、双字节、四字节等多种编码方式,几乎涵盖了我国各民族现行使用的所有文字符号,是目前国内处理中文及相关文字信息的重要编码标准之一。

(4).其他

Latin-1编码(ISO 8859-1):采用1个字节编码。该编码方式是为了表示欧洲语言(如荷兰语、西班牙语、法语、德语等)中的字符而设计的,共支持 256 个字符。

ANSI 编码(American National Standards Institute:美国国家标准协会):采用1个字节编码,支持英文、拉丁文等字符。两个ANSI码可以表示一个汉字。

Big5 编码(大五码):是台湾地区的繁体中文字符集,使用 2 个字节来表示一个汉字,适用于使用繁体中文的应用场景。

注意:java采用的是:Unicode编码

public class chartest03 {
    public static void main(String[] args) {
   //java采用的是Unicode编码
        //大总结:当整数型字面量没有超过byte short  char的范围,可以直接将其赋值给byte short  char类型的变量
        //char类型变量定义有三种方式
        //第一种:char c='A';
        //第二种:char c='\u0041';
        //第三种:char c=65;

        char c1='A';
        System.out.println(c1);

        //   \\u后面是一个十六进制的数字,这个十六进制是字符对应的Unicode码
        //表面看是一个字符串,实际上只是一个字符
        char c2='\u0041';
        System.out.println(c2);

        //当整数型字面量没有超过char的取值范围,可以直接将其赋值给char类型的变量
        //当声明char类型变量的时候,如果值是一个整数型字面量,那么这个字面量会被当作ASCII码值来处理
        char c3=97;
        char c4=65535;
        //char c5=65536;   //错误的

        System.out.println(c3);


    }
}

运行结果:

(5).Unicode码表的一部分

3.字符编码转换

在实际应用中,有时可能会遇到需要将一种字符编码的数据转换为另一种字符编码的情况,比如从 GBK 编码的文本文件转换为 UTF-8 编码以便在国际平台上使用。不同编程语言都提供了相应的工具或函数来实现编码转换,以 Java 为例:

import java.nio.charset.Charset;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String text = "你好";
        byte[] gbkBytes = text.getBytes(Charset.forName("GBK"));
        byte[] utf8Bytes = Charset.forName("UTF-8").encode(text).array();

        System.out.println("GBK编码后的字节数组:" + Arrays.toString(gbkBytes));
        System.out.println("UTF-8编码后的字节数组:" + Arrays.toString(utf8Bytes));

        String decodedTextFromGBK = new String(gbkBytes, Charset.forName("GBK"));
        String decodedTextFromUTF8 = new String(utf8Bytes, Charset.forName("UTF-8"));

        System.out.println("从GBK编码还原的文本:" + decodedTextFromGBK);
        System.out.println("从UTF-8编码还原的文本:" + decodedTextFromUTF8);
    }
}

上述代码演示了在 Java 中如何将一个包含汉字的字符串分别进行 GBK 和 UTF-8 编码,得到相应的字节数组,并且又能通过相应的编码方式将字节数组还原为原始的字符串,展示了字符编码转换及还原的基本操作过程。

五、什么是编码?什么是解码?乱码是怎么产生的?

字符在计算机系统中,解码(Decoding)和编码(Encoding)是两个常用的概念,分别表示将二进制数据转换为字符和将字符转换为二进制数据。

编码是将字符转换为二进制数据的过程。

'a' ---------按照ASCII码表编码-----------> 01100001

解码是将二进制数据转换为字符的过程

例如:01100001 --------按照ASCII码表解码------------> 'a'

乱码是指在字符编码和解码的过程中,由于编码和解码所采用的字符集不一致,或者编码和解码所采用的字符集不支持某些字符,导致最终显示的字符与原始字符不一致。为了避免乱码的问题,我们需要统一使用一个字符集,并且在进行字符编码和解码时要保持一致。

六、java转义字符

在 Java 中,转义字符有着重要的作用,以下是对上述几种常见转义字符更详细的解读与示例:

\t表示制表符,相当于按下 Tab 键
\n表示换行符
\"表示双引号   "
\'表示单引号    '
\\表示反斜线  \  本身

\t(制表符)

含义与作用:

在 Java 的字符串输出等场景中,\t 代表制表符,它能让文本按照一定的间隔规则排列,类似于在文本编辑软件中按下 Tab 键所产生的效果,有助于使输出内容呈现出整齐的表格样式,增强文本的可读性和美观性。

代码示例:

public class Main {
    public static void main(String[] args) {
        System.out.println("姓名\t年龄\t城市");
        System.out.println("张三\t25\t北京");
        System.out.println("李四\t30\t上海");
    }
}

运行结果:

在上述代码中,通过在各个字段之间使用 \t 转义字符,使得输出的文本在控制台中呈现出类似表格的形式,方便直观地查看不同数据之间的对应关系,每行中的各个数据项都能整齐地对齐。

\n(换行符)

含义与作用:

\n 用于在字符串中强制进行换行操作,当 Java 程序执行遇到 \n 时,后续的文本内容将会从新的一行开始显示。它常用于输出多行文本、格式化文本内容或者在文件写入操作中实现换行效果等场景。

代码示例:

public class Main {
    public static void main(String[] args) {
        System.out.println("第一行内容\n第二行内容\n第三行内容");
    }
}

运行结果:

运行这段代码后,输出结果会按照换行符的分隔,分三行来显示相应的文本内容,清晰地展示出多行文本的效果,便于对文本进行有条理的呈现。

"(双引号)

含义与作用:

由于在 Java 中,字符串是使用双引号来界定的,若要在字符串内部表示双引号这个字符本身,就需要借助转义字符 \" 来进行表示,否则 Java 编译器会将未转义的双引号当作字符串结束的标志,从而引发语法错误。

代码示例:

public class chartest02 {
    public static void main(String[] args) {
        //需求:输出一个双引号到控制台
        System.out.println("\"");
        System.out.println("\"\"");
        System.out.println('"');
        System.out.println("他说:\"今天天气真好\"");
    }
}

运行结果:

 通过使用 \ 对双引号进行转义,在输出语句中就能正确地呈现出包含双引号的文本内容,更符合实际的语言表达情况,比如在引用他人话语时使用双引号来准确表示。

'(单引号)

含义与作用:

与双引号转义类似,当使用单引号来表示字符(char 类型)或者在某些特定情况下使用单引号界定字符串时(虽然在 Java 中较少这样用,但语法上允许在字符字面量等场景使用单引号),如果要在其中包含单引号这个字符本身,就需要用转义字符 \ 进行转义,确保语法的正确性以及正确表达包含单引号的内容。

代码示例:

public class chartest03 {
    public static void main(String[] args) {
        //需求:输出一个单引号到控制台
        System.out.println("'");
        System.out.println('\'');

    }
}

\(反斜线)

含义与作用:

反斜线 \ 在 Java 的转义字符体系中是转义的起始标志,有着特殊的作用。当我们想要在字符串中单纯地表示反斜线这个字符本身时,就必须使用转义字符 \\ 来进行表示,不然 Java 编译器会把单个 \ 当作转义字符的开头去解析后面的字符,导致可能出现错误或者不符合预期的解析结果。

代码示例:

public class Main {
    public static void main(String[] args) {
        System.out.println("文件路径:C:\\Program Files\\Java");
    }
}

在输出表示文件路径等涉及反斜线较多的文本内容时,使用 \\ 转义字符可以准确无误地将反斜线字符展示出来,保障文本表达的准确性以及符合实际的文件路径等格式要求。

  七、应用场景

    文本处理:在读取文本文件内容、解析用户输入的文本信息等场景下,需要逐个字符或者以字符为基础来处理文本内容,比如统计一段文字中某个字符出现的频次等操作。

    国际化支持:由于 Java 字符型基于 Unicode 编码,对于开发需要支持多语言的应用程序十分有利,无论是显示不同语言的菜单、提示语等界面元素,还是处理不同语言的文本数据输入输出,都离不开字符型对各种字符的准确表示和操作。

    字符加密与转换:在进行一些简单的字符加密算法(如凯撒密码等经典加密方式,通过对字符的 Unicode 码点进行特定的移位操作来实现加密)或者字符编码格式转换等任务中,字符型数据作为基础的操作对象来实现相应的功能。

总之,Java 中的字符型数据类型在诸多涉及文本和字符处理的应用场景中发挥着关键作用,是 Java 编程中处理文字相关信息的重要组成部分。

标签:编码,java,字符,数据类型,System,char,详解,println,out
From: https://blog.csdn.net/m0_73941339/article/details/144844580

相关文章

  • Java子线程无法获取Attributes的解决方法
    在Java多线程编程中,开发者经常会遇到子线程无法获取主线程设置的Attributes的问题。Attributes通常用于存储与当前线程相关的数据,尤其在Web应用中,它们常用于请求上下文的管理。然而,由于Java线程是独立运行的,每个线程有自己的内存空间,一个线程无法直接访问另一个线程的局部变量或属......
  • ES6中定义私有属性详解
    在ES6中,定义私有属性的方式相对传统的JavaScript有所不同。ES6并没有提供直接的语法来定义私有属性,但可以通过几种方法间接实现私有属性。1.使用Symbol来模拟私有属性Symbol是一种新的数据类型,可以作为对象的键,并且它的值是唯一的,不容易被外部访问或修改。示例:const_p......
  • Javaer开发环境的搭建(个人喜好向)
    前言我们进入到新的工作环境,或者电脑重新安装系统后,总要重新配置开发环境,这时候需要四处搜来搜去的就很麻烦了,所以在此做一个笔记文件编辑器个人习惯使用VisualStudioCode大文件查看(比如看1GB以上的日志文件)可以使用EmEditorJavaJDK下载个人使用更习惯OpenJDK,可以在清......
  • 【Java 温故而知新系列】基础知识-03 基本类型对应之包装类
    1、包装类都有哪些?基本类型都有对应的包装类型,这些包装类提供了一种面向对象的方式来处理基本数据类型,允许它们被用于需要对象的场景,如集合框架、泛型等。对应关系:基本类型包装类型booleanBooleanbyteBytecharCharacterfloatFloatintIntegerlongLong......
  • Rust f64详解
    一、Rust中的f64类型与IEEE754双精度浮点数Rust中的f64类型是一个双精度浮点数类型,它严格遵循IEEE754双精度标准。这意味着f64类型在Rust中的存储和表示方式与IEEE754双精度浮点数完全一致。二、存储格式f64类型由64位二进制数表示,分为以下三部分:1.符号位(1位):位置:第......
  • 使用exe4j将jar转成exe、java打包exe
    1、maven打包需要配置以下插件,注意skip为false插件配置中设置<skip>true</skip>时,实际上是告诉Maven在构建过程中跳过spring-boot-maven-plugin插件的执行。也就是说,Maven在打包时不会将项目打包成可执行的JAR文件,也不会为JAR文件生成必要的MANIFEST.MF文件,......
  • 促销系统:促销业务详解
    大家好,我是汤师爷~促销活动的核心价值在于利用价格优势吸引贪便宜的消费者。许多用户会积极寻找各类优惠,看到红包或折扣时容易产生购买冲动。对商家而言,促销是快速清理库存的有效工具。特别是对于季节性商品或临期产品,促销能加快出货速度。同时,促销也能提升销售额,当顾客对商品感......
  • Type c系列接口驱动电路·Type c系列接口驱动电路详解内置供电驱动电路使用USB2.0驱动
    目录Typec常见封装Typec不同系列Typec驱动电路Typec数据手册                                 编写不易,仅供学习,请勿搬运,感谢理解常见元器件驱动电路文章专栏连接LM7805系列降压芯片驱动电路·降压芯片驱动电路详解-CSDN博客ME......
  • Java高级工程师面试揭秘:深挖技术细节,挑战架构设计能力
    前言一个真正的高级Java工程师,应当具备坚如磐石的技术基础,对至少一门编程语言达到炉火纯青的熟练度。他们不仅要有深入研究至少一个杰出开源项目的源代码的经历,还需具备在高并发和性能优化领域的实战经验。此外,沟通与协作能力也是其不可或缺的软技能,能够高效地与团队成员交......
  • java和php语言实现堆排序算法代码示例
    堆排序(HeapSort)是一种基于堆数据结构的比较排序算法。堆是一棵完全二叉树,分为最大堆和最小堆。最大堆中父节点的值总是大于或等于其子节点的值,而最小堆则相反。堆排序通过构建堆,然后反复将堆顶元素与末尾元素交换,并调整剩余元素为堆,最终实现排序。堆排序也是常见的算法题目。Jav......