个人随笔
目录
十三、java char与int和字符之间的简单理解
2021-04-13 11:36:02

有时候我们会发现,hash函数算法里经常会将一个字符串每一个字符转成char后跟int值相加,然后来做处理,那么为什么char可以跟int相加呢,那中文char可不可以跟int相加呢?

我们知道在java语言中,int类型是一个32位的数据类型,因为其位有符号数,所以,其取值范围为:-2^31 至 2^31 - 1。而char为16位的数据,为无符号数,其范围为:0 至 2 ^ 16 -1,即0 - 65535,用十六进制码来看,则为:’\u0000’ - ‘\uffff’。再从前面引言中对于ascii码的描述,我们可以看出,无论是什么字符,在计算机中,其实也是以数字(本质为一个二进制数)的形式存储的,因此,在java中,无论是一个字符,还是一个字符型变量,实则也是一个数字,并且我们可以把范围较小的数字转换到一个范围较大的数字,如32位的int类型到64位的long是可以隐式转换的,即可以直接把一个int类型的变量赋给一个long类型的变量。当然也可以把16位的char类型转到32为的int。代码如下:

  1. public class HashUtils {
  2. public static void main(String[] args) {
  3. char a = '哈';
  4. System.out.println(Integer.toBinaryString((int)a));
  5. System.out.println((int)a);
  6. System.out.println(a+5);
  7. }

结果如下:

  1. 101010011001000
  2. 21704
  3. 21709

这里直接以中文为例,在JAVA中,中文是默认用Unicode编码是16位两个字节,而char他也是16位,所以也可以转换,’哈’对应的二进制是101010011001000,代表的10进制是21704,所以加上5就是21709.

这里举个简单的加法Hash的例子,就是用了这种转换

  1. /**
  2. * 加法Hash
  3. * @param key
  4. * @param prime 这里的prime是任意的质数,看得出,结果的值域为[0,prime-1]。
  5. * @return
  6. */
  7. public static int additiveHash(String key, int prime){
  8. int hash, i;
  9. for (hash = key.length(), i = 0; i < key.length(); i++) {
  10. hash += key.charAt(i);
  11. }
  12. return (hash % prime);
  13. }
 13

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号