java 复习(heard first java)
最近复习java基础知识:
- 位运算和基础盲点
- Lambda
- stream
基础知识点
实例变量与局部变量:实例变量未被初始化可以通过编译,存在默认值,false,0,null。局部变量不初始化无法通过编译。
进制转换:Integer.parseInt(“1000”,2) :1000转为二进制:8
位异或运算(^)运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。
比如:8^11.8转为二进制是1000,11转为二进制是1011.从高位开始比较得到的是:0011.然后二进制转为十进制,就是Integer.parseInt(“0011”,2)=3;
位与运算符(&)运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。
比如:129&128.
129转换成二进制就是10000001,128转换成二进制就是10000000。从高位开始比较得到,得到10000000,即128.、注意:&是位运算符,不是逻辑运算符,&&具有短路功能,在第一个条件不符合的情况下之后不会执行。 但是&比较特殊,计算机中true是用二进制标识,所以可以进行与运算,使用&作为逻辑运算本质还是位运算,等所有条件运行后将结果与。(1>2 & 2>3) ==> (true & true)
位或运算符(|)运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。
比如:129|128.
129转换成二进制就是10000001,128转换成二进制就是10000000。从高位开始比较得到,得到10000001,即129.
注意:可作非短路,原因同上
位非运算符(~)运算规则:如果位为0,结果是1,如果位为1,结果是0.
比如:~37
在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是32字节,32bit
集合的add和addall方法区别:add添加一个集合相当于添加对应集合的指针,addall方法在添加一个集合元素时,会将这个集合里面的元素添加进去。
反射机制
java文件被编译生成字节码后并不是直接进入内存,需要类加载器(ClassLoader加载),这个加载器引导类进入内存变为类对象,并且将类中的所有区域变为对象,比如成员变量变为Filed\[] field
,构造方法变为Constractor\[] cons
对象数组,成员方法变为Method\[] methods
。
那么反射就是可以直接操控类对象,获取Method里面的方法或者直接操作Filed内变量。比如IDE的代码自动提示,定义一个类Person a
后,输入a会自动弹出后面的方法,这是因为IDE自动加载了Person
类的字节码进入内存,获取里面的Method
数组内的方法,从而展示在了弹窗中。
反射最大的好处是解耦。
java8
- 内存中:方法区,栈,堆,实际上方法区存在于堆内的永久区,永久区也会被gc回收,只不过比较困难,gc工作在堆,但是8后jvm都取消了永久区
- 1.7到8的升级点–concurrentHashMap:不在固定段16(因为不好确认多大,现在已经变为链表和红黑树),内部hash算法也变为了底层os支持的cas算法,快很多了
Lambda
匿名函数,让函数代码可以作为参数传递
在写lambda时需要函数式接口
1
2
3
4
5
6
7
8
接口类:
//双参数
public interface MyFunctionTwo<T,R> {
R calc(T t1, T t2);
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class test {
public void test1() {
int num = 10;
// MyFunction myFunction = (x)->(Integer) x*(Integer)x;
Integer operate = operate(num, x -> x * x);
System.out.println(operate);
}
public void test2() {
System.out.println(operate((long)19, (long)12, (x1, x2) -> x1 + x2));
}
private Integer operate(Integer num, MyFunction<Integer> myFunction) {
return myFunction.calc(num);
}
private Long operate(Long num1, Long num2, MyFunctionTwo<Long, Long> myFunctionTwo) {
return myFunctionTwo.calc(num1, num2);
}现在可以直接使用java内置的四个基本接口,如有特殊需要再自定义接口
1 |
|
需要注意的是:匿名内部类不可以直接修改外部数据,但是可以操作对象调用其修改方法!
如果4个基本接口不够,可以试试看子类接口(提供更多参数)API为Bi+4接口
REF
配合lambda的方法,若lambda的内容已经被实现可以引用
使用示例
1 |
|
Stream 操作
java8的stream分为:创建steam,中间操作,终端操作。
实质是将数据源转为流,对流进行一系列操作后生成结果。值得注意的是:只是转为stream没有任何意义,只有对stream进行终端操作,jvm才会执行stream中间操作。
首先是生成stream,最常用的应该是collection系列集合的stream方法吧
创建stream
1 |
|
流操作
对stream流的一些常用操作(流操作):skip
filter
limit
map
flatmap
distinct
sorted
1 |
|
终止操作
查找匹配,规约收集等
1 |
|
java8的optional
optional用于快速定位或者防止空指针
1 |
|
java8 接口新特性
新增了接口的静态方法和default修饰方法。
现在可以接口中实现默认方法,若一个类同时继承了某个同名方法类,且implements了这个接口,那么子类调用时,类优先。
若两个接口都定义了getName()那么子类实现这两个接口的话会报错要求实现类必须实现方法,如果extends了一个类又实现了同名方法的接口,extends的类优先。
1 | package com.Java8.TheInterface; |