1、首先要说的是java的8大数据类型:
整数类型 | byte(1个字节) |
short(2个字节) | |
int(4个字节) | |
long(8个字节) | |
字符类型 | char(2个字节) |
浮点类型 | float(4个字节) |
double(8个字节) | |
布尔类型 | boolean(单个出现4个字节,当作int类型;在boolean数组中被当作byte,占1个字节) |
String类型具体所占字节,要根据其内容决定,一般英文字母或符号算一个字节,汉字算3个字节(utf-8编码),在Unicode码中汉字只占2个字节,其实最开始只有ACSII码,该码用8位来表示所有的英文字母和符号,后来各国纷纷推出自己的编码表,用来表示自己的文字符号,最后为了在国际上统一,提出了Unicode码,共有16位,2个字节,但是如果都用Unicode来传输数据,那么对于那些英文字符的信息,就白白浪费了一半的带宽,所以基于Unicode,又有了utf-8,而utf-8是什么呢,具体可见下方博客:字符集之在UTF-8中,一个汉字为什么需要三个字节? - 苦涩的茶 - 博客园
2、位的运算
数在计算机中都是以补码形式存在,而正数的原码、反码、补码都是一样的,负数的补码则是等于其原码取反后加1,正数和负数做加法运算时,先求出负数的补码,然后与正数做位运算,最后如果最高符号位为1,说明结果为负,需要对结果先-1再取反得到原码形式的结果,如果最高符号位为0,则说明结果为正数,不用再进行转换
3、为什么8位有符号的数取值范围为-128~127
我认为由于计算机存储的都是数的补码,而正数的补码和原码又是相同的,所以0~127就是0000 0000~0111 1111,而负数则是1111 1111(补码)~1000 0000,正好就是-1~-128
4、java是怎么实现栈和队列的
看了下ArrayQueue的源码,其内部是通过一个数组和两个索引(head和tail,初始值都为0)来实现队列和栈的,下面介绍其中个关键代码:
往队尾加元素,add(E e),e不能为null:
elements[tail]=e;
if((tail=tail+1&elements.length-1)==head){
//容量已满,扩容
doubleXXx();
}
从队首移出元素,pop():
E e=elements[head];
if(e!=null){
elements[head]=null;
head=head+1&elements.length-1;
}
从队首添加元素,addFirst(E e):
elements[head=head-1&elements.length-1]=e;
if(head==tail){
//容量已满,扩容
doubleXXx();
}