Java8部分新特性及升级
- Lambda表达式
语法糖, "糖衣语法" 在结构上更为清晰简单, 可是本质上并无提高代码执行效率, 典型的语法糖还有 包装类的自动建包拆包等
- Lambda表达式总体 表示一个已经实现接口方法的对象, 相似匿名内部类的表现形式
- Runnable runnable = () -> {System.out.println("Hello Lambda!");};
此为实现了run方法的对象 runnable, run方法的内容为打印"Hello Lambda!"
- 对函数式接口中 抽象方法的实现部分 仅关注方法的参数、执行过程、返回结果
- ( ) 参数列表 至关于抽象方法的参数
- -> 表示将参数传递给过程 这一律念
- {执行体} 至关于抽象方法的具体实现过程
- 必须为函数式接口: Runnable Comparator FilFilter FilenamFilter等
- Java8中的新接口
- Consumer:消费型接口 只有参数,没有返回值 accept();
Consumer<Double> con = (money) ‐> System.out.println("花了" + money + "元");
- Supplier:供给型接口 只有返回值,没有参数 get();
Supplier<Integer> supplier = () ‐> (int)(Math.random() * 100);supplier.get(); //获取随机数
- Function:函数型接口 加工传入的值并返回 泛型<T,R>传入T返回R
Function<Integer, Double> function = (angle) ‐> Math.sin(angle);
- BiFunction<T, U, R> 传入T,U 返回R
- UnaryOperator<T> 一元运算 传入T返回T
- BinaryOperator<T> 二元运算 传入T返回T
- ToIntFunction<T> 传入T返回int
- ToLongFunction<T> 传入T返回long
- ToDoubleFunction<T> 传入T返回double
- IntFunction<R> 传入int 返回R
- LongFunction<R> 传入long 返回R
- DoubleFunction<R> 传入double 返回R
- Predicate:断言型接口 返回布尔值 test(); 对传入的值进行判断
Predicate<Integer> predicate = (integer) ‐> { if(integer >= 100 && integer < 500) { return true; } return false;};
- 表达式中调用类方法 类名::类方法
Converter c1 = (from) ‐> Integer.parseInt(from); 只代表传入参数的类型,和调用的类方法名Converter c2 = Integer::parseInc2.接口方法(参数);也能够直接用在类方法位置上写new 调用构造器
- Stream 流式操做
- Stream<T> s = list.stream();
- 方法
- s.filter( XXX ).forEach( XXX );
filter适配,传入集合的对象,返回布尔条件表达式 留下true的 forEach遍历
- distinct()去重
- limit(1) 按照正常顺序截断,最多一我的
- skip(1) 跳过第一我的
- sorted() 排序 用的是类中重写的compareTo方法 能够在括号中用lambda重写compareTo方法
集合中的元素必须是Comparable接口的实现类
- peek( 代码 ) 内部有消费接口
- 映射
- map( 集合中对象 -> 要执行的的操做后的返回值 )
- *flatMap() 返回集合
- 终端操做
- forEach() 遍历
- allMatch() 传入断言接口的实现 必须都达成条件,而后返回布尔值 过程当中一旦有一个不符合直接返回false
- anyMatch() 传入断言接口的实现 有一个达成就返回真
- nonMatch() 是否都不符合这个条件
- findAny() 筛选全部符合条件的
- findFirst() 筛选第一个
- count() 统计符合条件的个数 返回Long型值
- Optional<> o 若是find返回的是空,则用Optional自动给一个默认值
- 规约操做
- reduce( 初始值 , 二元运算接口实现BinaryOperator b )
- reduce( 0 , (x, y)->x+ y ); 0是初始累加和, x是当前累加和, y是下一个元素
- collect() 把返回的元素收集到集合中 括号里写Collectors.to'集合类型'
- Collectors还能够.counting() 总数 .summingInt()总合 .averageingInt() 平均值 .groupingBy()传入lambda表达式 .partitioningBy() 按照布尔条件分组 .joining("分隔符","前置拼接","后置拼接")
- Path接口:文件路径接口,
- Paths.get(路径) 获取对象,此对象指向路径
- Files.list(Path p) 返回Stream对象, 对象中保存了一堆Path对象, 这些对象是list对象文件夹下面的 子文件和子文件夹路径
- HashMap与红黑树
- java7中用 HashMap底层算法使用了数组加链表的结构
- 插入元素
处于同一链表的元素具备相同的hash值, 但每一个元素的内容仍是不一样, 因此equals返回false插入元素时, 计算新元素的hashcode值, 经过Hash算法, 算出此hashcode值在数组中对应下标, 而后查这个下标位置的链表, 没有的话直接插入, 若是有的话, 查询链表, 并与新元素equals 若是返回的都是false 则把新元素放在链表第一个位置上, 若是有返回true的, 则插入失败
- 数组扩容→加载因子
由于数组原则上不可变, 因此HashMap存在'加载因子'=0.75意味着若是此HashMap已经有75%的 数组下标被占用, 则对数组进行扩容*发生扩容时会从新计算全部元素的HashCode值,并从新用Hash算法映射对应数组位置的其下标
- 弊端
查找元素效率低元素插入效率慢
- java8中 HashMap的内存结构进行升级 数组+链表+红黑树
- *当前HashMap中元素总数超过64个, 且某一组链表中元素数量>=8个 则将此链表结构变成红黑树结构
- 红黑树结构牺牲了添加元素的效率, 增长了查找元素的效率
- 红黑树: 一种特殊的二叉查找树
时间复杂度→ O(lgn)根节点为黑色每一个为空的叶子节点为黑色没有一条枝 会比其余的枝长两倍(红黑树是最接近平衡的二叉树)*应用于TreeSet, TreeMap
- 左旋与右旋
旋转先后, 应当都是二叉查找树
- 添加元素
向二叉查找树同样添加, 并将新结点涂成红色而后经过旋转+换颜色, 使二叉查找树知足红黑树的定义
- 删除元素
一样须要旋转+换颜色
- Java8中对ConcurrentHashMap线程锁的升级
欢迎关注本站公众号,获取更多信息