java-String

String

表示字符串,所有java程序中的字符串文字 如{@code “abc”} 作为该类的实例实现。

String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象”。

new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址(注意,此时不需要从堆中复制到池中,否则,将使得堆中的字符串永远是池中的子集,导致浪费池的空间)!

对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

使用字符串常量池。每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串

字符串是常数;它们的值在它们之后不能改变。
字符串缓冲区支持可变字符串。
因为字符串对象是不可变的,所以它们可以被共享
例如

  String str = "abc";

等同于

   char data[] = {'a', 'b', 'c'};
      String str = new String(data);
   System.out.println("abc");
 *     String cde = "cde";
 *     System.out.println("abc" + cde);
 *     String c = "abc".substring(2,3);
 *     String d = cde.substring(1, 2);

包含检查序列的单个字符的方法 比较字符串 搜索 提取子字符串
创建字符串的复制 字符大小写转换
大小写转换是基于Unicode标准版本的
由 {@link java.lang.Character Character}类指定

Java语言为字符串提供特殊支持级联运算符+
并用于转换其他对象到字符串
{@code StringBuilder}(or {@code StringBuffer})实现字符串连接
{@code append}追加方法

String变换是实现 通过 {@code toString}, {@code Object} 定义的

除非另有说明 否则 将null参数传递给构造函数
或者该类中的方法 将导致NullPointerException

{@code String} 代表UTF-16格式的字符串 辅助字符由代理表示配对

索引值是指 {@code char} 代码单元
因此一个补充字符用两个位置在String中,

String 类提供方法处理Unicode code points (i.e., characters),
除了那些处理Unicode code units (i.e., {@code char} values).

CharSequence
一个可读的char 序列这个接口提供多种不同类型的统一、只读访问。
char值代表Basic
* Multilingual Plane (BMP) 字符或者代理。
*
这个接口不定义通用的规范 {@link
* java.lang.Object#equals(java.lang.Object) equals} and {@link
* java.lang.Object#hashCode() hashCode}
* 比较两个实现CharSequence对象的结果 未定义
* 每个对象可以由不同的类实现,并且在那里不能保证每个类都能够测试它的实例和其他的相等性。
*所以不应当使用CharSequence实例作为set的元素或map的keys

CharSet

十六位Unicode代码单元和字节序列之间的命名映射。该类定义了创建解码器和编码器的方法,以及用于检索与字符集相关联的各种名称的方法。这个类的实例是不可变的。
该类还定义了静态方法,用于测试特定的字符集是否被支持,用于按名称定位字符集实例,以及构造包含当前Java虚拟机中可用的支持的每个字符集的映射。支持新的字符集可以通过在 {@link * java.nio.charset.spi.CharsetProvider}类中定义的服务提供者接口来添加。这个类中定义的所有方法对于多个并发线程都是安全的。

CharSet通过字符串由下面的字符串组成:

The uppercase letters 'A' through 'Z' * ('\u0041' through '\u005a'), * *
The lowercase letters 'a' through 'z' * ('\u0061' through '\u007a'), * *
The digits '0' through '9' * ('\u0030' through '\u0039'), * *
The dash character '-' * ('\u002d', HYPHEN-MINUS), * *
The plus character '+' * ('\u002b', PLUS SIGN), * *
The period character '.' * ('\u002e', FULL STOP), * *
The colon character ':' * ('\u003a', COLON), and * *
The underscore character '_' * ('\u005f', LOW LINE). * *

字符集名称必须以字母或数字开头
空字符串不是合法的字符集名称。字符集名称不区分大小写;也就是说,在比较字符集名称时,总是忽略情况。字符集名称通常遵循RFC 2278中记录的约定:IANA字符集*注册过程。

每个字符集都有一个规范名称,也可能有一个或多个别名。规范名称由该类的{@link #name() name} 返回。按惯例,规范名称通常是大写字母。字符集的别名由 {@link #aliases() aliases} * 返回

一些字符集有一个历史名称,用于定义与Java平台的以前版本的兼容性。字符集的历史名称要么是它的规范名称,要么是它的别名。
历史名称由{@link java.io.InputStreamReader#getEncoding InputStreamReader} and {@link * java.io.OutputStreamWriter#getEncoding OutputStreamWriter}类的
getEncoding() 方法返回

如果IANA字符集注册表中列出的字符集是由Java平台的实现支持的,那么它的规范名称必须是注册表中列出的名称。许多字符集在注册表中被赋予不止一个名称,这种情况下,注册表将其中一个名称识别为MIME首选。
如果字符集比一个注册表名多,那么它的规范名称必须是MIME首选名,注册表中的其他名称必须是有效别名。如果一个支持的字符集没有在IANA注册表中列出,那么它的规范名必须从字符串“X”或“X”中的一个开始。

IANA字符集注册表随着时间的推移而改变,因此特定字符集的规范名称和别名也可能随着时间而改变。为了确保兼容性,建议不要将任何别名从字符集中删除,如果字符集的规范名发生更改,则将其前面的规范名变为别名。

标准字符集

Java平台的每一个实现都需要支持下面的标准字符集。请参考您的实现的发布文档,以查看是否支持其他字符集。这样的可选字符集的行为可能在实现之间有所不同。
字符集描述


Charset Description
US-ASCII    Seven-bit ASCII, a.k.a. ISO646-US, * a.k.a. the Basic Latin block of the Unicode character set
ISO-8859-1      ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
UTF-8   Eight-bit UCS Transformation Format
UTF-16BE    Sixteen-bit UCS Transformation Format, * big-endian byte order
UTF-16LE    Sixteen-bit UCS Transformation Format, * little-endian byte order
UTF-16  Sixteen-bit UCS Transformation Format, * byte order identified by an optional byte-order mark

UTF-8字符集由RFC 2279指定;基于它的转换格式在ISO 1064 6-1的修订2中指定,并且在Unicode 标准中也被描述。*

UTF 16字符集由RFC 2781指定;基于它们的转换格式在ISO 1064 6-1的修订1中指定,并且也在Unicode 标准中描述。

UTF 16字符集使用十六位的数量,因此对字节顺序敏感。在这些编码中,A*流的字节顺序可以用由Unicode字符“UFFEF”表示的初始字节顺序标记来表示。字节顺序标记处理如下
当解码时,UTF 16BE和UTF 16LE字符集将初始字节顺序标记解释为零宽度不中断空间;当编码时,它们不写入字节顺序标记。

当解码时,UTF 16字符集在输入流的开头处解释字节顺序标记,以指示流的字节顺序,但如果没有*字节顺序标记,则默认为大字节,当编码时,它使用大Endiad字节顺序并写入大字节字节顺序标记。

在任何情况下,在输入序列的第一个元素之后出现的字节顺序标记都不被省略,因为相同的代码被用来表示*0宽度的非破坏空间。

Java虚拟机的每个实例都有缺省字符集,它可能是标准字符集的一部分,也可能不是标准字符集之一。默认的字符集是在虚拟机启动期间确定的,通常取决于底层操作系统所使用的区域设置和字符集。

{@link StandardCharsets} 类为每个标准字符集定义常量。

术语

这个类的名称取自RFC 2278中使用的术语。在该文档中,字符集被定义为一个或多个编码字符集和字符编码方案的组合。(这个定义令人困惑;其他一些软件系统将*字符集定义为编码字符集的同义词)。

编码字符集是一组抽象字符和一组整数之间的映射。US-ASCII, ISO 8859-1, * JIS X 0201, and Unicode 是编码字符集的示例

有些标准将字符集定义为简单的一组抽象字符,而没有相关的分配编号。
字母表就是这样一个字符集的一个例子。然而,字符集和编码字符集之间的细微区别在实践中很少使用前者已经成为后者的一种简短形式,包括在Java API规范中。

字符编码方案是在一个或多个编码字符集和一组八位字节(八位字节)序列之间的映射。 UTF-8, UTF-16, ISO 2022, and EUC。是字符编码方案的例子。编码方案通常与特定的编码字符集相关联;例如,UTF-8仅用于对Unicode进行编码。然而,一些方案与多个编码的字符集相关联;例如,EUC可以用于编码各种亚洲编码字符集中的字符。

当编码字符集专用于单个字符编码方案时,相应的字符集通常被命名为编码字符集;
否则,字符集通常被命名为编码方案,并且可能是其所支持的编码字符集的区域。
Hence U-ASCII既是编码字符集的名称,又是编码字符集的字符集。EUC-JP
则是字符集的名称,该字符集编码了日语的JIS X 0201、JIS X 0208和JIS X 0212编码字符集

Java编程语言的本地字符编码是UTF 16。因此,Java平台中的字符集定义了十六位UTF 16代码单元(即字符序列)和字节序列之间的映射。

猜你喜欢

转载自blog.csdn.net/qq_16038125/article/details/80898071