欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java开发知识点--备忘录

程序员文章站 2024-03-17 15:56:16
...

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