ASList

10个 IDEA 插件,帮你解放双手的

痴心易碎 提交于 2021-02-15 23:30:16
❝ 友情提示:插件虽好,可不要贪装哦,装多了会 卡 、卡 、卡 ~ ❞ 正经干活用的 分享一点自己工作中得心应手的 IDEA 插件,都经过实战检验,超好用哦~ 集成插件后会再去使用 Executors 去创建线程池会有如下的提示。 在这里插入图片描述 在这里插入图片描述 Conflicts(冲突) All Dependencies as List(列表形式查看所有依赖) All Dependencies as Tree(树结构查看所有依赖),并且这个页面还支持搜索。 在这里插入图片描述 IDEA 还有不少的开发小技巧,有助于我们少些代码,不知道大家有没有发现?变量后 . 可以联想提示,而在联想列表的最后边有很多简洁的命令。 装X用的 下边这些就属于装X神器了,可以根据个人的喜好来耍一下。 4、Rainbow Brackets 彩虹颜色的括号,看着很舒服,有点赏心悦目的感觉。 本文分享自微信公众号 - V5codings(gh_c1ec2d16ec93)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“ OSC源创计划 ”,欢迎正在阅读的你也加入,一起分享。 来源: oschina 链接: https://my.oschina.net/u/4599382/blog/4470275

告别垃圾代码,请收下这几个锦囊妙计!

六月ゝ 毕业季﹏ 提交于 2021-02-09 12:04:00
原文:https: //www.jianshu.com/p/3f04b6aebad2 转载自石衫的架构笔记。 重构不止是代码整理,它提供了一种高效且受控的代码整理技术。 (一)重构原则 1、何谓重构 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。 另一种解释是:使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。 2、为何重构 改进软件设计:如果没有重构,程序的设计会逐渐变质,重构很像是在整理代码,你所做的就是让所有的东西回到应处的位置上。 帮助找到bug:对代码进行重构,可以深入理解代码的作为,在搞清楚程序结构的同时,想不把bug揪出来都难。 提高编程速度:良好的设计是快速开发的根本,改善设计、提高可读性,减少错误,这些都是提高质量。 扫描二维码,加我微信, 申请进数千人技术交流群。 3、何时重构 任何情况下我都反对专门拨出时间进行重构。重构本来就不是一件应该特别拨出时间做的事情,重构应该随时随地的进行。 三次法则 第一次做某件事情是只管去做;第二次做类似的事情会产生反感;第三次再做类似的事,你就应该重构 最常见的重构时机是想给软件添加新特性的时候; 重构的另个一原动力是:代码的设计无法帮助我轻松的添加所需要的特性 修改错误的时候,review代码的时重构 间接层和重构 计算机科学是这样一门科学

Java 8

风格不统一 提交于 2021-02-08 02:57:54
Java 8 - 函数编程(lambda表达式) 我们关心的是如何写出好代码,而不是符合函数编程风格的代码。 @pdai 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世界里面,面向对象还是主流思想,对于习惯了面向对象编程的开发者来说,抽象的概念并不陌生。面向对象编程是对数据进行抽象,而函数式编程是对行为进行抽象。现实世界中,数据和行为并存,程序也是如此,因此这两种编程方式我们都得学。 这种新的抽象方式还有其他好处。很多人不总是在编写性能优先的代码,对于这些人来说,函数式编程带来的好处尤为明显。程序员能编写出更容易阅读的代码——这种代码更多地表达了业务逻辑,而不是从机制上如何实现。易读的代码也易于维护、更可靠、更不容易出错。

了不起的Java-CompletableFuture组合异步编程

喜欢而已 提交于 2021-02-04 07:05:51
在多任务程序中,我们比较熟悉的是分支-合并框架的并行计算,他的目的是将一个操作(比如巨大的List计算)切分为多个子操作,充分利用CPU的多核,甚至多个机器集群,并行执行这些子操作。 而CompletableFuture的目标是并发(执行多个操作),而非并行,是利用CPU的核,使其持续忙碌,达成最大吞吐,在并发进行中避免等待远程服务的返回值,或者数据库的长时查询结果等耗时较长的操作,如果解决了这些问题,就能获得最大的并发(通过避免阻塞)。 而分支-合并框架只是并行计算,是没有阻塞的情况。 Future接口 Future接口用于对将来某个时刻发生的结果进行建模,它建模了一种异步计算,返回一个执行结果的引用,计算完成后,这个引用被返回给调用方, 在使用Future时,将耗时操作封装在一个Callable接口对象中,提交给ExecutorService。 public interface Future<V> { boolean cancel( boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get( long timeout, TimeUnit unit) throws

[leetcode]15. 3Sum三数之和

蓝咒 提交于 2021-02-02 05:07:24
Given an array nums of n integers, are there elements a , b , c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets. Example: Given array nums = [-1, 0, 1, 2, -1, -4 ], A solution set is: [ [ -1, 0, 1 ], [ -1, -1, 2 ] ] 题意: 给定一个数组和一个值target,找到所有三数加起来等于target的组合 Solution1: Two Pointers(left and right to meet each other) 1. Sort the array (coz we must check the duplicates) 2. Lock one pointer and do two sum with the other two Step1: Sort the given array in ascending order Step2: Lock

为什么不能使用for循环遍历Queue

ε祈祈猫儿з 提交于 2021-02-01 15:07:54
为什么不能使用for循环遍历Queue 昨天有个朋友问我一道算法题,给出了他和答案的两个版本,这道题我看过,并查集问题,左看右看就是没发现它有问题,于是进行 debug ,发现数据读取没有问题,于是继续判断合并是否有误,发现也没有问题,最后发现他使用的 PriorityQueue 他使用的 for 循环进行遍历,好家伙,我当场好家伙! 1. 遍历 public static void main(String[] args) { // 默认是小顶堆 PriorityQueue<Integer> queue = new PriorityQueue<>(Arrays.asList(1, 5, 3, 7, 8, 6, 9, 2)); for (Integer num : queue) { System.out.print(num+" "); } } 上面的程序有不少人会以为输出的结果为 1 2 3 5 6 7 8 9 ,但是实际上呢,输出结果为: 1 2 3 5 8 6 9 7 2. 原因 原因的话,学过堆排序的朋友就应该知道,在 PriorityQueue 中实际上内部是维持着一棵二叉排序树,利用堆排序的规则实现的,具体的可以看 PriorityQueue 的源码,实际上树是一种虚拟出来的数据结构,底层都是基于数组实现的。只是对于左右节点的访问采用了不同的下标规则。 当我们使用 for

redis分布式锁01

偶尔善良 提交于 2021-01-15 02:26:38
在单体项目中,如果要保证程序只有一个线程进入,使用synchronized锁住代码即可,不过在分布式的情况下,synchronized只能锁住本地对象,如果其他的请求进入,synchronized是没有用的,使用redis的分布式锁; 代码: public Map<String, List<Catelog2Vo>> getCatalogJsonFromDbWithRedisisLock() { //1.站分布式锁 redis占坑 //NS 如果设置的值没有的话就创建 成功返回ok 在创建的时候必须创建和设置锁的过期时间一起原子操作,才能万无一失 String uuid = UUID. randomUUID ().toString(); Boolean lock = stringRedisTemplate .opsForValue().setIfAbsent( "lock" , uuid, 300 , TimeUnit. SECONDS ); if (lock) { //设置锁的过期时间,不过如果在这里没设置之前就断电了,就麻烦了 // stringRedisTemplate.expire("lock",300,TimeUnit.SECONDS); //站所成功 Map<String, List<Catelog2Vo>> dataFromDb; try { dataFromDb =

Java容器(List、Set、Map)知识点快速复习手册(上)

北战南征 提交于 2021-01-13 23:03:12
前言 本文快速回顾了Java中容器的知识点,用作面试复习,事半功倍。 上篇:主要为容器概览,容器中用到的设计模式,List源码 中篇:Map源码 下篇:Set源码,容器总结 其它知识点复习手册 Java基础知识点面试手册(上) Java基础知识点面试手册(下) 概览 容器主要包括 Collection 和 Map 两种,Collection 又包含了 List、Set 以及 Queue。 Collection 数组和集合的区别: 长度 数组的长度固定 集合的长度可变 内容 数组存储的是同一种类型的元素 集合可以存储不同类型的元素(但是一般我们不这样干..) 元素的数据类型 数组可以存储基本数据类型,也可以存储引用类型 集合只能存储引用类型(若存储的是简单的int,它会自动装箱成Integer) 1. Set(元素不可重复) HashSet:基于HashMap实现,支持快速查找,但不支持有序性操作。 TreeSet:基于红黑树实现,支持有序性操作,但是查找效率不如 HashSet,HashSet 查找时间复杂度为 O(1),TreeSet 则为 O(logN); LinkedHashSet:具有 HashSet 的查找效率,且内部使用链表维护元素的插入顺序。 2. List(有序(存储顺序和取出顺序一致),可重复) ArrayList:基于动态数组实现,支持随机访问; Vector

【基础回溯2】Java 基础知识疑难点/易错点

﹥>﹥吖頭↗ 提交于 2021-01-12 06:31:38
本文已经收录自 https://github.com/Snailclimb/JavaGuide (59k+ Star):【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。 阅读原文即可获取最新更新! ps: 之前发过这篇文章,不错后面又对内容重新完善和增加了部分内容,而且为了应读者要求做一个文章分类目录菜单,为了保证文章的质量和准确性重新发送了一遍。 1. 基础 1.1. 正确使用 equals 方法 Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。 举个例子: // 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常 String str = null ; if (str.equals( "SnailClimb" )) { ... } else { .. } 运行上面的程序会抛出空指针异常,但是我们把第二行的条件判断语句改为下面这样的话,就不会抛出空指针异常,else 语句块得到执行。: "SnailClimb" .equals(str); // false 不过更推荐使用 java.util.Objects#equals (JDK7 引入的工具类)。 Objects.equals( null , "SnailClimb" ); // false 我们看一下 java.util

LeetCode

安稳与你 提交于 2021-01-11 01:39:01
Topic Backtracking Description https://leetcode.com/problems/combinations/ Given two integers n and k , return all possible combinations of k numbers out of 1 ... n . You may return the answer in any order . Example 1 : Input: n = 4, k = 2 Output: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] Example 2 : Input: n = 1, k = 1 Output: [[1]] Constraints : 1 <= n <= 20 1 <= k <= n Analysis 回溯算法:求组合问题! 回溯算法:组合问题再剪剪枝 Submission import java.util.ArrayList; import java.util.List; public class Combinations { public List<List<Integer>> combine1(int numRange, int expectedSize) { List<List<Integer>> result