java数据类型

java数据类型

java是一种强类型语言,一共有8大基本类型,其中4种整形,2种浮点型、1种字符类型char(用于表示unicode单元)和一种布尔类型

整型

​ 整型用于表示没有小数部分的数值,允许是负数。java提供了4种整型:

类型 存储需求 取值范围
byte 1字节 -127 ~128
short 2字节 -32768 ~ 32767
int 4字节 -2147483648 ~ 2147483647 (刚刚超过20亿)
long 8字节 -9223372036854775808 ~ 9223372036854775807
  • java中整型的范围与java代码的机器没有关系。
  • 长整型数值有一个后缀L或l。十六进制数值有一个前缀0x0X(如0xCAFE).八进制有一个前缀0,例如,010对应10进制为8.很显然,八进制表示法比较容易混淆,所以建议不要使用八进制常数
  • java7开始,加上前缀0b或者0B就可以写二进制数。例如,0b1001就是9.另外,同样是从java7开始,还可以为数字字面量加下划线,如用1_000_000表示100万。这些下划线会便于读取。java编译器会去掉下划线

浮点类型

浮点类型用于表示有小数点部分的数值

类型 存储需求 取值范围
float 4字节 大约+- 3.40282347E+38F(有效位数为6-7位)
double 8字节 大约+- 1.79769313486231570E + 308(有效位数位15位)

double表示这种类型的数值精度是float类型的两倍(有人称之为双精度数值)。在很多情况下,float类型的精度(6-7位有效数值)并不能满足要求。实际上,只有很少的情况适合使用float类型,例如,需要单精度数的库,或者需要存储大量数据时。

float类型的数值有一个后缀F或f(例如:3.14F)

可以使用十六进制表示浮点数的值。例如,0.125=2**-3;可以表示位为0x1.0p-3.在十六进制表示法中,使用p表示指数,而不是e(e是一个十六进制数位。)注意,尾数采用十六进制,指数采用十进制。指数的基数是2,而不是10.

所有的浮点数都遵循IEEE754规范。具体来说,下面是用于表示溢出和出错情况的三种特殊的浮点数值

  • 正无穷大
  • 负无穷大
  • NAN不是一个数字

例如,一个正数除以0的结果为正无穷大。计算0/0或者负数的平方根结果为NAN

注释:常量Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITYDouble.NaN分别表示这三种情况

但是要注意不能如下检测一个特定值是否等于Double.NaN

if(x==Double.NaN)// is never true

所有“非数值”的值都认为是不相同的。不过可以用下面这种方式

if(Double.isNaN(x))

char类型

​ char类型原本表示单个字符。不过,现在情况已经有所变化。如今,有些Unicode字符可以用一个char值来描述,另外一些Unicode

字符可以用一个char值描述,另外一些Unicode字符则需要两个char值。

​ char类型的字面量值要用单引号括起来。例如:’A’是编码值为65的字符常量。它与“A”不同,“A”是一个字符串。char类型的值可以表示为十六进制值,其范围从\u0000\uFFFF.例如,\u2122表示商标符号(TM),\u03c0表示希腊字母π

对照表如下:

U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
0010 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
0020 ! " # $ % & ' ( ) * + , - . /
0030 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
0040 @ A B C D E F G H I J K L M N O
0050 P Q R S T U V W X Y Z [ \ ] ^ _
0060 ` a b c d e f g h i j k l m n o
0070 p q r s t u v w x y z { | } ~ DEL
0080 PAD HOP BPH NBH IND NEL SSA ESA HTS HTJ VTS PLD PLU RI SS2 SS3
0090 DCS PU1 PU2 STS CCH MW SPA EPA SOS SGCI SCI CSI ST OSC PM APC
00A0 NBSP ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ SHY ® ¯
00B0 ° ± ² ³ ´ µ · ¸ ¹ º » ¼ ½ ¾ ¿
00C0 À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
00D0 Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
00E0 à á â ã ä å æ ç è é ê ë ì í î ï
00F0 ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0100 Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď
0110 Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ
0120 Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į
0130 İ ı IJ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ
0140 ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ō ō Ŏ ŏ
0150 Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş
0160 Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů
0170 Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ
0180 ƀ Ɓ Ƃ ƃ Ƅ ƅ Ɔ Ƈ ƈ Ɖ Ɗ Ƌ ƌ ƍ Ǝ Ə
0190 Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ ƙ ƚ ƛ Ɯ Ɲ ƞ Ɵ
01A0 Ơ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư
01B0 ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ
01C0 ǀ ǁ ǂ ǃ DŽ Dž dž LJ Lj lj NJ Nj nj Ǎ ǎ Ǐ
01D0 ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ
01E0 Ǡ ǡ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ
01F0 ǰ DZ Dz dz Ǵ ǵ Ƕ Ƿ Ǹ ǹ Ǻ ǻ Ǽ ǽ Ǿ ǿ
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0200 Ȁ ȁ Ȃ ȃ Ȅ ȅ Ȇ ȇ Ȉ ȉ Ȋ ȋ Ȍ ȍ Ȏ ȏ
0210 Ȑ ȑ Ȓ ȓ Ȕ ȕ Ȗ ȗ Ș ș Ț ț Ȝ ȝ Ȟ ȟ
0220 Ƞ ȡ Ȣ ȣ Ȥ ȥ Ȧ ȧ Ȩ ȩ Ȫ ȫ Ȭ ȭ Ȯ ȯ
0230 Ȱ ȱ Ȳ ȳ ȴ ȵ ȶ ȷ ȸ ȹ Ⱥ Ȼ ȼ Ƚ Ⱦ ȿ
0240 ɀ Ɂ
0250 ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɗ ɘ ə ɚ ɛ ɜ ɝ ɞ ɟ
0260 ɠ ɡ ɢ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ
0270 ɰ ɱ ɲ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ
0280 ʀ ʁ ʂ ʃ ʄ ʅ ʆ ʇ ʈ ʉ ʊ ʋ ʌ ʍ ʎ ʏ
0290 ʐ ʑ ʒ ʓ ʔ ʕ ʖ ʗ ʘ ʙ ʚ ʛ ʜ ʝ ʞ ʟ
02A0 ʠ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ ʩ ʪ ʫ ʬ ʭ ʮ ʯ
02B0 ʰ ʱ ʲ ʳ ʴ ʵ ʶ ʷ ʸ ʹ ʺ ʻ ʼ ʽ ʾ ʿ
02C0 ˀ ˁ ˂ ˃ ˄ ˅ ˆ ˇ ˈ ˉ ˊ ˋ ˌ ˍ ˎ ˏ
02D0 ː ˑ ˒ ˓ ˔ ˕ ˖ ˗ ˘ ˙ ˚ ˛ ˜ ˝ ˞ ˟
02E0 ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩ ˪ ˫ ˬ ˭ ˮ ˯
02F0 ˰ ˱ ˲ ˳ ˴ ˵ ˶ ˷ ˸ ˹ ˺ ˻ ˼ ˽ ˾ ˿
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0300 ̀ ́ ̂ ̃ ̄ ̅ ̆ ̇ ̈ ̉ ̊ ̋ ̌ ̍ ̎ ̏
0310 ̐ ̑ ̒ ̓ ̔ ̕ ̖ ̗ ̘ ̙ ̚ ̛ ̜ ̝ ̞ ̟
0320 ̠ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯
0330 ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿
0340 ̀ ́ ͂ ̓ ̈́ ͅ ͆ ͇ ͈ ͉ ͊ ͋ ͌ ͍ ͎ CGJ
0350 ͐ ͑ ͒ ͓ ͔ ͕ ͖ ͗ ͘ ͙ ͚ ͛ ͜ ͝ ͞ ͟
0360 ͠ ͡ ͢ ͣ ͤ ͥ ͦ ͧ ͨ ͩ ͪ ͫ ͬ ͭ ͮ ͯ
0370 ʹ ͵ ͺ ;
0380 ΄ ΅ Ά · Έ Ή Ί Ό Ύ Ώ
0390 ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο
03A0 Π Ρ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί
03B0 ΰ α β γ δ ε ζ η θ ι κ λ μ ν ξ ο
03C0 π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ
03D0 ϐ ϑ ϒ ϓ ϔ ϕ ϖ ϗ Ϙ ϙ Ϛ ϛ Ϝ ϝ Ϟ ϟ
03E0 Ϡ ϡ Ϣ ϣ Ϥ ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ
03F0 ϰ ϱ ϲ ϳ ϴ ϵ ϶ Ϸ ϸ Ϲ Ϻ ϻ ϼ Ͻ Ͼ Ͽ
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0400 Ѐ Ё Ђ Ѓ Є Ѕ І Ї Ј Љ Њ Ћ Ќ Ѝ Ў Џ
0410 А Б В Г Д Е Ж З И Й К Л М Н О П
0420 Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
0430 а б в г д е ж з и й к л м н о п
0440 р с т у ф х ц ч ш щ ъ ы ь э ю я
0450 ѐ ё ђ ѓ є ѕ і ї ј љ њ ћ ќ ѝ ў џ
0460 Ѡ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ Ѫ ѫ Ѭ ѭ Ѯ ѯ
0470 Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ Ѿ ѿ
0480 Ҁ ҁ ҂ ҃ ҄ ҅ ҆ ҈ ҉ Ҋ ҋ Ҍ ҍ Ҏ ҏ
0490 Ґ ґ Ғ ғ Ҕ ҕ Җ җ Ҙ ҙ Қ қ Ҝ ҝ Ҟ ҟ
04A0 Ҡ ҡ Ң ң Ҥ ҥ Ҧ ҧ Ҩ ҩ Ҫ ҫ Ҭ ҭ Ү ү
04B0 Ұ ұ Ҳ ҳ Ҵ ҵ Ҷ ҷ Ҹ ҹ Һ һ Ҽ ҽ Ҿ ҿ
04C0 Ӏ Ӂ ӂ Ӄ ӄ Ӆ ӆ Ӈ ӈ Ӊ ӊ Ӌ ӌ Ӎ ӎ
04D0 Ӑ ӑ Ӓ ӓ Ӕ ӕ Ӗ ӗ Ә ә Ӛ ӛ Ӝ ӝ Ӟ ӟ
04E0 Ӡ ӡ Ӣ ӣ Ӥ ӥ Ӧ ӧ Ө ө Ӫ ӫ Ӭ ӭ Ӯ ӯ
04F0 Ӱ ӱ Ӳ ӳ Ӵ ӵ Ӷ ӷ Ӹ ӹ
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0500 Ԁ ԁ Ԃ ԃ Ԅ ԅ Ԇ ԇ Ԉ ԉ Ԋ ԋ Ԍ ԍ Ԏ ԏ
0510
0520
0530 Ա Բ Գ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ
0540 Հ Ձ Ղ Ճ Մ Յ Ն Շ Ո Չ Պ Ջ Ռ Ս Վ Տ
0550 Ր Ց Ւ Փ Ք Օ Ֆ ՙ ՚ ՛ ՜ ՝ ՞ ՟
0560 ա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ
0570 հ ձ ղ ճ մ յ ն շ ո չ պ ջ ռ ս վ տ
0580 ր ց ւ փ ք օ ֆ և ։ ֊
0590 ֑ ֒ ֓ ֔ ֕ ֖ ֗ ֘ ֙ ֚ ֛ ֜ ֝ ֞ ֟
05A0 ֠ ֡ ֢ ֣ ֤ ֥ ֦ ֧ ֨ ֩ ֪ ֫ ֬ ֭ ֮ ֯
05B0 ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֻ ּ ֽ ־ ֿ
05C0 ׀ ׁ ׂ ׃ ׄ ׅ ׆ ׇ
05D0 א ב ג ד ה ו ז ח ט י ך כ ל ם מ ן
05E0 נ ס ע ף פ ץ צ ק ר ש ת
05F0 װ ױ ײ ׳ ״
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0600 ؋ ، ؍ ؎ ؏
0610 ؐ ؑ ؒ ؓ ؔ ؕ ؛ ؞ ؟
0620 ء آ أ ؤ إ ئ ا ب ة ت ث ج ح خ د
0630 ذ ر ز س ش ص ض ط ظ ع غ
0640 ـ ف ق ك ل م ن ه و ى ي ً ٌ ٍ َ ُ
0650 ِ ّ ْ ٓ ٔ ٕ ٖ ٗ ٘ ٙ ٚ ٛ ٜ ٝ ٞ
0660 ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ٪ ٫ ٬ ٭ ٮ ٯ
0670 ٰ ٱ ٲ ٳ ٴ ٵ ٶ ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ
0680 ڀ ځ ڂ ڃ ڄ څ چ ڇ ڈ ډ ڊ ڋ ڌ ڍ ڎ ڏ
0690 ڐ ڑ ڒ ړ ڔ ڕ ږ ڗ ژ ڙ ښ ڛ ڜ ڝ ڞ ڟ
06A0 ڠ ڡ ڢ ڣ ڤ ڥ ڦ ڧ ڨ ک ڪ ګ ڬ ڭ ڮ گ
06B0 ڰ ڱ ڲ ڳ ڴ ڵ ڶ ڷ ڸ ڹ ں ڻ ڼ ڽ ھ ڿ
06C0 ۀ ہ ۂ ۃ ۄ ۅ ۆ ۇ ۈ ۉ ۊ ۋ ی ۍ ێ ۏ
06D0 ې ۑ ے ۓ ۔ ە ۖ ۗ ۘ ۙ ۚ ۛ ۜ ۝ ۞ ۟
06E0 ۠ ۡ ۢ ۣ ۤ ۥ ۦ ۧ ۨ ۩ ۪ ۫ ۬ ۭ ۮ ۯ
06F0 ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۺ ۻ ۼ ۽ ۾ ۿ
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0700 ܀ ܁ ܂ ܃ ܄ ܅ ܆ ܇ ܈ ܉ ܊ ܋ ܌ ܍
0710 ܐ ܑ ܒ ܓ ܔ ܕ ܖ ܗ ܘ ܙ ܚ ܛ ܜ ܝ ܞ ܟ
0720 ܠ ܡ ܢ ܣ ܤ ܥ ܦ ܧ ܨ ܩ ܪ ܫ ܬ ܭ ܮ ܯ
0730 ܰ ܱ ܲ ܳ ܴ ܵ ܶ ܷ ܸ ܹ ܺ ܻ ܼ ܽ ܾ ܿ
0740 ݀ ݁ ݂ ݃ ݄ ݅ ݆ ݇ ݈ ݉ ݊ ݍ ݎ ݏ
0750 ݐ ݑ ݒ ݓ ݔ ݕ ݖ ݗ ݘ ݙ ݚ ݛ ݜ ݝ ݞ ݟ
0760 ݠ ݡ ݢ ݣ ݤ ݥ ݦ ݧ ݨ ݩ ݪ ݫ ݬ ݭ
0770
0780 ހ ށ ނ ރ ބ ޅ ކ އ ވ މ ފ ދ ތ ލ ގ ޏ
0790 ސ ޑ ޒ ޓ ޔ ޕ ޖ ޗ ޘ ޙ ޚ ޛ ޜ ޝ ޞ ޟ
07A0 ޠ ޡ ޢ ޣ ޤ ޥ ަ ާ ި ީ ު ޫ ެ ޭ ޮ ޯ
07B0 ް ޱ
07C0
07D0
07E0
07F0
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0800
0810
0820
0830
0840
0850
0860
0870
0880
0890
08A0
08B0
08C0
08D0
08E0
08F0
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0900
0910
0920
0930 ि
0940
0950
0960
0970
0980
0990
09A0
09B0 ি
09C0
09D0
09E0
09F0
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0A00
0A10
0A20
0A30 ਿ
0A40
0A50
0A60
0A70
0A80
0A90
0AA0
0AB0 િ
0AC0
0AD0
0AE0
0AF0
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0B00
0B10
0B20
0B30 ି
0B40
0B50
0B60
0B70
0B80
0B90
0BA0
0BB0 ி
0BC0
0BD0
0BE0
0BF0
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0C00
0C10
0C20
0C30 ి
0C40
0C50
0C60
0C70
0C80
0C90
0CA0
0CB0 ಿ
0CC0
0CD0
0CE0
0CF0
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0D00
0D10
0D20
0D30 ി
0D40
0D50
0D60
0D70
0D80
0D90
0DA0
0DB0
0DC0
0DD0
0DE0
0DF0
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0E00
0E10
0E20
0E30 ฿
0E40
0E50
0E60
0E70
0E80
0E90
0EA0
0EB0
0EC0
0ED0
0EE0
0EF0
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
0F00
0F10
0F20
0F30 ༿
0F40
0F50
0F60
0F70 ཿ
0F80
0F90
0FA0
0FB0 ྿
0FC0
0FD0
0FE0
0FF0
  • 特殊字符的转义序列
转义序列 名称 Unicode值
\b 退格 `u0008`
\t 制表 `u0009`
\n 换行 `u000a`
\r 回车 `u000d`
\" 双引号 `u0022`
\' 单引号 `u0027`
\\ 反斜杠 `u005c`

警告: Unicode转义序列会在解析代码之前得到处理,如,”\u0022+\u0022”并不是一个由引号(U+0022)包围加号构成的字符串。实际上,\u0022会在解析之前转换为“,这会得到” “+“ ”,也就是一个空串,更隐秘地,一定要小心注释中的\u.注释

// \u000A is a newline

会产生一个错误语法,因为读程序时\u00A0会替换为一个换行符。类似的,下面这个注释

// look inside c:\users

也会产生一个语法错误,因为\u后面并没有跟着4个16进制数

Unicode和char类型

​ 要想弄清char类型,就必须了解Unicode编码机制。Unicode打破了传统字符编码机制的限制。在Unicode出现之前,已经有许多种不同的标准:美国的ASCII、西欧语言中的ISO 8859—1、俄罗斯的KOI—8、中国的GB 18030和BIG—5等。这样就产生了下面两个问题:一个是对于任意给定的代码值,在不同的编码方案下有可能对应不同的字母;二是采用大字符集的语言其编码长度有可能不同。例如,有些常用的字符采用单字节编码,而另一些字符则需要两个或多个字节。

​ 设计 Unicode 编码的目的就是要解决这些问题。在20世纪80年代开始启动统一工作时,人们认为两个字节的代码宽度足以对世界上各种语言的所有字符进行编码,并有足够的空间留给未来扩展,当时所有人都这么想。在1991年发布了Unicode 1.0,当时仅占用65536个代码值中不到一半的部分。在设计Java时决定采用16位的Unicode字符集,这比使用8位字符集的其他程序设计语言有了很大的改进。

十分遗憾的是,经过一段时间后,不可避免的事情发生了。Unicode字符超过了65 536个,其主要原因是增加了大量的汉语、日语和韩语中的表意文字。现在,16位的char类型已经不能满足描述所有Unicode字符的需要了。

下面利用一些专用术语来解释Java语言从Java5开始如何解决这个问题。码点codepoint是指与一个编码表中的某个字符对应的代码值。在Unicode标准中,码点采用十六进制书写,并加上前缀U+,例如U+0041就是拉丁字母A的码点。Unicode的码点可以分成17个代码平面(code plane)。第一个代码平面称为基本多语言平面(basic multilingual plane),包 括码点从U+0000U+FFFF的“经典”Unicode代码;其余的16个平面的码点为从U+10000到U+10FFFF,包括辅助字符(supplementary character)。

UTF—16编码采用不同长度的编码表示所有Unicode码点。在基本多语言平面中,每个字符用16位表示,通常称为代码单元(code unit);而辅助字符编码为一对连续的代码单元。采用这种编码对表示的各个值落人基本多语言平面中未用的2048个值范围内,通常称为替代区域(surrogate area)U+D800U+DBFF用于第一个代码单元,U+DC00U+DFFF用于第二个代码单 元)。这样设计十分巧妙,我们可以从中迅速知道一个代码单元是一个字符的编码,还是一个辅助字符的第一或第二部分。例如: 𝕆是八元数集的一个数学符号,码点为U+1D546,编码为两个代码单元U+D835和U+DD46

System.out.println("\uD835\uDD46");𝕆

java中,char类型描述了UTF-16中的一个代码单元

强烈建议不要使用char类型,除非确实需要处理UTF-16代码单元。最好将字符串作为抽象数据类型处理

码点和代码单元 String

java字符串由char值序列组成,char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元。最常用的Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。

public static void main(String[] args) {
        //hello𝕆
        String s = "hello\uD835\uDD46";
        //获取实际长度 7
        System.out.println(s.length());
        //获取码点数量 6
        System.out.println(s.codePointCount(0, s.length()));
        //获取𝕆的第一个和第二代码单元 ? ?
        System.out.println(s.charAt(5)+" "+s.charAt(6));
        //获取指定索引位置的码点 获取𝕆的索引 5
        int index = s.offsetByCodePoints(0, 5);
        // 120134
        System.out.println(s.codePointAt(index));
        //循环获取代码点 第一种方式
        int i = 0;
        while(i<s.codePointCount(0,s.length())) {
            int codePointAt = s.codePointAt(i);
            //判断是否为辅助字符
            if (Character.isSupplementaryCodePoint(codePointAt)) {
                i += 2;
            } else {
                i++;
            }
            System.out.println(codePointAt);
        }
        // 第二种方式 : 将码点转为数组 遍历获取所有的码点
        int[] ints = s.codePoints().toArray();
        for (int i1 : ints ) {
            System.out.println(i1);
        }
        //将码点数组转换为字符串 hello𝕆
        String str = new String(ints, 0, ints.length);
        System.out.println(str);
    }

注释: 虚拟机不一定把字符串时实现为代码单元序列。在java9中,只包含单字节代码单元的字符串使用byte数组实现,所有其他字符串使用char数组

关于java9中采用byte[]的好处 https://www.zhihu.com/question/447224628

posted @ 2021-06-02 17:15  錵開や落幕  阅读(318)  评论(0编辑  收藏  举报