
Java
文章平均质量分 82
一朵花花
女孩子也可以好好敲代码丫
展开
-
wait 和 notify
由于线程之间是抢占式执行的,因此线程之间执行的先后顺序难以预知.但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序wait( )方法:当操作条件不成熟,就等待notify( )方法:当条件成熟时,通知指定的线程来工作wait( )方法notify( )方法notifyAll( )方法...原创 2021-12-03 12:12:41 · 677 阅读 · 8 评论 -
volatile 关键字
volatile 关键字原创 2021-12-03 11:57:12 · 725 阅读 · 2 评论 -
锁 & synchronized 关键字
本篇接着上篇 线程安全,可以先看一下上篇~~锁锁 是什么?锁的特点:锁的基本操作:锁的使用synchronized 关键字 — 监视器锁理解 synchronized 的具体使用:synchronized 的几种常见用法:举例: 两个线程尝试获取同一把锁????若两个线程分别加自己的锁(即:不是同一把锁)锁 是什么?举例理解:锁的特点:锁的特点是互斥的,同一时刻只有一个线程能获取到锁,其他的线程若也尝试获取锁,就会发生阻塞等待,一旦发生等待,需一直等到刚才的线程释放锁,此时剩下的线程再重新竞争锁原创 2021-11-28 14:18:50 · 1251 阅读 · 2 评论 -
线程安全问题【重点】
多线程带来的的风险 - 线程安全线程安全观察线程不安全线程安全的概念线程不安全的原因解决线程不安全线程安全线程安全问题是多线程所涉及到的最重要的,也是最复杂的问题观察线程不安全public class ThreadDemo14 { static class Counter{ public int count = 0; public void increase(){ count++; } } public原创 2021-11-28 14:17:36 · 5094 阅读 · 2 评论 -
线程的状态
前言:线程状态和进程状态是类似的,进程状态是辅助进程进行调度,线程状态是辅助线程进行调度Java 中线程的状态是通过一个 enum 来表示的线程的所有状态线程的状态是一个枚举类型 Thread.Statepublic static void main(String[] args) { for (Thread.State state : Thread.State.values()){ System.out.println(state); }}输出结果:状态说原创 2021-11-25 19:00:00 · 295 阅读 · 4 评论 -
Thread 类及常见方法
Thread 类及常见方法Thread 的常见构造方法:方法说明Thread( )创建线程对象Thread(Runnable target)使用 Runnable 对象创建线程对象Thread(String name)创建线程对象,并命名Thread(Runnable target,String name)使用 Runnable 对象创建线程对象,并命名举例:// Thread(String name) public class ThreadDem原创 2021-11-24 19:15:00 · 1172 阅读 · 3 评论 -
线程 & 多线程
线程 thread线程线程概念为啥要有线程?线程和进程的联系和区别线程管理多线程多线程程序缺点第一个多线程程序线程线程概念所谓的"线程",可以理解成轻量级"进程",也是一种实现并发编程的方式如果把一个进程,想象成是一个工厂,线程就是工厂中的若干个流水线为啥要有线程?可以实现并发编程单核 CPU 的发展遇到了瓶颈,要想提高算力,就需要多核 CPU,而并发编程能更充分利用多核 CPU 资源有些任务场景需要 “等待 IO”,为了让等待 IO 的时间能够去做一些其他的工作,也需要用到并发编程线程原创 2021-11-23 18:43:01 · 2528 阅读 · 7 评论 -
操作系统—进程
操作系统概念操作系统是一组做计算机资源管理的软件的统称(搞管理的软件:一方面管理计算机的硬件设备,另一方面管理计算机的软件资源)目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙…等进程(Process)进程是一种操作系统中非常重要的软件资源把一个可执行程序跑起来,系统中就会创建一个对应的进程;如果这个程序执行结束了,系统就会随之销毁对应的进程 (进程就可以看成是一个程序执行的"过程")进程是操作系统对一个正在运行的程序的一原创 2021-11-22 20:56:51 · 1096 阅读 · 9 评论 -
初识哈希表【数据结构】
哈希表概念哈希冲突哈希冲突处理方法:概念前言举例:给定多干个整数[0,99],在给定一个数字 n,判断 n 是否出现在刚才的集合中1.基于顺序表: 可以用一个数组保存若干个整数,拿着 n 在数组中依次遍历,进行比较 — O(N)2.基于链表: 可以用一个链表保存若干个整数,拿着 n 在链表中依次遍历,进行比较 — O(N)3.基于二叉搜索树: 可以用一个二叉搜索树来保存这些整数,按照二叉搜索树的方式进行查找比较 — O(N) (比较理想的情况:OlogN)更高效的办法: 仍然创建一个 bo原创 2021-11-05 20:36:34 · 2094 阅读 · 3 评论 -
二叉树的三种非递归遍历方式
前言:在之前,我们写到了二叉树的递归 先、中、后序的遍历方式,今天,来讨论这三种遍历方式的非递归实现!!先序遍历思路: 类似于层序遍历创建一个栈,先把根节点入栈循环取栈顶元素,并访问(打印)把当前节点的左 / 右子树分别入栈当栈为空时,遍历结束代码实现:public List<Integer> preorderTraversal(Node root) { List<Integer> result = new ArrayList<>();原创 2021-11-04 12:56:50 · 486 阅读 · 4 评论 -
二叉搜索树 【数据结构】
二叉搜索树概念特点基本操作1.插入元素2.查找元素3.删除元素概念二叉搜索树是一种特殊的二叉树特点左子树中的值都小于根节点,右子树中的值都大于根节点故:中序遍历结果就会得到一个有序序列最大的特点:就是能够高效的进行查找元素查找过程类似于二分查找:先从根节点出发开始比较,看待查找元素是小于根节点还是大于根节点,进一步决定是去左子树中找,还是右子树查找的时间复杂度:O(N) (单支树)解决方案:采取更加平衡的二叉搜索树,AVL树(绝对平衡),红黑树基本操作1.插入元素其实和查找非常相似,原创 2021-11-01 20:51:04 · 7739 阅读 · 21 评论 -
Map 和 Set 【数据结构】
Map 和 Set1.标准库:TreeSet,TreeMap,HashSet,HashMap2.二叉搜索树:对应TreeSet TreeMap 底层实现3.哈希表:对应 HashMap,HashTree 底层实现搜索Map 和 Set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关模型一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为 Key-value 的键值对,所以模型会有两种纯 key 模型 :即,我们 Set 要解决的原创 2021-10-26 17:35:35 · 648 阅读 · 14 评论 -
Java对象的比较【数据结构】
对象比较:1.比较身份 ==2.比较值 equals(通过用户手动重写,才能够按照值比较)equals若没有手动重写,默认执行的就是object版本中的equals,比较规则也是在比较身份3.比较类型 instanceof原创 2021-10-24 08:00:00 · 746 阅读 · 13 评论 -
排序【数据结构】
排序 概念:排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作排序规则:一般是升序降序排列,若待排序元素比较复杂,就会有更复杂的排序方式常见排序算法:插入排序:直接插入排序插入排序基于顺序表的插入来实现的直接插入排序的基本操作是将一个记录插入到已排好序的有序表里,从而得到一个新的、记录数+1的有序表时间复杂度 —— O(N2)空间复杂度 —— O(1)稳定性: 稳定排序举例:代码示例:public static void insertSo原创 2021-10-22 10:36:26 · 1191 阅读 · 36 评论 -
优先级队列-堆【数据结构】
前言:我们之前学习的普通的队列,元素是先进先出;而优先级队列,是按照顺序进,优先级最高的先出队列,优先级相同再遵循先进先出优先级队列,名字叫队列,本质上是一个特殊的二叉树(堆)举例:幼儿园放学时,家长去接娃,整整齐齐的排着队等着进去接娃,突然来了一位校领导进学校有事….二叉树的顺序存储之前我们学习了二叉树的表示方法:左右孩子表示法,每个节点均记录左右子树的根节点引用除此之外,我们也可以使用数组来表示一棵树使用数组存储这棵树的层序变量结果(包含空节点)但是,使用数组来表示树,可能会原创 2021-10-16 16:44:09 · 964 阅读 · 26 评论 -
二叉树相关面试题【数据结构】
题目基础面试题二叉树的前序遍历二叉树的中序遍历进阶面试题基础面试题二叉树的前序遍历题目:在线OJ思考:首先,我们要了解,前序遍历就是按照顺序:根节点—左子树—右子树的方式遍历树(根左右)在访问左右子树的时候,按照上述同样的方法遍历,因此我们可以考虑使用模拟递归来解决创建一个 List,将根节点的元素加入到 List 中递归遍历左子树,把左子树的遍历结果加入到 List 中递归遍历右子树,把右子树的遍历结果加入到 List 中最后返回这个 List 即可代码实现:public L原创 2021-10-10 21:59:54 · 1424 阅读 · 35 评论 -
树及二叉树【数据结构】
树形结构我们之前研究的基本都是一对一的问题,而树是一种非线性数据结构,它是由n(n≥0)个结点组成的具有有层次关系的有限集特点:当 n=0 时,称为空树,在任何一个非空树中:有且只有一个根结点当 n>1 时,其余结点可分为 m(m>0) 个互不相交的有限集T1,T2,…Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree),每棵子树的根节点有且只有一个前驱,可以有0个或多个后继如图所示:.树是递归定义的概念名称概念结点的度:一个节原创 2021-10-07 16:17:49 · 1212 阅读 · 23 评论 -
栈和队列相关面试题
前言:上篇文章介绍了栈和队列及其相关操作,本篇通过几个面试题,来进一步掌握栈和队列~目录括号匹配问题用队列实现栈用栈实现队列实现一个最小栈设计一个循环队列括号匹配问题题目:在线OJ用队列实现栈题目:在线OJ用栈实现队列题目:在线OJ实现一个最小栈题目:在线OJ设计一个循环队列题目: 在线OJ...原创 2021-10-03 14:51:29 · 867 阅读 · 43 评论 -
栈和队列 【数据结构】
前言: 栈和队列都是基于List(线性表)来实现的,且其限制比List更严格(提供的操作更少),即 List 比站栈和队列更灵活栈的实际应用场景非常多,队列的实际应用场景更多目录栈 (Stack)概念栈的实现队列 (Queue)概念队列的实现以链表为例 不带傀儡节点以数组为例循环队列(高效操作)栈和队列的方法栈 (Stack)概念栈是限定仅在末尾进行插入和删除操作的线性表,表尾指栈顶,而不是栈底栈限制了线性表的插入和删除位置,它始终在栈顶进行则:栈底是固定的,最先进栈的只能在栈底先进后出只支原创 2021-09-29 15:05:39 · 918 阅读 · 24 评论 -
扑克牌练习 【数据结构】
前言: 之前学了List常用的方法,下面就是用List来完成扑克牌练习~通过扑克牌这个练习,进一步来掌握 List 的一些用法!炸金花练习—目录思路代码实现:创建一张牌—Card类创建一副牌主类代码:输出示例:思路在我们动手写代码之前,我们需要思考扑克牌应该有什么?联想到我们平时玩扑克牌一张牌:有花色和点数两个属性,那么我们可以创建一个类Card,来表示一张牌一副牌:一张牌是一个 Card,那么一些牌放在一起就组成了一副牌,就可以创建一个 List< Card > ,返回结果是原创 2021-09-27 17:20:52 · 1971 阅读 · 30 评论 -
Java—List的使用【数据结构】
List - 线性表List 常用方法总览:List 接口继承于Collection接口List 特指:线性表这一类数据结构,而List的典型实现有:Vector,ArrayList 和 LinkedList三个其中 Vector 和 ArrayList 表示顺序表,而 LinkedList 表示链表List 常用方法...原创 2021-09-26 22:23:18 · 3486 阅读 · 20 评论 -
118.杨辉三角【LeetCode】
题目杨辉三角给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和.示例1输入:numRows = 5输出: [ [1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1] ]示例2输入:numRows = 1输出: [ [1] ]动图演示:思考:重点在于找规律!!第1行固定,一个1第2行固定,两个1第 i 行,收尾元素 固定为1第 i 行,有 i 个元素对于第 i 行来说原创 2021-09-26 22:02:57 · 260 阅读 · 22 评论 -
简单介绍-泛型和包装类【数据结构】
泛型什么是泛型?背景:为了能够写一个类 / 一个方法,就能够同时支持多种不同类型的对象所谓的泛型,就是从语法层面对 Object 进行了一个简单的包装,编译过程可以帮我们自动加上一些编译期的类型检查,自动帮我们完成一些类型转换工作举例:ArrayList 就是一个泛型的实例,可以聚集任何类型的对象使用 Object,因为在 Java 中,Object 是所有子类直接 / 间接继承的父类public class ArrayListTest { private Object[] data;原创 2021-09-25 22:19:27 · 613 阅读 · 12 评论 -
Map 接口常用操作【数据结构】
理解 Map 接口Map 中存储的是键值对(Key Value),通过Key 来找到相应的 Value其中 key 要求是不能重复的Map 常用操作:原创 2021-09-19 21:00:26 · 870 阅读 · 20 评论 -
Collection接口常用操作【数据结构】
Collection 接口概念:collection 即单列集合用来存储管理一组对象 objects,这些对象一般被称为元素 elements,统一定义了一套单列集合的接口Collection 常用操作:1.创建 Collection对象:import java.util.ArrayList;import java.util.Collection;public class TestCollection { public static void main(String[] args)原创 2021-09-19 14:49:43 · 1269 阅读 · 24 评论 -
Java—内部类详解
目录内部类概念内部类的分类:成员内部类普通内部类静态内部类局部内部类匿名内部类内部类概念在 Java 中,将一个类定义在另一个类的内部,称为内部类就是在一个类内部进行其他类结构的嵌套操作内部类也是封装的一种体现举例://外部类public class OutClass { //内部类 class InnerClass{ }}注意:内部类和外部类共享一个 java源文件,但是经过编译之后,会形成各自单独的字节码文件内部类的分类:成员内部类原创 2021-09-18 12:47:11 · 405 阅读 · 22 评论 -
Java—代码块详解
代码块概念代码块分类普通代码块构造代码块静态代码块同步代码块代码块概念在java中,{ } 括起来的代码被称为代码块代码块分类普通代码块类中方法的方法体public class Main{ public static void main(String[] args) { { ...普通代码块 } }}普通代码块使用不多,这里不过多讲解构造代码块也叫:实例代码块定义在类中的代码块(不加修饰符)构造代码块一般用于初始化实例成员变量public class P.原创 2021-09-17 15:28:33 · 2991 阅读 · 21 评论 -
Java—了解编译原理 (前端编译)
目录Java前端编译1.词法分析2.语法分析3.语义分析4.生成中间代码前端编译优缺点:Java后端编译Java前端编译把Java源码文件编译成class文件的过程:. java → . class1.词法分析词法分析阶段是编译过程的第一个阶段这个阶段的任务是将代码中的语句分割成一个一个的字符,从左到右一个字符一个字符地读入源程序,将字符序列转换为标记序列 (Token序列)但是:词法分析器通常不会关心标记之间的关系 (语法分析的范畴)2.语法分析用词法分析产生的字符,构造一棵"语法树",原创 2021-09-17 15:24:40 · 760 阅读 · 14 评论 -
Java—集合框架图
Java集合框架图关系: 接口与接口:extends; 类和接口:implements注意:Collection :用来存储管理一组对象 objects ,这些对象一般被成为元素 elementsSet : 元素不能重复,背后隐含着查找 / 搜索的语义,若有重复,只算一个SortedSet : 一组有序的不能重复的元素List : 线性结构Queue : 队列Deque : 双端队列Map : 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语原创 2021-09-15 11:32:28 · 1005 阅读 · 8 评论 -
怎么证明未显式定义构造方法时,编译器会自动生成无参的构造方法?
在和类和对象篇提到:当没有显式定义构造方法,编译器会自动提供一个没有参数的构造方法若类中定义了构造方法,则默认的无参构造不再产生本篇博客就带大家一起来验证~原创 2021-09-10 15:02:20 · 1138 阅读 · 40 评论 -
jclasslib 插件安装及使用
学习Java,必须要了解 JVM,而学习 JVM 知识时,总要去研究一些字节码指令而 jclasslib 这个插件很好的解决了这个问题jclasslib安装:1.打开设置或者按Ctrl + Alt +S,打开设置2.找到 jclasslib 插件点击 install 下载安装即可3.安装完重启,然后点击视图:4.打开 jclasslib,即可看到相关的汇编指令2.jclasslib 结构分析:上图方法包含了此Java文件中包含的所有方法而展开后,< init >代表原创 2021-09-10 14:59:09 · 12826 阅读 · 23 评论 -
Java—抽象类和接口
抽象类与接口抽象类定义和语法理解抽象类作用抽象类总结:接口概念接口特性注意事项:实现多个接口抽象类和接口类的区别?抽象类定义和语法包含抽象方法的类,叫做抽象类 需要用abstract修饰这个类在Java中,一个类如果被 abstract 修饰类称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法可以没有具体的实现抽象类中可以包含其他非抽象方法,也可以包含字段,非抽象方法和普通方法的规则是一样的,可以被重写,也可以被子类直接调用//抽象类abstract class Sh原创 2021-09-07 16:09:38 · 1014 阅读 · 41 评论 -
深度剖析—继承和多态
之前提到OOP语言的基本三大特性:继承、封装、多态本篇重点讨论:继承和多态继承什么是继承?先举一个例子:class Animal{ public String nama; public void eat(){ System.out.println("Animal::eat()"); } public void sleep(){ System.out.println("Animal::sleep()"); }}class C原创 2021-09-05 15:00:47 · 1196 阅读 · 38 评论 -
Java实现双向链表的基本操作
Java实现无头双向链表双向链表节点的定义1.链表的打印2.头插法3.尾插法4.任意位置插入5.查找链表中是否包含关键字 key6.删除第一次出现关键字为 key 的节点8.链表长度介绍:双向链表比单链表多了一个 prev(前驱) 域,指向前一个节点data:数据next:后继信息prev:前驱信息.无头双向链表图解:双向链表节点的定义class Node{ public int data;//数据 public Node next;//后继信息 publ原创 2021-09-02 14:08:02 · 1048 阅读 · 31 评论 -
Java实现单链表
上篇博客我们实现了顺序表的所有操作,而顺序表存在以下问题:顺序表中间 / 头部的插入 / 删除,时间复杂度为O(N)扩容需要申请新空间,拷贝数据,释放旧空间,会有不小的损耗扩容一般是呈两倍的增长,势必会有一定的空间浪费,例如,当前容量为100,满了后扩容到200,再继续插入5个元素,后面没有元素插入,那么就浪费了95个数据空间为了避免上述的这些缺点,引入了链表,通过本篇博客的学习,我们要熟悉单链表的使用链表定义:链表是一种物理存储结构上非连续存储结构,是Java数据结构中一种很基础很常见原创 2021-08-24 18:52:08 · 668 阅读 · 21 评论 -
Java实现顺序表
提高代码量,理解面向对象思想线性表(List)定义:零个或多个具有相同特性的数据元素的有限序列常见的线性表有:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就是说是连续的一条直线,但在物理结构上不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储// An highlighted blockvar foo = 'bar';顺序表:顺序表是用一段物理地址连续的存储单元依次存储元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删改查,顺序表的底层.原创 2021-08-21 16:28:44 · 2054 阅读 · 13 评论 -
Java - 类和对象
认识类和对象1.类、对象是什么?类在Java中,也叫做自定义类型。类就是一类对象的统称,对象就是这一类具体化的一个个例可以把类想象成一个模板,把对象想象成实体,比如:建房子,会有图纸,然后根据图纸去建房子,一张图纸可建很多同样的房子。而图纸就是"类",建的房子就是"实体",通过一个类可以产生多个对象2.什么是面向对象?之前在初始Java篇简单讲述了Java的面向对象性,对比了面向对象和面向过程的不同这里就不多说了 :https://blog.youkuaiyun.com/m0_47988201/artic原创 2021-08-18 22:27:21 · 723 阅读 · 18 评论 -
a=a++理解
举例:int a = 10;int ret = a++; 先用a给ret赋值,再给a+1,此时ret:10; a:11int a = 10;int ret = ++a; 先给a+1,再用a给ret赋值,此时ret:11;a:11前置++和后置++单独使用,两个的效果是一样的,若取++后的值,则就不一样代码:public static void main(String[] args) { int a = 10; a = a++; System.out.println(a原创 2021-08-17 08:48:28 · 4834 阅读 · 10 评论 -
如何安装JDK和配置Java环境?
JDK和JREJDK:Java SE Development Kit Java开发工具JRE:Java Runtime Environment Java运行环境要使用Java编程,就需要电脑安装JDK,若仅仅是运行Java程序则只需JRE就可满足直接安装JDK就可以,因为在JDK的发布包中包含了一个独立的JRE,且JDK本身就内置有JREJDK的安装windows系统下,安装JDK,需注意电脑位数,若为32位操作系统,则需安装 jdk-xxx-windows-i586.exe,若为64位操作系统原创 2021-07-23 21:05:26 · 1515 阅读 · 23 评论 -
如何用记事本编写Java代码?
首先,在使用记事本编写代码的前提下,需要安装好JDK和配置好环境变量1.在记事本上写HelloWorld保证类名和文件名保持一致public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); }}2.更改文件扩展名文件的格式要改成以"java"结尾的,文件名称要叫HelloWorld,也就是:HelloWorld.java3.进入命令提示符工具原创 2021-07-22 23:32:53 · 9430 阅读 · 39 评论