Unicode 和 utf-8
都知道计算机是只能处理二进制的,在计算机的操作中,主要就是输入处理和输出,如果输入的是一个数字能够直接用一个二进制进行表示,那么如果输入的是一个字符呢,或者是一个字符数字呢
因为最先出来的计算机是处理英文的,所有定义了一个ASCll的编码表,用来表示所有的英文字母和键盘上的所有符号,所以一个ASCll码只需要一个字节就能表示。但是后来引入了中文,中文的字面量是很大的
一个字节已经远远不能满足了,所有对ASCll进行了扩充,提出了Unicode,它只是对每一个字符进行一个编码,但是他并不能很好的将这个编码在计算机里进行传输,所以提出了UTF-8,utF-8可以说是对
Unicode的一种实现,他也是在Unicode编码的基础上,对相关的二进制码在次进行编码,用来减少其在内存和磁盘中所占内存大小。
https://zhidao.baidu.com/question/55064977.html?qbl=relate_question_0&word=unicode%BA%CDutf8%B5%C4%B9%D8%CF%B5
所以如果非得说一个字符在内存占有几个字节,这个主要是根据编码方式的不同而不同的,常用的UTF-8是占据2个字节,如果太生僻的字,是可能占据三个字节的,这个在进行utf-8编码时,已经自动处理。
java 对象内存简单理解
基础数据类型,在创建的时候,先创建一个变量a,然后在内存(可能是堆,可能是栈,这里是栈中,因为在方法内)创建一个区域吧97这个值存放进去。
当在一个创建一个char类型的b时,会先去检查内存中有没有一块区域的值为97, 有,则把该块内存的地址复制给b.所以a == b; 但是当 a 指向的这块内存值改变时,
会去新的内存里存放改变的值,所以这时a != b,而且b的地址是没变的,只有a的地址值变化了。
aaa == a?
这里可以很好的证明所以数据在内存中存放的都是二进制码,或者说都是一个个的字节,所以在新建变量 aa 的时候,会发现内存中有这么一块区域的值为 97 的字节码,所以
aa 就认为这块区域就是和我要存的值一样,就把地址指向了这块区域,所以 aaa == a;
//char
char a = 97;
System.out.println("---- : " + a);// ---- : a
char b = 'a';
System.out.println(" ----b: " + b);// ----b: a
System.out.println( a == b);// true
int aa = 2;
int bb = 2;
System.out.println( aa == bb);//true
int aaa = 97;
System.out.println( a == aaa); //true