java开发知识点--备忘录

来源:互联网 发布:php优势和劣势 知乎 编辑:程序博客网 时间:2024/05/01 17:37

一、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

java中我们会看到以下描述

    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虚拟机

而JavaScript属于解释型语言,这就表示每句代码只有在运行时,系统才知道这句代码是否有错。换句话说,由于编译型语言在运行前进行了编译/翻译,编译器对所有代码都进行了检查,这样就不会产生一些低级错误,例如使用了不存在的名字,或者使用了错误的名字。而JavaScript就可能会出现这些问题,但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);



原创粉丝点击