![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 60
*^O^*—*^O^*
这个作者很懒,什么都没留下…
展开
-
多线程学习 各种锁类型与对比 lock
悲观锁,乐观锁悲观锁:悲观的方式看待临界资源(多线程共享变量)线程安全问题。背景:大多数情况下,同一个时间点,常常有多个线程竞争同一把锁实现:竞争同一把锁失败的线程,阻塞的方式等待锁的释放乐观锁:乐观的方式看待临界资源线程安全问题背景:大多数情况下,同一个时间点,常常只有一个线程竞争同一把锁实现方式:直接对临界资源进行修改(Java层面看起来是无锁的操作),没有线程安全问题(没有其他线程并发修改),直接修改成功,如果存在线程安全问题,修改失败,代码上,表现为返回值BooleanCAS什么是C原创 2021-06-18 10:35:25 · 421 阅读 · 1 评论 -
多线程学习 线程池笔记
作用池的概念,属于设计模式中享元模式(不用反复创建对象,可以复用)线程的创建,销毁都是比较消耗资源的,代价比较大降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁带来的消耗。提高响应速度:当任务到达时,任务可以不需要等待线程创建就能立即执行。提高线程的可管理性:使用线程池可以统一进行线程分配、调度和监控。jdk线程池ThreadPoolExecutor,每个参数的含义4种快捷方式创建线程池,每一种的含义,它们的局限性static ExecutorService newCached原创 2021-06-17 09:24:42 · 151 阅读 · 0 评论 -
多线程学习 线程通信
hahaha原创 2021-06-16 19:01:32 · 94 阅读 · 0 评论 -
多线程学习 线程创建,启动,中断,等待
多线程产生的背景,作用为了提升效率,尽可能的充分利用CPU资源,提高整体性能(总任务量恒定时,完成时间越小,性能越好)使用时的注意事项:性能相关,系统资源,任务量(总任务量,单个任务量)线程数总的一句话就是,在保证线程安全的情况下,尽可能的提高效率多线程效率总任务量=单个线程任务量*线程数线程数量越多,系统一次调度耗时越长,数量数越多,单个线程任务量越少,相对来说,线程创建,和调度的耗时占比就比较大如何确定执行任务的线程数?如何该进程是想占有所有的系统资源,把CPU打满1.如果每个线程都是原创 2021-06-07 22:51:24 · 141 阅读 · 2 评论 -
leetcode 626前K个高频单词
问题描述给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。https://leetcode-cn.com/problems/top-k-frequent-words/示例:输入: [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2输出: [“i”, “love”]解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。注意,按字原创 2021-04-01 16:50:07 · 245 阅读 · 2 评论 -
牛客 坏键盘打字(简解)
问题描述:旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。https://www.nowcoder.com/questionTerminal/f88dafac00c8431fa363cd85a37c2d5e输入描述输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。原创 2021-04-01 14:49:55 · 267 阅读 · 1 评论 -
哈希冲突 闭散列 开散列(哈希桶)
哈希表可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。插入元素:根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放。搜索元素:对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若关键码相等,则搜索成功。该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构原创 2021-03-30 15:06:06 · 326 阅读 · 0 评论 -
二叉搜索树的删除,添加,获取节点
什么是二叉搜索树二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树删除的八种范例这里删除需要分很多情况,这里我们把要删除的节点设为cur,它的父节点为parentcur.left == null 1. cur 是 root,则 root = cur.right 2. cur 不是 root,cur 是 parent.原创 2021-03-30 14:24:43 · 216 阅读 · 0 评论 -
常见的排序算法(3) 快速排序 归并排序 递归与非递归实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录快速排序原理代码优化方法归并排序原理代码优化方法快速排序不稳定原理从待排序区间选择一个数,作为基准值(pivot);Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可以包含相等的)放到基准值的右边;采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 =1,代表已经有序,或者小区间的长度 == 0,代表没有数据。时间复杂度最好O(n原创 2021-03-26 18:37:27 · 265 阅读 · 0 评论 -
堆的应用,TopK问题
问题描述简单来说就是在一堆数据里面找到前 K 大(当然也可以是前 K 小)的数。这个问题也是十分经典的算法问题,不论是面试中还是实际开发中,都非常典型。解题思路看到这里我们想的是,可以直接建立一个大的数据堆,取K次堆顶元素,这样虽然得到的K个数字是有序的,但是我们的空间复杂度就会很大。还有一种解题思路,我们只需要建立前K个数据的小堆,然后遍历后面的数据,如果比堆顶元素大,那就把堆顶元素删除,将它入堆,如果小,就跳过,当我们遍历结束的时候,我们得到的就是前K个大的数字了,这样效率更高。代码示例im原创 2021-03-26 09:59:16 · 186 阅读 · 0 评论 -
常见的排序算法(2) 选择排序 ,冒泡排序 两者的区别
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言选择排序原理代码冒泡排序原理代码前言选择排序原理代码冒泡排序原理代码原创 2021-03-25 18:00:33 · 539 阅读 · 1 评论 -
常见的排序算法(1) 插入排序,希尔排序,堆排序
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言前言提示:以下是本篇文章正文内容,下面案例可供参考原创 2021-03-25 12:14:36 · 225 阅读 · 0 评论 -
优先级队列(PriorityQueue),实现自己的优先级队列(堆的基本操作)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码原创 2021-03-24 16:53:44 · 332 阅读 · 0 评论 -
堆的概念 ,堆向下调整,向上调整
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言堆的定义堆的性质堆的存储方式向下调整(小堆为例)思路代码向上调整调整思路代码前言优先级队列:提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。(优先级队列)PriorityQueue底层使用了堆的数据结构,而堆实际就是在完全二叉树的基础之上进行了一些元素的调整。堆的定义如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储。在一个一原创 2021-03-23 14:35:45 · 455 阅读 · 0 评论 -
非递归遍历二叉树
先序遍历方法这里我们使用栈来进行遍历,首先将根节点压栈将栈顶元素出栈判断出栈的节点左右孩子节点是否为空,不为空,先压右节点,再压左节点回到第一步当栈为空时,就跳出循环;代码 public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); if(root == null){原创 2021-03-22 12:02:07 · 172 阅读 · 0 评论 -
leetcode 根据二叉树创建字符串
题目描述你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。输入: 二叉树: [1,2,3,4]输出: “1(2(4))(3)”解释: 原本将是“1(2(4)())(3())”,在你省略所有不必要的空括号对之后,它将是“1(2(4))(3)”。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/constr原创 2021-03-21 20:32:43 · 200 阅读 · 0 评论 -
leetcode 从前序与中序遍历序列构造二叉树,从后序与中序遍历序列构造二叉树
1 从前序与中序遍历序列构造二叉树题目描述解题思路代码2 从后序与中序遍历序列构造二叉树题目描述解题思路代码原创 2021-03-21 19:30:42 · 239 阅读 · 0 评论 -
牛客 二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&rp=1&ru=%2Factivity%2Foj&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&tab=answerKey原创 2021-03-19 15:52:45 · 206 阅读 · 0 评论 -
leetcode 求二叉树的最近公共祖先(带图解)
题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree解题思路这里我们使用上述的树,假设我们输入的节点为 7,4:原创 2021-03-19 10:24:57 · 1848 阅读 · 0 评论 -
leetcode 102 二叉树的层序遍历(详解)
题目描述给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。102.二叉树的层序遍历解题思路首先我们需要使用一个成员变量来记录最终结果,即时代码递归的很深,也能随时操作这个成员变量的,如下代码中的result ;接着我们需要按照每一层进行遍历的方式进行插入,这里使用了一个helper方法,里面有两个参数,一个是我们要插入的节点,另一个就是要插入的层数,这里是从第零层开始往下走的;每次插入的时候我们需要先保证我们的result中是有我们所需要的哪一个下标的原创 2021-03-18 18:01:59 · 225 阅读 · 0 评论 -
牛客网 二叉树遍历 KY11
题目描述编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。二叉树遍历输出描述可能有多组测试数据,对于每组数据,输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。每个输出结果占一行。解题思路首先我们可以先创建一个节点的信息,接着写出程序的主框架,这里有一个多组输入的问题,这原创 2021-03-18 17:13:10 · 290 阅读 · 0 评论 -
二叉树的层序遍历,判断一个树是否为完全二叉树(思路解析)
1什么是层序遍历层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。怎样实现层序遍历这里我们需要采用一个工具——队列,解题思路是这样的,首先将根节点入队列,然后进入一个循环,(1)队首元素出队列,(这时队列里面只有一个根节点),(2)出队列之后,将该节点的左孩子和右孩子入队列,然后返回第一步;这里要注意入队列之前还是要检查不为空的情况。代码 private st原创 2021-03-18 15:19:40 · 1283 阅读 · 0 评论 -
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
问题分析1 2 34 5 67 8 9输出为1 2 3 6 9 8 7 4 5顺时针,一层层的遍历,这里就需要知道二维数组的行数和列数import java.util.*;public class Solution { public ArrayList<Integer> spiralOrder(int[][] matrix) { ArrayList<Integer> res = new ArrayList<>();原创 2021-02-03 21:15:27 · 1613 阅读 · 0 评论 -
Java 泛型 泛型类 通配符 泛型中父子类型
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言1.泛型类简单实例2.泛型方法简单实例3.泛型类使用--通配符基本通配符-上界通配符-下界4.泛型中父子类型前言泛型是java1.5中增加的一个新特性,通过泛型可以写与类型无关的代码,即编写的代码可以被很多不同类型的对象所重用,经常用在一些通用的代码实现中,比如:java集合框架中的类几乎都是用泛型实现的。泛型的本质是:类型参数化。类似函数传参一样,传递不同的实参,函数运行完将会产生不同的结果1.泛型类class 泛原创 2021-01-27 16:31:13 · 618 阅读 · 0 评论 -
Java 抛出异常 受查异常 自定义异常类
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1.抛出异常throwthrows2.异常体系受查异常非受查异常3.自定义异常类简单实例1.抛出异常throw可以手动抛出某个异常. 使用 throw 关键字完成这个操作,我们在处理异常的时候, 通常希望知道这段代码中究竟会出现哪些可能的异常.我们可以使用 throws 关键字, 把可能抛出的异常显式的标注在方法定义的位置. 从而提醒调用者要注意 public static void main(String[] a原创 2021-01-27 15:38:50 · 426 阅读 · 0 评论 -
java 异常捕获 处理 try catch
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言1.异常的基本语法关键字及其解释2.简单示例1.数组下标超出限定2.多个异常如何书写3.使用try回收资源3.异常的处理流程简单的实例前言两种防御式编程方式:1.LBYL(look Before You leap) 在操作之前做充足的检查。2.EAFP(It’s Easier to AsK Forgiveness than Permission) 先操作,遇到问题再处理。1.异常的基本语法try{有可能出现异常的原创 2021-01-25 21:17:04 · 572 阅读 · 0 评论 -
java 向下转型
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、向下转型是什么?二、简单实例三、使用场景一、向下转型是什么?Java多态中向上转型比较常见,因为只要使用到多态就会用到,向上转型,那么向下转型是什么呢,这里就是把父类引用转成子类引用,具有一定的局限性。有可能出现转换异常,这时需要instanceof来判断是否是某个类的实例,如果是,返回true,这时再向下转型就比较安全了。二、简单实例public class Dog extends Animal{ publi原创 2021-01-24 17:00:55 · 5067 阅读 · 0 评论 -
Java抽象类 接口 两者区别
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、抽象类1.抽象类是什么?2.什么时候会用到抽象类3.简单实例二、接口1.接口是什么2.什么时候会用到3.简单实例总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、抽象类1.抽象类是什么?Java使用abstract关键字来描述抽象类和抽象方法原创 2021-01-23 16:30:37 · 220 阅读 · 0 评论 -
Java多态理解
实现多态需要哪些:多态简单一句话总结就是,一个引用,多种形态,必须在继承的基础上实现需要以下这些,才是多态,缺一不可:1.向上转型2.方法重写3.动态绑定4.父类引用指向子类实例简单样例class 中国人 { public void eat (){ //啥也没有 }}class 山西人 extends 中国人 { @Override public void eat(){ System.out.println("吃刀削面")原创 2021-01-22 19:02:07 · 169 阅读 · 0 评论 -
代码块 静态代码块 就地初始化 构造方法 的执行顺序
问题描述:Java实例化一个类,若这个类中不仅有构造方法,还有代码块,静态代码块,和就地初始化一个别的类的实例,那么代码的执行顺序是怎样的呢?样例以及运行结果people类package Extends;import Dog.Dog;class people { public int age=100; public String name; Dog dog=new Dog(); public people() { System.out.p原创 2021-01-22 17:53:43 · 191 阅读 · 1 评论 -
Java多态的优点 方法重写
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1.多态的优点类调用者对类的使用成本进一步降低.能够降低代码的 "圈复杂度", 避免使用大量的 if - else可扩展能力更强2.方法重写什么是重写重写和重载的区别1.多态的优点类调用者对类的使用成本进一步降低.封装是让类的调用者不需要知道类的实现细节.多态能让类的调用者连这个类的类型是什么都不必知道, 只需要知道这个对象具有某个方法即可.因此, 多态可以理解成是封装的更进一步, 让类调用者对类的使用成本进一步降低.原创 2021-01-21 21:13:32 · 238 阅读 · 3 评论 -
多态中的动态绑定
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1.什么是动态绑定2.简单样例3.注意事项1.什么是动态绑定在 Java 中, 调用某个类的方法, 究竟执行了哪段代码 (是父类方法的代码还是子类方法的代码) , 要看究竟这个引用指向的是父类对象还是子类对象. 这个过程是程序运行时决定的(而不是编译期), 因此称为动态绑定.2.简单样例people类class people { public int age=100; public String name原创 2021-01-21 20:49:32 · 229 阅读 · 0 评论 -
多态中的 向上转型(三种方式)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1.向上转型是什么2.向上转型的三种方式- 直接赋值- 方法传参- 方法返回1.向上转型是什么在面向对象程序设计中, 针对一些复杂的场景(很多类, 很复杂的继承关系), 程序猿会画一种 UML 图的方式来表示类之间的关系. 此时父类通常画在子类的上方. 所以我们就称为 “向上转型” , 表示往父类的方向转。 people p=new student();people是student的父类,这里就是把student实例向上原创 2021-01-21 20:23:32 · 1054 阅读 · 3 评论 -
java 中 private default protected public 范围
不写默认default原创 2021-01-21 19:49:47 · 199 阅读 · 0 评论 -
字符串常量池 大小转换 反射操作 StringBuffer 和StringBuilder
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1.字符串常量池2.字符串反射操作3.字符串中一些操作4.StringBuffer 和StringBuilder1.字符串常量池常量池是JVM划分的一个内存区域,JVM运行开始的时候,会专门弄一个区域来作为常量池如果现在采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存到这个对象池之中.如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进原创 2021-01-20 20:57:42 · 333 阅读 · 0 评论 -
字节 字符 字符串 字符串比较,查找,替换,拆分,截取
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言1.字符与字符串2.字节与字符串3.字符串比较4.字符串查找5.字符串替换6.字符串拆分7.字符串截取(String)前言Java中String类是比较常用的类,这里整理一些String类中常用的的函数。1.字符与字符串1.字符数组->字符串 public static void main(String[] args) { char[] ch={'h','e','l','l','o'};原创 2021-01-20 20:14:06 · 377 阅读 · 0 评论 -
Java 简单实现spilt replace indexOf contains compareTo函数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言1.实现方法 split, 能够指定分割符将字符串拆分成字符串数组(不必支持正则表达式)2.实现方法 replace, 能够替换字符串中的某个部分3.实现方法 indexOf, 能够找出字符串子串存在的位置4.实现方法 contains, 能够判定字符串中是否包含子串5.实现方法 compareTo, 能够实现按照字典序比较字符串大小总结前言这是课堂作业写的一些代码,可能还有些问题,分享一下,希望大佬们指点指点。1.实现原创 2021-01-19 20:50:18 · 213 阅读 · 0 评论 -
字符串大写字母转化 移动数组 二分查找并写入
文章目录1.该函数接收一个字符串参数 str ,并将该字符串中的大写字母转换成小写字母,2.给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数3.给定一个数组 nums 和一个值 val ,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。4.给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。(不在返回要写入的位置)1.该函数接收一个字符串参数 str ,并将该字符串中的大写字母转换成小写字母,class Solution { public S原创 2021-01-18 20:59:15 · 220 阅读 · 0 评论 -
栈 堆 栈帧 区别
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、方法执行过程分析,内存,栈,栈帧的关系二、栈和堆的区别三、 java中变量在内存中的分配一、方法执行过程分析,内存,栈,栈帧的关系如果方法不被调用,此时就不会执行方法内部的代码;当方法被调用的时候,就会跳转到方法内部依次执行;当方法执行结束之后,就会回到方法调用的位置继续执行。当程序运行过程中,会有一个专门的内存区域,用来保存方法之间的调用关系,这个区域就被称作“栈”(此处的“栈”特指JVM里面的某个特定的内存区域)调原创 2021-01-18 20:25:56 · 548 阅读 · 0 评论 -
Java 基本变量详解 变量转换 移位运算
变量的形态class Test { static int a; // 静态属性/类成员变量/类变量 int b; // 属性/成员变量/实例变量 public static void main(String[] args ) {// 局部变量 int c; // 局部变量 }}这里b相当于全局变量,c就是局部变量,这里的使用和C语言类似,但是静态属性和C语言就不一样了。用static关键字修饰的静态变量和不用static关键字修饰的实例变量。静态变原创 2020-12-09 20:53:27 · 259 阅读 · 0 评论