计算机提供的数据单位:变量和数组。
其他的数据结构是对这两种数据的管理;
如果是频繁的增删改查就使用LinkedList不要用ArrayList;
如果没有频繁往指定位置去插入数据,用ArrayList是可以的。
LinkedList:
算法的时间与空间:
例:a = 10; b = 20;
1.空间换时间
int temp = 0;
temp = a;
a = b;
b = temp;
新开辟了一块内存区域存储temp变量,没有计算,只是转赋值,空间换了计算的时间;
2.时间换空间
a = a+b;
b = a;
a = a-b;
指令增多,增加了计算成本,所以会耗时,但是没有多的变量了,所以是时间换空间;
HashMap
底层hash表,key-value做法;
hash冲突不能完全解决
hash中涉及到“&”运算:
在java里面这个是一个‘与’运算符,就是二进制中的 同为1才为1.
比如 x = 6&3;
6 = 0110;
3 = 0011;
x = 0010 = 2;
扩展内容:
左移运算:
在最右边补上n个0
例:6 << 1
转化6为二进制:110
左移一位:1100
左移后补一位,十进制就是 12;
如果是负数左移,负数直接被丢弃,部位0,最终结果将变成0;
右移运算:
正数高位补0,负数高位补1,低位舍弃,右移一位相当于除2,右移n位相当于除以2的n次方
例:11 >> 2
转化为2进制:0000 0000 0000 0000 1011
右移两位: 0000 0000 0000 0000 0010
将右边开始的两位移除,就变成了十进制 2 ;
#####右移负数:
计算机计算数据只会以补码的方式进行计算。
所以需要懂得原码—>反码—>补码之间的转换关系:例 :-10;
-10原码: 1000 1010 // 二进制以8位计算
-10反码: 1111 0101 //反码就是取相反的,符号位不变
-10补码: 1111 0110 //反码基础上+1
所以-10会输出: 1111 0110;
-10>>2 : 1111 1101(高位补1)
对比正数:
10>>2: 0000 0010 (高位补0)
无符号右移:
正数:和右移运算的正数右移是一样的,前面高位补充0;
正数10右移10>>>2: 0000 1010->0000 0010
负数-10右移-10>>>2:
原:0000 0000 0000 0000 0000 0000 0000 0000 1010->
反:1111 1111 1111 1111 1111 1111 1111 1111 0101 -> 右移两位,高位补0
移:0011 1111 1111 1111 1111 1111 1111 1111 1101
a>>>=b 的意思是:a = a>>>b;
总结:
负数>>和>>>都是高位补充1;
正数都是高位补充0;
只要是负数都要反算一遍,在进行进位;
'>>'比>>>负数多了一步就是在反算后+1;
public class Test {
public static void main(String[] args) {
System.out.println(Integer.toBinaryString(10));
System.out.println(Integer.toBinaryString(-10));
System.out.println(Integer.toBinaryString(10 >>> 2));
System.out.println(Integer.toBinaryString(10 >> 2));
System.out.println(Integer.toBinaryString(-10 >>> 2));
System.out.println(Integer.toBinaryString(-10 >> 2));
// 打印:
// 1010
// 1111 1111 1111 1111 1111 1111 1111 0110 //-10取反
// 10
// 10
// 0011 1111 1111 1111 1111 1111 1111 1101 //取反之后右移的,高位填充0
// 1111 1111 1111 1111 1111 1111 1111 1101 //取反之后右移的,高位填充1
}
}
网友评论