- 博客(137)
- 收藏
- 关注
原创 Java8 新特性 Stream流操作
因此,需要 List studentList = students.stream().filter(item -> item.getAge() == 12).collect(Collectors.toList());我们对StuClass(学生班级)进行分组,对语文,数学,英语的分数进行分组统计。我们开发时是不是经常会将每个数组中的id抽取成一个idlist.那么Stream中的map()可以帮助到你。students并没有实现过滤,不信,我们可以验证一下。抽取StudentId。
2024-03-31 20:31:26
371
1
原创 跨域问题及解决方案
JSONP(JSON with Padding)跨域请求:通过在页面上添加一个 标签,并指定其 src 属性为跨域请求的 URL,服务器返回的数据会被当做 JavaScript 代码执行,从而实现跨域数据的获取。由于 A 和 B 的协议(http/https)、主机名(www.a.com 和 www.b.com)和端口号(默认为80)都不相同,因此它们被认为是不同的源。代理跨域请求:通过在自己的服务器上建立代理服务器,将前端请求发送给代理服务器,再由代理服务器向目标服务器发送请求,并返回目标服务器的响应。
2023-05-28 10:12:46
1096
原创 Spring Security 框架
OncePerRequestFilter是Spring Security框架中的一个抽象类,实现了javax.servlet.Filter接口,通过继承它可以方便地实现对请求的过滤。它的作用是确保在请求处理期间只被调用一次,即只会过滤一次该请求,可以避免同一请求被重复处理的问题。OncePerRequestFilter实现了doFilter()方法,该方法在每个请求到达过滤器时会被调用。通过继承该类并重写方法,可以自定义实现请求过滤器的逻辑。
2023-05-27 17:43:13
2667
1
原创 Keep笔试第三题
因为:[3,4,5] 当执行 cmr = 0时 4 距离最左右边界最小值是1。cmr = 0 查询该元素value 距离左右边界最小值。cmr = 2时 向右添加元素value。最后输出所有当cmr = 0时得到的数组。cmr = 1时向左添加元素value。第二个index是value;第一个index是cmr;现在构造一个双端队列。...
2022-08-30 22:30:09
226
原创 Java8新特性:stream计算
package JAVA_stream学习;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.stream.IntStream;import static java.util.stream.Collectors.toList;public class streamlearn { public static void main(String[] args
2022-04-19 22:17:34
411
1
原创 leetcode046全排列
回溯法的应用:回溯法和递归法类似,但回溯法每次进入递归和出递归的时候都会保持一个状态。换句话说,当结束递归的时候,会恢复之前的状态,双方互不影响。class Solution { List<List<Integer>> result = new ArrayList<>(); public List<List<Integer>> permute(int[] nums) { if(nums==null||nums.l
2022-04-10 10:41:37
235
原创 leetcode129根节点到叶节点的路径和
package 剑指offer.树;import java.util.ArrayList;public class leetcode129求根节点到叶节点数字之和 { // 储存一个paths ArrayList<String> paths = new ArrayList<String>(); public int sumNumbers(TreeNode root) { dfs(root,""); Intege
2022-04-09 18:20:54
269
原创 leetcode155最小栈
package 剑指offer.栈;import java.util.Stack;/*最小栈每次出栈是栈的最小的元素需要一个容器记录当前的栈的最小值是多少。leetcode716 最大栈每次出栈是栈的最大的元素 */public class leetcode155最小栈 { class MinStack { Stack<Integer> xStack; Stack<Integer> minStack;
2022-04-09 16:53:21
599
原创 leetcode146 手写LRU算法
package 剑指offer.哈希表;import java.util.HashMap;public class leetcode146LRU缓存 { //定义一个双端链表 class ListNode{ public int key; public int value; public ListNode prev; public ListNode next; //构造函数 public
2022-04-09 16:25:42
753
原创 数据库索引概述
索引是数据库的一列或者多列的数据和物理地址的集合。索引用B+树进行存储,索引是真实存在的,会占用磁盘的位置,但是索引的出现会加快数据查询的速度。属于空间换取时间的优化方式。因此当数据表的数据很多的时候,建立索引是个比较好的选择。索引按照功能分为:普通索引,全文索引,主键索引按照物理实现可分为聚集索引和非聚集索引按照作用键的多少分为:单键索引和联合索引适合使用索引的场景:数据表中数据量大,查询量也大,需要优化查询速度,这是基本前提(1)在经常使用where过滤的时候,建立索引(2)学会建立主
2022-04-08 11:35:26
892
原创 Hashmap的底层实现(以JDK1.8为例)
Hashmap是我们常用的一个数据结构。我们今天来剖析一下hashmap底层是怎么样的?由于hashmap的版本经常更迭,我们今天就以JDK1.8为例来说。**hashmap其实是一个entry数组,**一个entry中包括一个key value 。而entry的存储参考数组的方式。你可以把hashmap看做一个大号的数组,只不过里面存放的是一个个的entry。hashmap的entry存放并不是根据key来存放的,而是hash值。当一个数据put进来的时候,hashmap会计算他的hash值,再根据
2022-04-08 10:59:23
817
原创 什么是回表查询?如何避免回表查询?
我们在索引中,有一种叫做聚集索引和非聚集索引的索引类型。在聚集索引中,B+树上会存储这一行的全部数据,但是非聚集索引只会存储该列对应的值和相应行的主键。是不是聚集索引的定义与主键索引很像?其实就是的,当我们没有定义主键索引时,MYSQL会指定从左到有的第一个加了唯一索引和非空约束的列建立聚集索引,用它来代替主键索引。聚集索引≈主键索引=唯一性约束+非空约束那我们说了这么多?到底什么是回表查询呢?比如有这么一张表 id name sex typeid为主键,name建立了普通索引。比如我写下
2022-04-08 09:29:19
17945
6
原创 AOP概述
package 设计模式;/*动态代理 */import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;//接口其实更应该定义成一种规范interface Human{ String getBelief(); void eat(String food);}class SuperMan implements Hum.
2022-03-25 18:23:20
492
1
原创 动态代理初步理解
动态代理就是在程序编码时,不需要指定某类来了person类就做person类的代理类来了annimal类就做annimal类的代理类因此实现动态实现动态代理的理论基础是JAVA反射Spring框架很多地方都用到了java反射比如JAVA Bean的读取package 设计模式;/*动态代理 */import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.r
2022-03-25 18:05:10
340
原创 JAVA-IO
File初步使用@Testpublic void test01(){ //一种是相对路径 File file=new File("hello.txt"); //一种是绝对路径 File file1= new File("C:\\Users\\61692\\Desktop\\hello.txt"); System.out.println(file.getPath()); //输入hello.txt System.out.println(file1.g
2022-03-25 17:59:41
260
原创 死锁问题与解决
死锁就是各个线程分别都拿了对方需要的同步资源不放,都在等对方放弃自己手里的资源,因此互相对待,形成了线程的死锁。package 多线程;/** * 死锁的案例 * 一线程握住锁s1 然后就睡了 * 二线程执行握住锁2 然后也睡了 * 一线程醒来以后,要获取锁2,但是2线程拿着呢 * 2线程醒来后,要获取锁1,但是1线程拿着呢 * 然后死锁了 * */public class deadThread { public static void main(String[] args)
2022-03-25 17:56:29
282
原创 设计模式之工厂模式
工厂模式分为两种一种工厂方法,一种抽象工厂工厂的存在就是为我们new对象的,这样节省了我们的开发时间。在JAVA中应用十分广泛其中XXXFactory的都是采用的工厂模式,专门生产XXX的工厂这是简单工厂模式作为引例package 设计模式;//简单工厂模式/** * 缺点就是你要是扩展新的产品时,必须修改CarFactory类的代码 * 会产生不安全 */interface Car { void run();}class Audi implements Car {
2022-03-24 10:41:28
620
原创 设计模式之代理模式
代理有两种一种静态代理,一种动态代理动态代理又分JDK原生代理和clib动态代理本案例是静态代理就是这个代理只能为我一个被代理对象所服务比如这里又出现一个被代理对象,那么只能再重写一个代理再为它服务动态代理则不是,理论基础是JAVA反射package 设计模式;public class 代理模式 { public static void main(String[] args) { Server server=new Server(); //serve
2022-03-24 10:35:59
191
原创 throws与throw的异同
throws:在方法体命名,一旦满足后的异常对象,立即抛出异常,并显示给调用者,后续代码不再执行throw手动抛出一个异常对象其实Java的异常处理可以理解为一个“抓抛模型”过程1:抛的过程发现异常代码,生成异常对象并抛出(1)系统自动生成异常对象(2)程序员手动生成异常对象过程2:抓的过程可以理解为对异常的处理(1)try catch finally(2)throws由此可以看出:throw是抛出异常,是生成异常对象的方式throws是声明异常,是处理异常的方式。...
2022-03-23 22:04:34
681
原创 单例模式(饿汉模式与懒汉模式实现)
单例模式是只会实例化一个对象,程序就用这一个对象。构造器为private饿汉模式:package 设计模式;public class 单例模式 { Bank bank1 =Bank.getInstance(); Bank bank2 =Bank.getInstance(); //bank1 与bank2 相同}class Bank{ //私有化类构造器 private Bank(){ } //内部创建类的对象 private st
2022-03-23 21:37:52
241
原创 实现同步方式的三种方式:同步监视器、同步方法、lock
Lockprivate ReentrantLock lock = new ReentrantLock();lock.lock();//上锁lock.unlock();//解锁同步方法public synchronized void run(){ //}同步监视器synchronized(s1){ //}Lock案例package 多线程;import java.util.concurrent.locks.ReentrantLock;class Window
2022-03-23 14:00:32
435
原创 volaitale 与synchronized的区别
volaitale 与synchronized的区别(1)不是原子 原子操作(2)volaitale 仅保证数据在各线程可见性,但不能不保证线程安全,尤其i++synchronized能保证(3)前者不是锁,更像是监视器,或者叫轻量级锁;synchronized就是锁了(4)前者性能好,后者性能差锁的出现之所以会让性能变差,是因为是让多线程变成单线程了;还有会让线程从就绪变成阻塞态,再从阻塞变成就绪态,这会极大损耗cpu的性能。voliatle怎么能保证数据在各线程的可见性?因为,在没加该
2022-03-23 13:56:48
203
原创 sleep与wait()的区别 与 wait()与nodify()
sleep与wait()的区别相同点:都可以让线程进入阻塞状态不同点:(1)sleep()在Thread类声明;wait()在Object类中声明(2)sleep没有执行要求,爱在哪里,就在那里;wait()只能在同步代码块【加锁区】。(3)若两个方法都在同步代码块内,sleep()不会释放锁,但是wait()会释放锁。wait()与nodify()这个哥俩要配合一个使用wait()会使object对象的线程都阻塞;那么nodify()就唤醒object对象的阻塞线程。这两个方法一正一反,
2022-03-22 18:20:24
215
原创 多线程实战 生产者与消费者问题
package 多线程;/** * 生产者-》店员(20个固定)-》消费者 * 店员若满,会让生产者停一下 * 店员若空,会让消费者停一下 */class Clerk{ private int product_num=0; //生产 public synchronized void produceProduct() throws InterruptedException { if(product_num<20){ pr
2022-03-22 17:39:52
88
原创 剑指offer72 排序数组的只出现一次的数字【二分查找】
package 剑指offer.二分查找;import java.util.HashMap;import java.util.Map;public class 只出现一次的数字 { public int singleNumber(int[] nums) { HashMap<Integer,Integer> hashMap =new HashMap<>(); for (int i =0;i<nums.length;i++){
2022-03-21 13:48:40
382
1
原创 剑指offer72 求平方根【二分查找】
package 剑指offer.二分查找;import java.util.HashSet;//二分查找的思想public class x的平方根 { public int mySqrt(int x) { // int l = 0, r = x, ans = -1; while (l <= r) { int mid = l + (r - l) / 2; //long不加还不行
2022-03-21 11:52:27
109
原创 leetcode103 锯齿形遍历二叉树
也是二叉树的层序遍历要有一个标志位来区分是奇数层还是偶数层同时需要一个队列能顺序输出节点,还得会逆序输出节点双端队列可以办到。package 剑指offer.树;import java.util.Deque;import java.util.LinkedList;import java.util.List;import java.util.Queue;/** * 奇数层从左到右遍历,偶数层从右向左排列 * */public class 锯齿形遍历二叉树 { publi
2022-03-21 11:26:41
639
原创 剑指offer46 二叉树的右侧视图 【双队列法】
package 剑指offer.树;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;/** * 其实就是找二叉树的每层的右侧的节点 * quene1是存放当前层的节点 * queue2存放下一层的节点 * 由于是从左到右进行遍历,因此最后那个node就是最右侧的节点 * */public class 二叉树的右侧视图 {
2022-03-21 11:10:35
376
原创 剑指offer45 二叉树最底层最左边的值 【双队列法】
package 剑指offer.树;import java.util.LinkedList;import java.util.Queue;public class 二叉树的最低层最左边的值 { public int findBottomLeftValue(TreeNode root){ int bottomleftvalue=root.val; Queue<TreeNode> queue1 =new LinkedList<>();
2022-03-21 11:09:20
825
原创 剑指offer44 二叉树中每层的最大值 【双队列法】
但凡说道每层 讨论树的层级问题就要想到树的层序遍历!相关问题有很多:每层的最大值右侧视图最左侧最底部的节点的值锯齿形遍历树的节点(奇数层从左到右,偶数层从右向左遍历)。。。用到的方法无外乎两个队列一个队列储存当前层的节点一个队列储存下一层的节点package 剑指offer.树;import java.util.ArrayList;import java.util.Deque;import java.util.LinkedList;import java.util.List
2022-03-21 11:08:04
502
原创 leetcode42接雨水
计算每个柱子能接多少雨水找该柱子左侧最高柱子长度,找打该柱子右侧最高柱子的长度该柱子能接雨水的高度=(左右两侧最高柱子的最小值)-该柱子的高度注意第一根柱子与最后一根柱子不接雨水package 剑指offer.数组;public class leetcode42接雨水 { public int trap(int[] height) { //雨水的体积 int sum = 0; for (int i = 0; i < height.l
2022-03-21 11:02:51
187
原创 java反射实战
Java反射是JAVA的一个bug级的存在我们可以利用java反射去获取任何字段、任何类。包括私有的。获取类模板的两种方式一Class<Blog> blogClass =Blog.class;二Blog blog =new Blog();Class<? extends Blog> blogclass1 =blog.getClass();这样我们就可以利用类模板进行操作了:我们可以利用blogclass 或者blogclass1来操作System.out.p
2022-03-19 19:13:50
518
原创 Session鉴权【登录】
我们经常会遇到去一个网站,当你执行一个操作的时候需要登录那么网站或者app是如何获知我们是否登录的呢?今天介绍一个比较经典的方法 httpsessionSession在HttpServletRequest request//serivce层//将之前mapper层的注入过来@Autowriedprivate SysUserService sysusermapper;public Returndata login(Sysuser user,HttpServletRequest reques
2022-03-19 19:04:47
891
原创 leetcode415字符串相加
和前面一道题非常相像本质就是模仿十进制加法package 剑指offer.字符串;//字符串相加public class leetcode415字符串相加 { public String addStrings(String num1, String num2) { StringBuilder result = new StringBuilder(""); int i = num1.length() - 1, j = num2.length() - 1, c
2022-03-17 22:38:58
379
原创 leetcode70爬楼梯【dp】
package 剑指offer.动态规划;/** * 斐波那契数列 * 每次这能爬一节 或者两节 * 请问多多少种爬楼梯的做法 * * 从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。 * 首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。 * 还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。 * 那么dp[i]就是 dp[i - 1]与dp[i
2022-03-17 22:22:50
244
原创 leetcode5最长回文子串【dp】
package 剑指offer.动态规划;public class leetcode5最长回文子串 { public String longestPalindrome(String s) { int len = s.length(); //小于2就不是回文串 if (len < 2) { return s; } //初始化最大长度 int maxLen = 1;
2022-03-17 21:58:30
497
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人