peek

最全最强 Java 8

送分小仙女□ 提交于 2020-12-06 03:14:08
Java 8 - 函数编程(lambda表达式) 我们关心的是如何写出好代码,而不是符合函数编程风格的代码。 @pdai <span style='color:red;font-size:25px;'>最全的Java后端知识体系</span><span style='color:red;font-size:25px;'> https://www.pdai.tech </span>, <span style='color:red;font-size:25px;'>每天更新中...</span>。 Java 8 - 函数编程(lambda表达式) 简介 lambda表达式 分类 惰性求值方法 及早求值方法 stream & parallelStream stream & parallelStream parallelStream原理: stream与parallelStream性能测试对比 Stream中常用方法如下: 常用例子 匿名类简写 forEach 方法引用 Filter & Predicate Map&Reduce Collectors flatMap distinct count Match min,max,summaryStatistics 参考资料 简介 在Java世界里面,面向对象还是主流思想,对于习惯了面向对象编程的开发者来说,抽象的概念并不陌生

leetcode-二叉树的层次遍历(Java)

落花浮王杯 提交于 2020-12-04 20:57:35
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。 例如: 给定二叉树: [3,9,20,null,null,15,7] , 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] 借鉴其他人的思路,采用广度优先探索,使用队列。 若根节点为空,直接返回; 若根节点非空,则将根节点入队,然后,判断队列是否为空,若不为空,则将队首节点出队,访问,并判断其左右子节点是否为空,若不为空,则压入队列。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { List <List<Integer>> res= new ArrayList(); public List<List<Integer>> levelOrder(TreeNode root) { if (root== null ) return res; // 边界条件 Queue <TreeNode> q= new LinkedList(); // 创建的队列用来存放结点

阻塞队列

自闭症网瘾萝莉.ら 提交于 2020-11-30 04:04:44
阻塞队列: ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。 LinkedBlockingDeque:一个由链表结构组成的有界双向阻塞队列。 LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。 SynchronousQueue:一个不存储元素的阻塞队列。 PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。 DelayQueue:一个使用优先级队列实现的无界阻塞队列。 阻塞队列( BlockingQueue )是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。 1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。 2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。 下表是阻塞队列的部分方法: 方法\处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 插入方法 add(e) offer(e) put(e) offer(e,time,unit) 移除方法 remove() poll() take()

阻塞队列知道吗

不打扰是莪最后的温柔 提交于 2020-11-30 02:36:34
一,阻塞队列? 当阻塞队列为空时,获取(take)操作是阻塞的;当阻塞队列为满时,添加(put)操作是阻塞的。        二,为什么用,有什么好处? 阻塞队列不用手动控制什么时候该被阻塞,什么时候该被唤醒,简化了操作。 在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤醒 好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都一手包办了;在concurrent 包发布以前,在多线程环境下,我们每个程序员都必须去自己控制这些细节,尤其还要兼顾效率和线程安全,会给我们程序带来不小的复杂度 三,架构梳理与种类分析 (1)种类分析 ArrayBlockingQueue:由 数组 结构组成的 有界 阻塞队列。 LinkedBlockingQueue:由 链表 结构组成的 有界 (大小默认为Integer.MAX_VALUE)阻塞队列。 PriorityBlockingQueue:支持优先级排序的无界阻塞队列。 DelayBlockingQueue:使用优先级队列实现的延迟无界阻塞队列。 SynchronousQueue:不存储元素的阻塞队列,也即单个元素的队列。 LinkedTransferQueue:由链表结构组成的无界阻塞队列。 LinkedBlockingDeque

Visual Studio Code快捷键[Mac版]

老子叫甜甜 提交于 2020-11-29 23:47:02
这份Visual Studio Code Mac版快捷键,根据官方文档翻译所得 原文PDF下载地址: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf visual studio code官方下载地址:https://code.visualstudio.com Visual Studio Code 是微软研发的一款带有GUI 的代码编辑器,功能强大,操作简单便捷,还有着良好的用户界面,设计得很人性化。 笔者推荐你作为自动化测试开发的首选IDE - by 苦叶子 Mac 键盘符号说明 图标 Mac键盘 ⌘ Command ⇧ Shift ⇪ Caps Lock ⌥ Option ⌃ Control ↩ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ↓ 下箭头 ← 左箭头 → 右箭头 ⇞ Page Up(Fn+↑) ⇟ Page Down(Fn+↓) Home Fn + ← End Fn + → ⇥ 右制表符(Tab键) ⇤ 左制表符(Shift+Tab) ⎋ Escape (Esc) ⏏ 电源开关键 常用 Mac 快捷键 说明 ⇧⌘P, F1 显示命令面板 ⌘P 快速打开 ⇧⌘N 新建 窗口/实例 ⌘W 关闭 窗口/实例 编辑 Mac 快捷键 说明

vscode常用快捷键与插件推荐

被刻印的时光 ゝ 提交于 2020-11-27 04:53:19
一、vscode常用快捷键 1.新建文件:chtr+n 2.新开窗口:ctrl+shift+n 3.分屏:ctrl+1/2/3 4.切换文件:alt+1/2/3或ctrl+tab 5.关闭当前窗口:ctrl+w 6.关闭所有已保存窗口:ctrl+k+w 7.显示/隐藏左侧边栏:ctrl+b 8.文件重命名:鼠标选中+f2 9.自动换行:alt+z(标签过长需要拖动编辑器下方滚动条阅读时不太方便,可以一键换行) 10.注释:ctrl+/ 11.多行编辑:alt+鼠标左键 12.隐藏/显示终端:ctrl+~ 13.查找并打开文件:ctrl+p 14.选中当前单词:ctrl+d 如果想选中所有此单词,ctrl+shift+L 15.文件内容查找替换:ctrl+f ctrl+h ,替换一个ctrl+shift+1,替换所有ctrl+alt+enter 16.项目全局搜索:ctrl+shift+f 17.移动当前行,向上alt+up(方向键↑) 向下alt+down 18.在当前行上方插入一行:ctrl+shift+enter 20.跳转到文件头部/尾部:ctrl+home/end 21.选中光标到行首/行尾文本:shift+home/end 22.选中部分文字:shift+left/right/up/down 23.删除当前行:ctrl+shift+k,会与搜狗输入法软键盘冲突

迷宫问题的求解(回溯法、深度优先遍历、广度优先遍历)

旧巷老猫 提交于 2020-11-26 08:45:50
一、问题介绍   有一个迷宫地图,有一些可达的位置,也有一些不可达的位置(障碍、墙壁、边界)。从一个位置到下一个位置只能通过向上(或者向右、或者向下、或者向左)走一步来实现,从起点出发,如何找到一条到达终点的通路。本文将用两种不同的解决思路,四种具体实现来求解迷宫问题。   用二维矩阵来模拟迷宫地图,1代表该位置不可达,0代表该位置可达。每走过一个位置就将地图的对应位置标记,以免重复。找到通路后打印每一步的坐标,最终到达终点位置。   封装了点Dot,以及深度优先遍历用到的Block,广度优先遍历用到的WideBlock。 private int [][] map = { // 迷宫地图,1代表墙壁,0代表通路 {1,1,1,1,1,1,1,1,1,1 }, { 1,0,0,1,0,0,0,1,0,1 }, { 1,0,0,1,0,0,0,1,0,1 }, { 1,0,0,0,0,1,1,0,0,1 }, { 1,0,1,1,1,0,0,0,0,1 }, { 1,0,0,0,1,0,0,0,0,1 }, { 1,0,1,0,0,0,1,0,0,1 }, { 1,0,1,1,1,0,1,1,0,1 }, { 1,1,0,0,0,0,0,0,0,1 }, { 1,1,1,1,1,1,1,1,1,1 } }; private int mapX = map.length - 1; //

java8 Stream的实现原理 (从零开始实现一个stream流)

岁酱吖の 提交于 2020-11-26 07:50:17
1.Stream 流的介绍 1.1 java8 stream介绍   java8新增了stream流的特性,能够让用户以函数式的方式、更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算。 1.2 从零开始实现一个stream流   相信很多人在使用过java8的streamAPI接口之后,都会对其实现原理感到好奇,但往往在看到jdk的stream源码后却被其复杂的抽象、封装给弄糊涂了,而无法很好的理解其背后的原理。究其原因,是因为jdk的stream源码是高度工程化的代码,工程化的代码为了效率和满足各式各样的需求,会将代码实现的极其复杂,不易理解。   在这里,我们将抛开jdk的实现思路, 从零开始实现一个stream流 。   我们的 stream流 同样拥有 惰性求值 , 函数式编程接口 等特性,并 兼容jdk的Collection等数据结构 (但不支持并行计算 orz)。   相信在亲手实现一个stream流的框架之后,大家能更好的理解流计算的原理。 2.stream的优点   在探讨探究stream的实现原理和动手实现之前,我们先要体会stream流计算的独特之处。   举个例子: 有一个List<Person>列表,我们需要获得年龄为70岁的前10个Person的姓名。 过程式的解决方案:    稍加思考,我们很快就写出了一个过程式的解决方案( 伪代码 ):

数据结构--树的非递归遍历

天大地大妈咪最大 提交于 2020-11-25 04:52:45
树的递归遍历代码非常简单易懂,但是由于递归会占用非常多的栈空间,因此非递归的遍历树也是必须要掌握的。因此最近仔细分析了很多的代码以及理解了遍历的过程,最后敲一遍并在这里记录一下,以后可以快速回顾。一般来说,递归可以解决的问题也一定可以用栈加循环的方式解决,毕竟递归实质上就是利用了栈嘛。 树从根节点开始对每个结点进行遍历,每个结点必定被访问三次,如上图。 第一次碰到就访问就是先序,第二次碰到访问就是中序,第三次碰到访问就是后序。 public class TreeReader { public void preOrder(TreeNode t) { // 先序遍历 Stack<TreeNode> s = new Stack<> (); while (t != null || ! s.isEmpty()) { while (t != null ) { System.out.println(t.val); // 第一次碰到就访问结点 s.push(t); // 压栈保存,以便左边访问完了,之后可以弹出它得到它的右节点 t = t.left; } if (! s.isEmpty()) { t = s.pop(); t = t.right; // 当上述循环退出,说明左子树全访问完了,则把父结点弹出,准备访问右子树 } } } public void inOrder(TreeNode t)

LeetCode-921 Minimum Add to Make Parentheses Valid Solution (with Java)

我只是一个虾纸丫 提交于 2020-11-25 02:19:01
1. Description: Notes: 2. Examples: 3.Solutions: 1 /** 2 * Created by sheepcore on 2019-05-07 3 */ 4 class Solution { 5 public int minAddToMakeValid(String s) { 6 Stack<Character> stack = new Stack<Character> (); 7 int addnum = 0 ; 8 for ( int i = 0; i < s.length(); i++ ){ 9 char ch = s.charAt(i); 10 switch (ch){ 11 case '(': stack.push(ch); break ; 12 case ')' : 13 if (!stack.isEmpty() && stack.peek() == '(' ) 14 stack.pop(); 15 else 16 addnum += 1 ; 17 break ; 18 default : 19 System.out.println("Invalid Parentheses" ); 20 } 21 } 22 return addnum + stack.size(); 23 } 24 } 来源: oschina 链接: