Java采用UTF-16编码作为内码,也就是说在JVM内部,文本是用16位码元序列表示的,常用的文本就是字符(char)和字符串(String)字面常量的内容。注:UTF-16是Unicode字符集的一种编码方案。

Java字符和字符串存在于以下几个地方:

  • Java源码文件,*.java,可以是任意字符编码,如GBK,UTF-8
  • Class文件,*.class,采用的是一种改进的UTF-8编码(Modified UTF-8)
  • JVM,内存中使用UTF-16编码

Java编译器需要正确的读取源码,消除编码差异,然后编译成UTF-8编码的Class文件。比如javac,默认情况下它会取操作系统的编码,可以使用参数-encoding指定源码文件的字符编码。JVM加载Class文件,把其中的字符或字符串转成UTF-16编码序列。

Java中涉及编码的类主要有String和IO包中的字节字符转换流。String.getBytes()使用JVM启动时获得的字符集来编码字符串,也可以使用getBytes(charset)指定字符集;字节就是单纯的01,但转成字符时就要有字符集的概念了,IO包中的InputStreamReaderOutputStreamWriter,是字节流和字符流的桥梁,默认使用JVM默认字符集对字符解码和编码,可以通过构造方法指定字符集。

String str = "创";
str.getBytes("UTF-8"); // 3字节,0xE5889B
str.getBytes("UTF-16"); // 2字节,0x521B InputStreamReader(InputStream, charset);
OutputStreamWriter(OutputStream, charset);

FAQ

1. Java中的字符主要有哪些?

Java编程语言主要有以下几种字符:

  • 空白字符:空格、制表符、换页符和行终止符
  • 注释:/text/ or // text
  • 符号
    • 标识符:就是变量名和类名,其中的字母和数字可以从Unicode字符集中提取,也就是说能用本地语言编写标识符,如String 名字="cxcoder";
    • 关键字:比如class,new
    • 字面常量:简单类型、String、空类型在源码中的表示
    • 分隔符:也叫标点符号,() {} [] ; , . ... @
    • 操作符:逻辑和算术运算符
  • 转义字符
    • Unicode转义字符:通过\u+4个十六进制数使用任何Unicode字符
    • 字面常量转义字符:\b \t \n \f \r \" \' \\不使用Unicode转义字符也能表示一些特殊字符

2. 解释一下程序的输出结果

String hello = "Hello", lo = "lo";
System out print(hello == "Hello"); // true 一个字符串字面常量总是引用String的同一个实例
System out print(hello == ("Hel" +"lo")): // true 常量表达式,编译时得出结果,当做字面常量对待
System out print(hello == ("Hel"+1o)); // false 运行时连接运算产生新String对象
System out println(hell0 == ("Hel"+lo).intern()); // true 查找常量池是否有此字符串,有返回,无放进去,之前已定义intern返回同一个String实例

3. Java中的null如何理解?

null看起来是关键字,但从技术上讲,它仅仅是空字面常量,表示空引用。像true/false也只是布尔字面常量。

如何理解Java程序使用Unicode字符集编写的更多相关文章

  1. java程序实现Unicode码和中文互相转换

      根据前一篇的补充问题http://blog.csdn.net/fancylovejava/article/details/10142391 有了前一篇文章的了解,大概了解了unicode编码格式了 ...

  2. 从零自学Java-2.初步理解Java程序使如何工作的

    1.学习Java应用程序是如何工作的 2.构成一个应用程序 3.向应用程序传递参数 4.学习Java程序是如何组织的 5.在应用程序中创建一个对象 程序Root:输出225的正平方根 package ...

  3. Java笔记:编写第一个Java程序

    2017.6.17 1.编写第一个Java程序 创建text文本,命名第一个Java程序.txt 在里面编写Java代码 public class Demo1{ public static void ...

  4. 《深入理解java虚拟机》笔记

    二.java内存区域与内存溢出异常 0.在内存管理领域,java与c/c++不同的是,在java虚拟机自动内存管理机制下,java不需要手动去为对象写配对的free内存的代码,不容易出现内存泄漏和内存 ...

  5. 【Java】《Java程序设计基础教程》第一章学习

    一.Java概述 1.介绍了Java语言的由来 2.Java语言的特点:简单.面向对象.分布式.高效解释执行.健壮.安全.结构中立.可移植.高效率.多线程.动态 3.Java语言的实现机制,引入虚拟机 ...

  6. Unicode字符集,utf8编码,base64编码简单了解

    Unicode字符集,utf8编码,base64编码简单了解 Unicode字符集,ASCII,GB2312编码集合等,类似于不同的字典,不同的字符的编码,类似于字典中的字在哪一个页哪一排. 当不同系 ...

  7. [刘阳Java]_第一个Java程序_第7讲

    1. 其实第一个Java程序是很简单,但是当自己编写第一个Java程序时候需要注意如下几个内容: 理解Java程序的运行环境 校验你的Java环境变量是否能够运行你所写的第一个Java程序 理解Jav ...

  8. Java程序设计基础笔记 • 【第1章 初识Java】

    全部章节   >>>> 本章目录 1.1 程序的概念及Java语言介绍 1.1.1 生活中的程序 1.1.2 计算机程序 1.1.3 算法和流程图 1.1.4 实践练习 1.2 ...

  9. java基础学习02(简单的java程序)

    简单的java程序 一.完成的目标 1. 理解java程序的基本组成 2. 如何对程序代码进行注释 3. java标识符的命名规则 4. 了解java中的关键字 5. 使用java定义变量或声明变量 ...

随机推荐

  1. 解决pip安装模块报错Cannot fetch index base URL http://pypi.python.org/simple/

    产生这个问题的原因呢和github一样,因为他们用的cdn被墙.经小伙伴反馈,解决办法如下. 通过指定国内镜像源来安装: pip --trusted-host 镜像源 install 模块名 -i 镜 ...

  2. dm8148 开发之---IDR帧

    IDR帧属于I帧. 解码器收到IDR帧时,将所有的参考帧队列丢弃(用x264_reference_reset函 数实现——在encoder.c文件中).这点是所有I帧共有的特性,但是收到IDR帧 时, ...

  3. 利用GetPrivateProfileString读取ini文件的字段

    //INIClass读取类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  4. Android 最新L版本,都更新什么东西了

    Android L版本重大修改 一:New Android Runtime (ART) 新的运行环境,4.4一下的版本ART是可选的运行环境,默认还是Dalvik.但是在Android L版本之后默认 ...

  5. filter和find区别,元素遍历

    转 filter和find区别 find()会在当前指定元素中查找符合条件的子元素,是对它的子集操作,而filter()则是在当前指定的元素集合中查找符合条件的元素,是对自身集合元素进行筛选. HTM ...

  6. Kotlin——中级篇(三):可见性修饰符详解

    在Kotlin中,不管是类,对象,接口,构造函数,函数,属性及其设置器都具有可见性修饰符.Kotlin中的可见性修饰符共四种.即public.protected.private.internal.在不 ...

  7. 用SQL语句生成唯一标识

    以前都是在代码中生成GUID值,然后保存到数据库中去,今天发现用sql也能生成GUID值,觉得很新奇,所以记下来. sellect newid();  //得到的即为GUID值 此sql内置函数返回的 ...

  8. 《挑战程序设计竞赛》2.2 贪心法-区间 POJ2376 POJ1328 POJ3190

    POJ2376 Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14585   Accepte ...

  9. Brouwer fixed-point theorem

    w https://en.wikipedia.org/wiki/Brouwer_fixed-point_theorem https://zh.wikipedia.org/wiki/布劳威尔不动点定理 ...

  10. iOS 关于多线程的一些基本概念

    一 什么是进程 进程是在系统中正在运行的应用程序!普通的应用程序并不是进程,只有正在运行的应用程序才是一个进程, 在系统中每个进程之间是相互独立的,每个进程均在其专享的且受保护的内存空间内.但是一个应 ...