![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
文章平均质量分 75
rotk2015
这个作者很懒,什么都没留下…
展开
-
反转链表、递归、迭代
首先是经典的LeetCode206,反转整个链表。解法可分为迭代、递归两种方式。而递归解法,根据返回函数的先后顺序(即处理当前递归栈与下一递归栈的先后顺序),又可分为top-down,bottom-up两种方式。本题十分经典,仔细体会,可以加深对迭代、递归的理解。public ListNode reverseList(ListNode head) { // return iterateSolution(head); // return recursionTopDownSolution(..原创 2021-08-06 16:06:52 · 159 阅读 · 0 评论 -
LeetCode_String to Integer (atoi)
LeetCode第8题,字符串转整型。为什么不用一个大循环而选择用分段式的小循环?合法字符串的格式是分段式的,但问题是,我们不知道实际的字符串的各个段长度为多少(无法定界)。若使用一个大循环轮询处理,需要额外的状态变量与判断语句决定当前状态,代码逻辑会变得更加复杂。如何进行溢出判断?这个问题是写本文的主要动机,我们可以很直接的得到一个可读性很高的、同时也是高赞答案采用的方式:if(total>Integer.MAX_VALUE/10 || (total==Integer原创 2021-07-03 16:02:55 · 86 阅读 · 0 评论 -
JAVA——健忘年轻人笔记
类内若未定义构造函数,编译器会隐式定义默认构造函数(是一个无参构造函数),来调用父类无参构造函数,若此时父类无对应函数,则报错。若无父类,则其隐式继承自 Object 类,该类有无参构造函数(隐式塞个父亲???hardcore)。JAVA中,对象、数组都是引用类型,一经初始化赋值就无法再改变。new 关键字实例化一个类(按类定义分配一份内存),并返回内存地址的引用,同时,调用构造函数。...原创 2021-06-05 12:01:16 · 251 阅读 · 0 评论 -
Spring实战——阅读笔记-未完待续
Spring框架的出现是为了简化Java开发。系统——模块——搭积木。Spring是一种关系、纽带。IoC(控制反转):将创建对象的内部工作转移给外部框架,被动接受框架分配的实例对象,使其与内部引用建立连接关系(DI,依赖注入)。Spring在这里可以看作是一个尽职尽责的保姆(或者说粘合剂),我们将需求(接口)告诉它,它自动给我们装上符合条件的实例对象。通过增加框架这个中间层,对象间的耦合性得到降低。同时,开放接口的做法提升了代码的泛化性、灵活性,并使其更易于维护。有了Sprin..原创 2021-06-05 11:57:49 · 105 阅读 · 0 评论 -
JavaGuide-RPC框架项目学习笔记-未完待续
首先,根据作者的教程以及POM文件查看项目依赖关系。由于对mave不熟悉,即使理清了依赖关系,对应打了jar包,编译时也报了错。后来发现是因为没有将包instal到本地仓库,导致不可见。(关键词:maven生命周期)参考资料:Idea操作Maven超级详细使用 基础篇。Idea操作Maven超级详细使用 高级篇。MAVEN01_概述+核心概念+IDEA中如何使用(创建项目)。MAVEN02_依赖范围+依赖冲突+解决冲突+继承聚合。...原创 2021-06-05 11:47:47 · 2230 阅读 · 0 评论 -
Java8部分集合类、接口API总结
API得背熟!!!interface Collection < E >:int size(),boolean isEmpty()boolean add(E e),boolean remove(Object o),Object[] toArray()interface List< E >,Queue< E >,Set< E >继承Collection< E >,存储单值元素;而interface Map< K,V >..原创 2021-05-30 17:05:23 · 194 阅读 · 0 评论 -
ThreadLocal部分源码解析
线程局部变量提供类,ThreadLocal< T >,简单说,对于某个变量(对象),为每个线程维护一个自己的独立副本。ThreadLocal定义了内部静态类ThreadLocalMap,而Thread类内维护了一个ThreadLocalMap类型的成员变量:threadLocals/* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */..原创 2021-05-27 21:32:34 · 260 阅读 · 0 评论 -
从单例模式到并发编程、volatile
单例模式:一个只能创建一个对象的类。饿汉式,直接在内部创建好对象,需要时return,优点是需要时直接就能获取对象,且并发安全,缺点是如果一直不需要的话,会造成资源浪费:public class test { private static test aInstance = new test(); private test(){} public static test getInstance(){ return aInstance; } }..原创 2021-04-22 22:21:48 · 111 阅读 · 0 评论 -
HashMap部分源码剖析
笔者所用JDK为 RedHat 的 OpenJDK-8u282-win64 版。HashMap,存放键-值对(Key-Value)数据,可根据键生成的哈希值快速查找对应值,数组加链表实现(拉链法解决哈希冲突,此外,元素过多时链表会转为红黑树)。允许null作为Key或Value。所储存键值对数据无序(若要求有序可用TreeMap)。线程不安全(若要求线程安全可用ConcurrentHashMap),fail-fast(modCount成员保证)。capacity:数组的长度,默认值是16,最大可原创 2021-04-12 21:07:14 · 147 阅读 · 2 评论 -
JDK动态代理源码解析——Proxy、WeakCache、ProxyGenerator
JDK版本为RedHat OpenJDK 1.8.0_282。JDK中的动态代理Proxy类仅限于方法拦截,且只能代理实现了接口的对象。调用Proxy的静态方法创建——继承了Proxy类的代理类(java只支持单继承,这就是为什么要求被代理类必须实现接口),通过该代理类的构造器创建对应代理对象,该对象实现了被代理类的接口,仅起到接口的作用。代理类对象内持有一个——实现了InvocationHandler接口的对象(我们称它为中间对象吧)的引用,中间对象又持有一个被代理对象的引用。中间对..原创 2021-04-03 22:21:54 · 420 阅读 · 0 评论 -
LeetCode_Partition Equal Subset Sum
416题,给定某无序数组,判断其是否能被分成总和相等的两个子集。此问题可转换成:判断其是否能恰好凑出原数组总和的一半,即 0/1 背包问题。那么可以由此引出两个优化点:若想能凑出,则原数组总和必为偶数,且数组内最大元素不能大于原数组总和一半。此外便是常规的二维数组压缩至一维的dp套路:class Solution { public boolean canPartition(int[] nums) { int sum = 0; int max = 0;..原创 2021-03-28 10:04:34 · 68 阅读 · 0 评论 -
LeetCode_Next Permutation
字典序全排列问题,该系列的核心问题是,如何从一个字典序的排列生成下一个最小排列。例如,12543 的下一个最小排列是,13245。我们可以这么考虑,排列从左到右的每个数位,对应不同的权重。其中,最左边的权重最大,最右的权重最小(右至左如同个、十、百、千…);而给定的数字,如同砝码。那么这个问题翻译过来就是,生成下一个总重量大于当前重量的排列,且该排列在所有可能的结果中,总重量最小(说白了就是重一点意思一下得了)。那么,给定数字 1 2 3 4 5,它的所有排列中,最小的、最大的分别是什么?这..原创 2021-03-22 19:48:08 · 111 阅读 · 0 评论 -
ArrayDeque部分源码剖析
笔者所用JDK为RedHat的OpenJDK 8u282 win64版。简介ArrayDeque,数组实现的双端队列。核心思想是维护头尾指针,将数组变为循环数组,由于没有固定的起始参考量(头指针可动),故无法按索引取值。但是,相比于...原创 2021-03-19 19:53:15 · 108 阅读 · 0 评论 -
二分查找——一网打尽所有细节!
二分查找,典中典的算法,笔者先写下经典实现。代码如下:参考资料:详解二分查找算法。原创 2021-03-15 22:04:28 · 62 阅读 · 0 评论 -
快速排序——凑活能用版
快速排序是排序的经典算法,具体思路很简单,但实现起来并非那么容易!如果使用最直观的双指针法,总会遇到神奇的问题:low<high 还是 low<=high?!(我纠结一天了真的整不明白orz…)所以为了珍爱生命,以后就用挖坑填数法吧。。。代码如下:import java.util.Arrays;public class QuickSort { public static void sort(int[] input, int low, int high){ ..原创 2021-03-14 15:37:22 · 80 阅读 · 0 评论 -
LeetCode_The Skyline Problem
自己的一开始的想法将 x 轴抽象成一个数组,然后遍历一次建筑群,每遇到新一个建筑,就更新对应的子数组高度。最后将整个数组再遍历一次即可。这个思路很简单,但是存在一个问题,就是维护的数组长度,与建筑群的总占地宽度与要求的输出精度相关,这样在极端条件下,可能会造成很大的空间浪费。同时,这种做法在最后遍历数组时,我们可以发现,有大量的重复数组值是无用的。后来看了下评论区和网上的资料,得到一个比较好的方案。仔细观察可以发现:天际线的 key point 由建筑的边界构成。而建筑之间经常会有覆盖现象,..原创 2021-03-04 15:55:25 · 82 阅读 · 1 评论 -
LeetCode_Construct Binary Tree from Inorder and Postorder Traversal
给定二叉树中序、后序遍历结果,构建二叉树。后序的最后一个结点必为根节点。对于后序的最后一个结点而言,中序遍历结果中,位于它左边的是它的左子树,位于它右边的是它的右子树。由 2 可得基本递归思路一:不断利用后序最后一个节点将中序结果分割,自底向上递归建立左右子树即可。此时,由于要在中序结果中寻找后序最后结点,故要么每次都循环遍历(时间代价),要么提前建立一个哈希表(空间代价)作为参数。本文的重点是第二种递归思路,既不循环也不需要哈希表。代码如下:int pInorder; // index o原创 2021-02-03 15:56:42 · 147 阅读 · 0 评论 -
浅谈迭代(非递归)遍历二叉树
不管是迭代遍历还是递归遍历,二叉树遍历都只做了三件事:处理左子树,处理右子树,处理当前结点。依据处理当前结点的时机不同,可分为:先序、中序、后序三种遍历方式。二叉树迭代遍历的主要难点在于:如何在处理完子树后,返回父结点。常用思路是利用栈先入后出的特性。原创 2021-01-23 17:24:16 · 275 阅读 · 1 评论 -
LeetCode_TwoSum
LeetCode题目TwoSum直接双重循环暴力解决,时间On2O_{n^2}On2,空间O1O_{1}O1。每次都要遍历查找,因此可以通过空间换时间,缩短查找的时间开销,先遍历一次建立散列表(HashMap),再遍历一次利用散列表查找,时间OnO_{n}On,空间OnO_{n}On。(此外还有HashTable,HashSet)public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map原创 2020-12-28 19:46:45 · 70 阅读 · 0 评论 -
JAVA——官方lambda表达式经典教程
本文内容针对于oracle的JAVA教程中,lambda表达式章节。教程围绕“ 如何从 输出所有大于某年龄的职工信息,到 针对性筛选对象并提取信息的通用性函数” 而展开,阅读完整个教程不光能学习到lambda表达式的用法,还可深入体会到所谓 抽象、泛化 的概念。最直接简单的实现如下,代码思路很简单,依次遍历表中所有职工,逐个判断年龄,符合条件则输出。这里有一个特殊遍历方法,python里也有类似的概念。由于List是Iterable的子类,故可使用For-Each Loop。public s原创 2020-12-02 20:27:00 · 209 阅读 · 0 评论