java开发知识点--备忘录
一、java基本运算
参考博文:https://my.oschina.net/joymufeng/blog/139952
http://blog.csdn.net/xiaochunyong/article/details/7748713#comments
1、java中的负数
Java采用”2的补码“(Two's Complement)编码负数,它是一种数值的编码方法,要分二步完成:第一步,每一个二进制位都取相反值,0变成1,1变成0。比如,+8的二进制编码是00001000,取反后就是11110111。第二步,将上一步得到的值加1。11110111就变成11111000。所以,00001000的2的补码就是11111000。也就是说,-8在计算机(8位机)中就是用11111000表示.
2、符合扩展sign Extension
符号扩展(Sign Extension)用于在数值类型转换时扩展二进制位的长度,以保证转换后的数值和原数值的符号(正或负)和大小相同,一般用于较窄的类型(如byte)向较宽的类型(如int)转换。扩展二进制位长度指的是,在原数值的二进制位左边补齐若干个符号位(0表示正,1表示负)。
举例来说,如果用6个bit表示十进制数10,二进制码为"00 1010",如果将它进行符号扩展为16bits长度,结果是"0000 0000 0000 1010",即在左边补上10个0(因为10是正数,符号为0),符号扩展前后数值的大小和符号都保持不变;如果用10bits表示十进制数-15,使用“2的补码”编码后,二进制码为"11 1111 0001",如果将它进行符号扩展为16bits,结果是"1111 1111 1111 0001",即在左边补上6个1(因为-15是负数,符号为1),符号扩展前后数值的大小和符号都保持不变。
其他:
int的范围是(-2的31次方到2的31次方-1) 最高位代表符号位1000 后面省略28位代表的是-2的31次方等于-2147483648
static final int NORMAL = 0xf0000000;
八进制方式,格式以0打头,例如012表示十进制10
十六进制方式,格式为0x打头,例如0xff表示十进制255 a代表10~15代表F,
0xf0000000是8位的16进制数即32位的2进制,最高四位1111代表负数,取反转之后最高四位0100就是0x10000000
16的8次方是268435456,所以0xf0000000代表-268435456
3、java的位运算
左移( << )、右移( >> )、无符号右移( >>> )、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。
左移,转换成二进制左移N位(右移动同理),正数用0补位 最小值为0, 负数用1最大值为-1。无符合右移用0补位。
& | ^ 都是转成2进制,与(相乘)、或(有一个为1就是1)、^(0和1的1,不然得0)
~ 一元操作符:操作数的第n位为1,那么结果的第n位为0,反之。
public class Test {
public static void main(String[] args) {
System.out.println(~5);//结果为-6
}
}
5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
-6转换为二进制:1111 1111 1111 1111 1111 1111 1111 1010
由位运算操作符衍生而来的有:
&= 按位与赋值
|= 按位或赋值
^= 按位异赋值
>>= 右移赋值
>>>= 无符号右移赋值
<<= 赋值左移
++n 操作之前加1,n++ 操作之后加1
和 += 一个概念而已。
二、java基本概念
1、jit,(just-in-time complier)java即时编译器,将代码编译成本地机器指令,早期的虚拟机只能用纯解释的方式执行代码。
java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
hotspot JVM 先把代码翻译成字节码(.class)文件,然后解释执行代码,同时对热点代码(比如循环)采用jit编译成本地机器指令,提高效率,也会对热点代码继续优化。
编译成本地机器码执行、解释执行,java虚拟机目前是混合mixed编译模式,即时编译和解释器混合工作模式。
参考博文:http://www.cnblogs.com/insistence/p/5901457.html 、深入理解java虚拟机
参考:http://rednaxelafx.iteye.com/blog/492667
2、volatile关键字
1、可见性 每次使用读取主内存值,可在多线程是用来做判断或者展示。
2、防止指令重排序 单例模式的dcl,成因在于JVM会优化执行代码不是按照一行行来执行。
3、保证对64位变量读写的原子性 (可忽略 JVM一般保证32位操作的原子性,不过商用JVM基本都实现了64位操作的原子性)
3、lambda表达式--尚学堂总结版本
Lambda 表达式的基础语法:Java8中引入了一个新的操作符 “->” 该操作符称为箭头操作符或 Lambda 操作符
* 箭头操作符将 Lambda 表达式拆分成两部分:
* 是对接口的匿名内部类的代替
* 左侧:Lambda 表达式的参数列表,即接口里抽象方法的参数列表
* 右侧:Lambda 表达式中所需执行的功能, 即接口里抽象方法的实现
* 同级别的变量是final
* 语法格式一:无参数,无返回值
* () -> System.out.println(“Hello Lambda!”);
* 语法格式二:有一个参数,并且无返回值
* (x) -> System.out.println(x)
* 语法格式三:若只有一个参数,小括号可以省略不写
* x -> System.out.println(x)
* 语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
* Comparator com = (x, y) -> {
* System.out.println(“函数式接口”);
* return Integer.compare(x, y);
* };
* 语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
* Comparator com = (x, y) -> Integer.compare(x, y);
* 语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
* (Integer x, Integer y) -> Integer.compare(x, y);
* 上联:左右遇一括号省
* 下联:左侧推断类型省
* 横批:能省则省
四大函数式接口:1、Consumer<T>:消费型接口void accept(T t); 2、Supplier<T>:供给型接口T get();
3、Function<T, R>:函数型接口R apply(T t); 4、Predicate<T>:断言型接口boolean test(T t);
上一篇: 数据结构学习2:查找算法之顺序查找和二分查找原理及Python实现
下一篇: 顺时针打印矩阵