peek

Java8新特性之Stream

送分小仙女□ 提交于 2020-05-08 09:21:35
前言 在想很好了解 Stream 之前,很有必要简单的了解下函数式变成以及Lambda的概念,可以阅读另外一篇 Java8新特性之Lambda 大家回忆下日常学习工作中使用的最多的 Java API 是什么?相信很多人的答案和我一样都是集合。我们选择适合的集合数据结构存储数据,而我们之于集合最多的操作就是遍历,实现查询,统计,过滤,合并等业务。 哪里用Stream 集合迭代 外部迭代:通过 for循环,Iterator迭代器遍历集合,手动的拿到集合中每个元素进行相应处理 优点 对于程序的掌控更高 性能强(如果算法功力深厚) 缺点 很多重复的模板代码 需要很多中间临时变量来减少遍历次数 性能完全取决于程序员水平,烧脑 代码不易读 容易出错:例如for循环遍历LinkedList会出错 内部迭代:只提供对集合中元素的处理逻辑,遍历过程交给库类,Java5提供了foreach,Java8提供了Stream 优点 代码好读 简单,只需要提供处理逻辑 缺点 有些情况性能比外部迭代差一点点 在使用foreach时不能对元素进行赋值操作 为什么要Stream 本文要介绍的Stream属于内部迭代,之前我们已经有了foreach减少了我们的代码量,为什么我们还需要Stream呢? 流水线的方式处理集合,结合Lambda爽歪歪 代码超短超好读 Stream的开始到结束就相当于一次遍历

[LeetCode] 232. Implement Queue using Stacks 用栈来实现队列

喜夏-厌秋 提交于 2020-05-08 08:18:04
Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of queue. pop() -- Removes the element from in front of queue. peek() -- Get the front element. empty() -- Return whether the queue is empty. Notes: You must use only standard operations of a stack -- which means only push to top , peek/pop from top , size , and is empty operations are valid. Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack. You may assume

[LeetCode] 155. Min Stack 最小栈

☆樱花仙子☆ 提交于 2020-05-07 01:48:30
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. getMin() -- Retrieve the minimum element in the stack. Example: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> Returns -3. minStack.pop(); minStack.top(); --> Returns 0. minStack.getMin(); --> Returns -2. 设计一个最小栈,实现push, pop, top, getMin四个功能。相比原来的栈多了一个功能,可以返回当前栈内的最小值。 解法1:使用2个栈,栈1记录进来的数,栈2记录目前的最小值。当有新数push进来的时候

[LeetCode] 42. Trapping Rain Water 收集雨水

ε祈祈猫儿з 提交于 2020-05-06 23:41:27
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image! Example: Input: [0,1,0,2,1,0,1,3,2,1,2,1] Output: 6 这道收集雨水的题跟之前的那道 Largest Rectangle in Histogram 有些类似,但是又不太一样,先来看一种方法,这种方法是基于动态规划 Dynamic Programming 的,维护一个一维的 dp 数组,这个 DP 算法需要遍历两遍数组,第一遍在 dp[i] 中存入i位置左边的最大值,然后开始第二遍遍历数组,第二次遍历时找右边最大值,然后和左边最大值比较取其中的较小值,然后跟当前值 A[i

_library_cache_advice和latch:shared pool、latch:shared pool simulator

痞子三分冷 提交于 2020-05-06 07:49:19
版本10.2.0.4和11.1.0.6中"_library_cache_advice"=TRUE的情况下可能出现高latch:shared pool、latch: shared pool simulator等latch争用等待事件,默认情况下_library_cache_advice受到参数"statistics_level"的影响为TRUE,当_library_cache_advice=TRUE时他启用library cache simulator特性。 该library cache simulator特性负责估算shared pool LRU的表现,simulator模拟器收集heap内存堆大小以及load载入、pin、unpin的次数信息;通过这些数据来估算出若我们有更大的shared pool,我们可以由更大的共享池来缓存更多的SQL、PLSQL在共享池中,以此来节约加载时间。若我们设置更小的shared pool size,则又会对加载时间有何等的影响? 题外话:另一个对ASMM 下shared pool有作用的参数: _memory_broker_shrink_heaps: If 0, will not try to shrink shared pool or Java pool If greater than zero, will wait this many

手写实现java栈结构,并实现简易的计算器(基于后缀算法)

人走茶凉 提交于 2020-05-05 11:09:13
  一、定义   栈是一种线性表结构,栈结构中有两端,对栈的操作都是对栈的一端进行操作的,那么被操作的一端称为栈顶,另一端则为栈底。对栈的操作其实就是只有两种,分别是入栈(也称为压栈)和出栈(也称为弹栈)。入栈,将新元素压入栈中,那么此时这个栈元素就成为了栈顶元素,栈深度相应的+1。出栈,将栈中的栈顶元素弹出来,此时栈顶的下一个元素就会成为新的栈顶元素,栈深度也相应的-1。根据入栈和出栈的规则,也可以得到栈数据的顺序是后进先出(LIFO,LAST IN FIRST OUT)的特性。栈结构的效率是非常高的,因此无论栈中数据的量有多大,操作的也只有栈顶元素一个数据,因此栈的时间复杂度为O(1),这里不考虑栈溢出扩容的问题。栈结构示意图下图:   二、栈的应用场景   栈的数据接口在编程中的应用是非常广泛的,其中包括:   1、浏览器页面的浏览记录。我们在浏览器中浏览的页面的时候后退和前进能够正确的跳转到对应的页面,就是利用了栈的特性来实现的。   2、java虚拟机中栈的操作数栈也是利用栈实现的。java在编译的时候讲操作的代码压入操作数栈中,进行运算时就将栈顶元素弹出来,然后进行运算后将结果再压进操作数栈中。   3、计算器的实现。我们在计算的时候一般都是从左往右计算的,但是这种方式对于计算机是非常不友好的,它需要进行大量的判断才可以。但是利用栈以及一些算法就能轻松实现计算的功能

Java中常用七个阻塞队列的总结

北城以北 提交于 2020-05-05 10:08:19
Java队列总结 通过前面文章的学习,我们对Java中常用队列做了介绍。本文,咱们来对队列做个总结吧。 首先,我们介绍了现实生活中的实际场景(排队买票等),来告诉我们为什么需要使用队列。 队列是一种先进先出(FIFO)的抽象数据结构,在Java中,队列使用了两种数据类型来实现的,分别是:数组和链表这两种数据结构。 本文主要内容:回顾Java中常用的七个阻塞队列进行总结及阻塞队列中四组AP并进行总结。 本文来源:本文是由凯哥Java(kaigejava)原创发布。 接着,我们介绍了队列的分类,可以分为两类,即阻塞队列和非阻塞队列。 常用的三个非阻塞队列:LinkedList、PriorityQueue和ConcurrentLinkedQueue. (PS:凯哥没有做介绍,在以后的文章中,凯哥将对ConcurrentLinkedQueue进行介绍) 然后我们介绍Java中常用的七个阻塞队列。他们之间类图关系: 我们可以看到,队列是Collection的子类。也即和arrayList类似的。 接着我们就对七个阻塞队列做了详细的介绍。 阻塞队列的七个子类 ArrayBlockingQueue(下文简称:ABQueue)、LinkedBlockingQueue(下文简称:LBQueue)、PriorityBlockingQueue(下文简称:PBQueue)、DelayQueue(下文简称

Java中常用七个阻塞队列的总结

三世轮回 提交于 2020-05-04 10:52:30
Java队列总结 通过前面文章的学习,我们对Java中常用队列做了介绍。本文,咱们来对队列做个总结吧。 首先,我们介绍了现实生活中的实际场景(排队买票等),来告诉我们为什么需要使用队列。 队列是一种先进先出(FIFO)的抽象数据结构,在Java中,队列使用了两种数据类型来实现的,分别是:数组和链表这两种数据结构。 本文主要内容:回顾Java中常用的七个阻塞队列进行总结及阻塞队列中四组AP并进行总结。 本文来源:本文是由凯哥Java(kaigejava)原创发布。 接着,我们介绍了队列的分类,可以分为两类,即阻塞队列和非阻塞队列。 常用的三个非阻塞队列:LinkedList、PriorityQueue和ConcurrentLinkedQueue. (PS:凯哥没有做介绍,在以后的文章中,凯哥将对ConcurrentLinkedQueue进行介绍) 然后我们介绍Java中常用的七个阻塞队列。他们之间类图关系: 我们可以看到,队列是Collection的子类。也即和arrayList类似的。 接着我们就对七个阻塞队列做了详细的介绍。 阻塞队列的七个子类 ArrayBlockingQueue(下文简称:ABQueue)、LinkedBlockingQueue(下文简称:LBQueue)、PriorityBlockingQueue(下文简称:PBQueue)、DelayQueue(下文简称

深度优先搜索原理与实践(java)

こ雲淡風輕ζ 提交于 2020-05-04 07:26:51
概论 深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为 DFS 即 Depth First Search。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用堆数据结构来辅助实现 DFS 算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。 基本步奏 (1)对于下面的树而言,DFS 方法首先从根节点1开始,其搜索节点顺序是 1,2,3,4,5,6,7,8(假定左分枝和右分枝中优先选择左分枝)。 (2)从 stack 中访问栈顶的点; (3)找出与此点邻接的且尚未遍历的点,进行标记,然后放入 stack 中,依次进行; (4)如果此点没有尚未遍历的邻接点,则将此点从 stack 中弹出,再按照(3)依次进行; (5) 由于与节点 5 相连的的节点都被访问过了,于是5被弹出,查找与 4 相邻但没有被访问过的节点: (6)直到遍历完整个树,stack 里的元素都将弹出,最后栈为空,DFS 遍历完成。 (7) 针对上面的过程,可以用代码表示如下: // 用于记录某个节点是否访问过    private Map<String, Boolean> status = new HashMap<String, Boolean> ();

剑指offer——栈与队列相关 Queue,Deque,Stack

不想你离开。 提交于 2020-05-04 05:15:25
剑指offer——栈的压入、弹出序列 剑指offer——用两个栈来实现队列 剑指offer——调整数组顺序使奇数位于偶数前面 使用队列时注意: 判断是否为空(获取但不删除) queue.peek() == null 区别于queue.element()为空时抛异常 添加元素: queue.offer() 满了时 返回false,而add()满了时,会报错 弹出元素: queue.poll() 为空时 返回null, 而remove()满了时,会抛异常 而且要注意:Queue是一个接口,不能直接使用它,而需要使用实现了它的类 参考: Java 集合深入理解(9):Queue 队列 Deque双端队列: Deque 是 Double ended queue (双端队列) 的缩写,读音和 deck 一样,蛋壳。 Deque 继承自 Queue ,直接实现了它的有 LinkedList, ArayDeque, ConcurrentLinkedDeque 等。 Deque 支持容量受限的双端队列,也支持大小不固定的。一般双端队列大小不确定。 Deque 接口定义了一些从头部和尾部访问元素的方法。比如分别在头部、尾部进行插入、删除、获取元素。和 Queue 类似,每个操作都有两种方法,一种在异常情况下直接抛出异常奔溃,另一种则不会抛异常,而是返回特殊的值,比如 false, null … 参考