![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
文章平均质量分 79
小白猿同学
在校大学生
展开
-
字符串比较解析
字符串比较现有以下代码,需要分析其结果String s0 = "red";String s1 = "re";String s2 = "d";String s3 = s1 + s2;System.out.println(s0 == ("re" + "d"));//1System.out.println(s0 == s3);//2结果如下:truefalse为什么会这样呢?接下来我们一一分析对于 s0 == (“re” + “d”) 来说,由于"re" "d" 都是字符串常量,原创 2021-09-27 20:40:52 · 99 阅读 · 0 评论 -
线程安全问题
线程安全在谈什么是线程安全的问题之前,先给大家举一个线程不安全的例子,直接上代码public static void main(String[] args) throws InterruptedException { int count=0; //分别创建两个线程,对同一个对象进行自增5w次操作 Thread t1 = new Thread() { @Override public void run原创 2021-09-25 15:43:44 · 159 阅读 · 0 评论 -
网络编程-协议
33. 网络原理1. 协议的定义我们来看看百度百科给的定义 协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。 为了使数据在网络上从源到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议(protocol),它最终体现为在网络上传输的数据包的格式。 协议往往分成几个层次进行定义,分层定义是为了使某一层协议的改变不影响其他层次的协议。2. 为什么原创 2021-09-09 00:00:10 · 412 阅读 · 0 评论 -
Java阻塞队列
阻塞队列1. 什么是阻塞队列?阻塞队列,顾名思义,它就是一个队列,其在并发情况下,在队列的基础上可以实现**“阻塞”**功能当阻塞队列满的时候,向队列中插入元素的线程将被阻塞,直到其他线程从队列中取出元素当阻塞队列为空的时候,从队列中取出元素的线程被阻塞,直到其他线程向队列中插入元素如上图所示,如果队列已满,线程1将被阻塞,无法put(插入)元素,如果队列为空,线程2将被阻塞,无法take(取出)元素。2.为什么使用阻塞队列?在并发情况下,我们可以不需要关心什么时候需要阻塞线程,什么时候原创 2021-09-06 12:17:44 · 100 阅读 · 0 评论 -
Java手动实现线程池
1. 为什么使用线程池? 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。2. 如何实现?创建一个阻塞队列,用于组织任务,如果队列中的任务数量小于线程池允许的最大线程数原创 2021-09-06 12:15:38 · 545 阅读 · 0 评论 -
手动实现Java定时器
上一篇我们学到了了阻塞队列,这一篇我们将使用阻塞队列和以前提到的优先队列结合体阻塞优先队列来实现一个常用的定时器案例。1. 什么是定时器? 定时器可以强制终止请求:浏览器内部都有一个定时器,发送了请求之后,定时器就开始计时。如果在打开浏览界面的时候,浏览器的响应时间过了响应时间,就会强制终止请求。 在日常生活中,闹钟就是一个常见的定时器,在我们设定好的时间,闹钟就会自动响起,并且无论设置闹钟时间的前后,设置的哪个时间先到就先响起。(比如先设置了一个14:00的闹钟,后设置了一个13:00的闹钟,1原创 2021-09-06 12:15:05 · 383 阅读 · 0 评论 -
Mysql 事务
Mysql 事务1.事务是干啥举个栗子,例如银行账户转账业务,现在张三现在要给李四转账100元,简化后分为以下主要两个步骤:张三的账户减掉100李四的账户加上100如果这两个步骤都执行成功,那么转账才算成功,如果只执行了第一步**(张三减了李四没有加,100块凭空消失)或者只执行了第二步(张三没有减李四加了,凭空多出100块)**,那么转账就是有问题的。事务就是为了避免出现上述情况,即一个业务中的几个流程只有部分执行成功了。2. 事务的概念事务是一组SQL语句,这组语句要么全部执行成功,原创 2021-09-06 12:12:45 · 49 阅读 · 0 评论 -
懒汉式单例模式、饿汉式单例模式 以及 解决如何懒汉式单例模式线程安全问题
单例模式文章目录单例模式1. 定义2. 如何使用单例模式3. 单例模式的实现3.1 饿汉式3.2 懒汉式4. 线程安全问题5. 解决懒汉式线程安全问题1. 定义什么是单例模式呢? 我们引用一下维基百科: 单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其原创 2021-08-29 19:54:57 · 465 阅读 · 1 评论 -
多线程创建
多线程1. 创建线程的方式 public static void main(String[] args) { //1.显示继承Thread类,重写run方法 myThread t1 = new myThread(); t1.start();//启动线程 //2.使用匿名内部类实现 Thread接口 Thread t2 = new Thread() { @Override原创 2021-08-28 21:53:07 · 59 阅读 · 0 评论 -
并发与并行
并发与并行1. 为什么会有并发和并行?在了解并发并行之前,我们首先需要知道,为什么会有并发和并行?现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。所谓的多任务,就是操作系统可以同时运行多个任务。操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制原创 2021-08-28 21:51:58 · 78 阅读 · 0 评论 -
进程与线程
进程与线程1. 定义(反正我是看不懂)进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含原创 2021-08-28 21:46:15 · 193 阅读 · 3 评论 -
JDBC(JAVA数据库连接)
JDBC (JAVA数据库连接)1.定义jdbc(Java数据库连接)是一种用于执行SQL语句的Java API,由一组用Java语言编写的类和接口组成。它可以为多种关系数据库提供统一访问,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,实现了所有这些面向标准的目标并且具有简单,严格类型定义且高性能实现的接口。2. 使用前准备在开发环境中加载指定数据库的驱动程序。(以Mysql为例,下载MySQL支持JDBC的驱动程序)官方下载地址:https://downloa原创 2021-08-22 10:40:33 · 214 阅读 · 0 评论 -
二叉树的前中后序遍历分析(非递归实现)
二叉树的前中后序遍历(非递归实现)之前我们已经提到过了二叉树的前中后序三种遍历方式,今天我们将采用非递归的方式来实现。1. 前序遍历我们需要借助 栈 这种数据结构来达到 递归 的目的1.1 分析首先我们将 根节点 入栈循环取栈顶元素同时出栈,并将栈顶元素添加到结果集合中判断当前节点的右孩子是否为空,非空入栈判断当前节点的左孩子是否为空,非空入栈1.2 举例说明下面我们通过一个具体的例子来说明,如下图所示首先我们将根节点A入栈,然后进入循环首先打印A接着判断其右孩子( C原创 2021-08-13 12:38:17 · 183 阅读 · 0 评论 -
11.层序遍历
层序遍历1. 题目描述给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。LeetCode链接2. 分析此题的层序遍历和之前的普通层次遍历不同,此题要求返回值为List<List>,即将每一层元素存储到一个List集合中,再将每一个List集合存储到一个大的集合中,示例可以很明显的看出。因此,我们每一行都需要创建一个集合来存储对应行的节点数据,根据之前的层次遍历思路,代码如下3. 代码 //定义存储结果的集合(集合中的每一元素为一个L原创 2021-08-03 21:33:27 · 89 阅读 · 0 评论 -
二叉树练习
二叉树面试题1. 判断两棵树是否相同题目描述:LeetCode链接给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。分析: 我们要判断两个树是否相同,我们首先就要判断其根节点是否相同,如果根节点相同再依次判断其左右孩子是否相同,如果左右孩子相同,再递归判断其左右孩子的左右孩子是否相同,以此类推。我们发现,这需要采用递归的方法来解决。综上,代码如下 public boolean isSameTree原创 2021-08-04 16:59:35 · 306 阅读 · 0 评论 -
10.判断一个树是否为完全二叉树
判断一个树是否为完全二叉树1. 完全二叉树定义完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。一棵二叉树至多只有最下面的一层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边的若干结点缺失的二叉树,则此二叉树成为完全二叉树。2. 如何判断?根据定义,我们可以知道,完全二叉树的判断可以分为两个阶段第一阶原创 2021-08-03 21:31:17 · 510 阅读 · 0 评论 -
排序算法1
排序算法1. 冒泡排序1.1 定义冒泡排序,是比较简单的一种排序算法。它的命名源于它的算法原理:重复的从前往后(或者从后往前),依次比较记录中相邻的两个元素,如果他们顺序错误就把它们交换过来,直到没有再需要交换的元素,就说明该记录已完成排序。它看起来就像是把最大的元素(或最小的元素)经由交换慢慢的‘浮’到数列的顶端,故名冒泡排序。1.2 算法步骤比较相邻元素,如果第一个比第二个大,就交换它们两个。(升序排序为例)对每一组相邻元素做同样的工作,从开始到最后一对,这时最后的元素应该会是最大原创 2021-07-30 19:59:09 · 117 阅读 · 0 评论 -
二叉树的基本操作
二叉树的基本操作二叉树的前中后序遍历前面已经提过,本文中只将其LeetCode代码展示1. 二叉树的前序遍历LeetCode链接public List<Integer> preorderTraversal(TreeNode root){ ArrayList<Integer> list = new ArrayList<>(); if (root == null)//如果为空直接返回 { return null;原创 2021-07-26 09:32:09 · 41 阅读 · 0 评论 -
数据结构-树
树1、树形结构1.1 树的定义 树是一种数据结构,它是由n(n≥1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。1.2 树的基本概念空集合也是树,称为空树。空树中没有节点;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;节点的度:一个节点含原创 2021-07-26 09:29:56 · 282 阅读 · 0 评论 -
StringBuffffer 和 StringBuilder
StringBuffffer 和 StringBuilder 有时候需要由较短的子字符串构建字符串,例如按键或来自文件中的单词。如果采用字符串拼接的方式来达到这个效率会比较低,每次拼接字符串是都会构建一个新的String对象,既耗时又浪费空间。为此Java中使用StringBuffffer于StringBuilder类来避免这个问题的发生。在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 S原创 2021-07-26 09:28:05 · 171 阅读 · 2 评论 -
Java String 类
Java String 类1. 创建字符串常见的构造 String 的方式// 方式一:创建字符串最简单的方式如下:String str = "Hello Bit";// 方式二:和其它对象一样,可以使用关键字和构造方法来创建 String 对象// 如下为用构造函数创建字符串:String str2 = new String("Hello Bit");// 方式三:使用字符数组做参数用构造函数创建字符串char[] array = {'a', 'b', 'c'};String str3原创 2021-07-25 09:40:59 · 312 阅读 · 0 评论 -
数组的定义与使用
数组的定义与使用1. 数组的定义及声明 数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标(index,或称索引)可以访问数组中的每一个值。例如,如果A是一个整型数组,那么a[i]就是数组中下标为i的整数。 在声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字。下面是一个例子:int [] a; 不过这条语句只声明了变量a,并没有将a初始化为一个真正的数组。应该使用new 操作符来创建数组,如下int [] a= new int [100]; //原创 2021-07-22 15:52:27 · 2249 阅读 · 0 评论 -
Java基本数据类型
一、 Java基本数据类型Java语言提供了八种基本类型,六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。1. int(整型变量)基本语法格式int 变量名=初始值;默认值为0使用以下代码查看 Java 中的整型数据范围(其余数字类型同理,不过多赘述):System.out.println(Integer.MAX_VALUE); // int 的最大值System.out.println(Integer.MIN_VALUE); // int 的最小值原创 2021-07-22 15:51:17 · 120 阅读 · 0 评论