Character类是一个包装类。

char这种数据类型是基于原始的Unicode编码的,储存一个char用16个bit,因此定义characters也是16位定长的实体集合。

Unicode编码标准发生了变化,数量级从\uFFFF到了\u10FFFF

对Unicode标准中的所有字符,16位已经是不够的了,即一部分字符并不能通过char来表示了。

我们称\u0000 to \uFFFF的字符集合,也就是用一个char能够表示的字符的集合,为the Basic Multilingual Plane (BMP)(基本字符)。

而称码点(code point)大于\uFFFF的字符集合为supplementary characters(补充字符)。

为了解决补充字符表示的问题,首先想到的是基本数据类型int,一个int对象占了32bit,肯定可以表达所有的字符。

但是表示基本字符,只需要16位就够了,表示一个补充字符,也只需要21位,高位的11位都为0,很浪费空间呐!

这个时候可以考虑使用到Character这个包装类了

允许一个Character的对象包装一个或者两个基本类型为char的值,补充字符就拥有了两个基本类型为char的值。

其中,高位的char的取值范围是\uD800--\uDBFF(4*16*16种),低位的char的取值范围是\uDC00--\uDFFF(4*16*16种)。

4*16*16*4*16*16==0x10*16*16*16*16,可以完整表达所有补充字符。

Character有两种构造方法,它接受不同的参数类型。

一种是char,这样自然不能实现补充字符的构造Character

另一种就是int,一个int的范围是0x00000000-0xFFFFFFFF,可以拿任意一个字符的Unicode编码值来作为参数

几个比较难懂,又可能会用到的方法介绍:

1.public static int digit(char ch,int radix)

首先基数radix必须满足在开区间[Character.MIN_RADIX ,Character.MAX_RADIX ]之内,否则直接返回-1;

Character.MIN_RADIX = 2;Character.MAX_RADIX = 36,为什么是2和36呢?

然后ch(ch会被默认转化成Character)也必须是有效的,ch怎样才算有效呢?分以下几种情况:

1.isDigit(ch)==true,也就是new Character(ch).getType(ch)==DECIMAL_DIGIT_NUMBER,也就是可能是一个数字。

数字可以有很多,‘0’--‘9’:

'\u0030' through '\u0039', ISO-LATIN-1 digits ('0' through '9')

'\u0660' through '\u0669', Arabic-Indic digits

'\u06F0' through '\u06F9', Extended Arabic-Indic digits

'\u0966' through '\u096F', Devanagari digits

'\uFF10' through '\uFF19', Fullwidth digits

2.ch是大写字母'A'('\u65')--'Z'('\u90')或者小写字母'a'('\u97')--'z'('\u122')中的一个时,A/a对应是10,依次下去Z/z对应的就是35.

但是同时对应的那个数字不能大于或者等于radix,如果大于或者等于了radix还是返回-1,否则将数字返回

3.ch是全宽大写字母'A'('\uFF21')--'Z'('\uFF3A')或者全宽小写字母'a'('\uFF41')--'z'('\uFF5A')中的一个时,A/a对应是10,依次下去Z/z对应的就是35.

但是同时对应的那个数字不能大于或者等于radix,如果大于或者等于了radix还是返回-1,否则将数字返回

public static int digit(int codePoint,int radix)本质上是一样的,只是char现在已经不能表示所有的字符了,

有些补充字符只用字符的Unicode编码值,用一个int来表示了,所以对应也用用一个int表示一个字符来传参的方法

digit('A',16)和digit(65,16)的结果是一样的。(int)'A'==65

2.public static char forDigit(int digit,int radix)

首先基数radix有效(即在开区间[2,36]内)

然后digit要有效,即0<=digit<radix(好像多少多少进制一样,最高36进制,最低二进制)

0-9分别对应的'0'-'9',10-35分别对应的小写的'a'-'z'

只有当radix和digit同时有效的时候才返回字符,否则返回'\u0000'空字符

3.public static int getNumericValue(char ch)

Returns the int value that the specified Unicode character represents.

返回指定的Unicode字符表示的int值。

For example, the character '\u216C' (the roman numeral fifty) will return an int with a value of 50.

例如,字符'\ u216C'(罗马数字50)将返回一个int 值50。

字符'0'-'9'就返回0-9

字符不管是'A'('\u65')--'Z'('\u90'),'a'('\u97')--'z'('\u122'),还是'A'('\uFF21')--'Z'('\uFF3A'),'a'('\uFF41')--'z'('\uFF5A')

都对应返回的是10-35

public static int getNumericValue(int codePoint)就是对应的用一个int表示一个字符来传参的方法

总结

简单讲其实就是,radix确定基数,确定是多少进制,从0到9,再从a到z(大小写不敏感),分别被视为0到9,10到35

像十六进制一样数字0到9表示了0-9,那9之后的10,11,12,13,14,15怎么表示呢,就把26个字母拿出来用啊。

最少是二进制(MIN_RADIX),最多是三十六(10+26=36)进制(MAX_RADIX)。

int digit(char ch,int radix)

是几进制中某一位上的字符(是数字或者字母)所对应的数字,digit('h',20)==17

char forDigit(int digit,int radix)

是几进制上数字应该用哪个字符(是数字或者字母)表示,forDigit(17,20)=='h'


原文地址:https://blog.csdn.net/lipipifighting/article/details/47321853

关于Character的digit,forDigit,getNumericValue方法的一点理解的更多相关文章

  1. rt-thread中动态内存分配之小内存管理模块方法的一点理解

    @2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...

  2. 对ContentProvider中getType方法的一点理解

    在上篇博客中我们介绍了自定义ContentProvider,但是遗漏掉了一个方法,那就是getType,自定义ContentProvider一般用不上getType方法,但我们还是一起来探究下这个方法 ...

  3. convertView&setTag方法的一点理解

    前言 首先我们要知道setTag方法是干什么的,SDK解释为 Tags Unlike IDs, tags are not used to identify views. Tags are essent ...

  4. VMware安装时Error 1324. The path My Documents contains a invalid character的原因和解决方法

    终于找到了自己想要的答案,顶顶,吼吼~ 我今天安装VMware Workstation时,总是提示我Error 1324. The path My Documents contains a inval ...

  5. SyntaxError: Non-ASCII character '\xe7' in file解决方法

    SyntaxError: Non-ASCII character '\xe7' in file 出现这种错误的原因是程序中的编码出问题了,只要在程序的最前面加上 最前面的意思是在最前面,包括在注释的前 ...

  6. java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0 *&* 解决方法

    java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0*&*^    at java. ...

  7. HDU 1061 Rightmost Digit解决问题的方法

    求大量N^N的值最右边的数字,即最低位. 它将能够解决一个简单二分法. 只是要注意溢出,只要把N % 10之后.我不会溢出,代替使用的long long. #include <stdio.h&g ...

  8. Object类clone方法的自我理解

    网上搜帖: clone()是java.lang.Object类的protected方法,实现clone方法: 1)类自身需要实现Cloneable接口 2)需重写clone()方法,最好设置修饰符mo ...

  9. 对Object类中方法的深入理解

    看一下API中关于Object的介绍: 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 那么Object中到底有哪些方法,各自有什 ...

随机推荐

  1. JS中获取URL的参数的方法

    这里,我学习的是使用正则的方法来获得URL的参数 函数的方法如下: <a href="www.baidu.com">百度</a> <script sr ...

  2. C++中字符串的长度

    定义一个字符串,求其长度: string str; str.length(); str.size();

  3. 【JZOJ4747】【NOIP2016提高A组模拟9.3】被粉碎的线段树

    题目描述 输入 第一行包括两个正整数,N ,M ,分别表示线段树的宽以及询问次数. 以下N-1 行以先序遍历(dfs深搜顺序)描述一个小R线段树,每行一个正整数表示当前非叶子节点的 mid,保证每个节 ...

  4. Asterisk 代码架构概述

    from:http://blog.csdn.net/yetyongjin/article/details/7594447 近日分析Asterisk 1.8源码.Asterisk trunk上有这篇架构 ...

  5. springmvc restful风格操作

    ssm框架 controller: package com.sgcc.controller; import java.util.ArrayList; import java.util.List; im ...

  6. linux下的远程数据库(Oracle)中文乱码问题

    适用于本地客户端(PLSQL Developer )访问远程数据库时,查询结果出现的乱码,当在远程数据库上查询结果时显示正常. 1.查询远程数据库的编码: select userenv('langua ...

  7. ASO优化经验:APP关键字优化的技巧

    当开发首款产品的时候,可能你根本连ASO是什么都不知道,因为有太多别的事情需要你做.大多数新手开发商甚至到游戏要进入Appstore的时候才知道有“关键字”这件事要去研究.正因为这些开发商几乎没有在关 ...

  8. python 内置函数补充 or 递归 or 二分法

    一.内置函数的补充 repr() 显示出字符串的官方表示形式 chr() print(chr(20013)) # 把数字编码转换成字符串 ord() print(ord('中')) # 20013 把 ...

  9. qt 利用Qtimer 定时器实现定时消息发送

    为了实现给控制器按周期发送控制指令,利用qt中的Qtimer 实现消息的定时发送. 需要进行三步处理: 1.在mainwindow.h文件中对timerEvent进行声明 public virtual ...

  10. 算法导论笔记:18B树

    磁盘作为辅存,它的容量要比内存大得多,但是速度也要慢许多,下面就是磁盘的的结构图: 磁盘驱动器由一个或多个盘片组成,它们以固定的速度绕着主轴旋转,数据存储于盘片的表面,磁盘驱动器通过磁臂末尾的磁头来读 ...