优秀的编程知识分享平台

网站首页 > 技术文章 正文

java char与int和字符之间的简单理解

nanyue 2024-07-23 13:46:55 技术文章 12 ℃

有时候我们会发现,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。代码如下:

public class HashUtils {

    public static void main(String[] args) {
        char a = '哈';
        System.out.println(Integer.toBinaryString((int)a));
        System.out.println((int)a);
        System.out.println(a+5);
    }

结果如下:

101010011001000
21704
21709

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

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

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

Tags:

最近发表
标签列表