- 博客(72)
- 收藏
- 关注
原创 注解
注解的定义注解通过@interface关键字来定义public @interface TestAnnotation {} //创建了一个名字为TestAnnotation的注解注解的应用@TestAnnotationpublic class Test {} //Test类定义时添加注解,提供信息给编译器:编译器可以利用注解来探测错误和警告信息编译阶段时的处理:软件工具可...
2019-12-03 18:08:32
257
1
原创 正则表达式
正则表达式定义:描述了一个规则,通过这个规则可以匹配一类字符串,需要学习正则表达式的语法规则用途:文本的复杂处理优势:一种强大而灵活的文本处理工具,大部分编程语言、数据库、文本编辑器、开发环境都支持正则表达式开发中使用正则的流程分析所要匹配的数据,写出测试用的典型数据在工具软件中进行匹配测试在程序中调用通过测试的正则表达式基本语法普通字符:字母、数字、汉字、下划线及没有特殊...
2019-12-03 18:00:04
208
原创 红黑树
红黑树的插入树为空,第一个插入的根节点应该是黑色;树不为空,新插入的节点应该是红色,然后检查parent,parent是黑色则插入完成;parent是红色,需要做红黑树的插入调整:红黑树的插入调整,先看叔叔节点的颜色叔叔节点是红色先把parent和uncle都涂成黑色,再将祖父节点涂成红色parent.color = blackuncle.color = blackpar...
2019-07-20 12:36:02
427
原创 AVL树
文章目录一、AVL树1、AVL树本质上还是一棵二叉搜索树,有以下的特点:2、为了达到节点的平衡,AVL树引入了四种旋转操作:AVL树一、AVL树 在计算机科学中,AVL树是最先发明的自平衡二叉搜索树,在AVL树中任何结点的两个子树的高度差不大于1,所以它也会被称为高度平衡树。增加和删除可能需要通过一次或多次树的旋转来重新平衡这个树。1、AVL树本质上还是一棵二叉搜索树,有以下的特点:首...
2019-07-13 15:15:59
311
原创 BST -- 二叉搜索树(Binary Search Tree)
文章目录一、BST树是具有下列性质的二叉树二、定义BST树三、BST的相关操作1.BST树的插入非递归插入递归插入2.BST树的删除非递归删除递归删除3.查询BST树中是否存在值为data的结点非递归方式查找递归方式查找4.返回BST树中所有结点的个数(递归方式)5.计算BST树的高度(递归方式)6.BST树的遍历前序遍历(VLR)中序遍历(LVR)后序遍历(RVL)层序遍历一、BST树是具有下...
2019-07-10 11:25:40
766
原创 MySQL -- 范式
一、需要明确数据库中相关的概念实体:现实世界中客观存在并可以被区别的事物,比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,比如说“老师与学校的关系”。属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性...
2019-06-19 17:56:22
544
原创 MySQL的介绍和常用的SQL语句
一、MySQL的介绍:MySQL属于数据库的一种,目前属于Oracle甲骨文公司MySQL称为关系型数据库、微软的SQL serverMySQL数据库是一种基于C/S模型即客户端和服务端模型;客户端通过账号密码连接服务器,连接成功后才可以数据库的操作(增删改查 - CRUD)MySQL的服务端是采用I/O复用+可伸缩的线程池实现了网络高并发的经典模型;二、MyS...
2019-06-19 17:14:40
279
原创 BIO -- 同步阻塞的编程方式
BIO编程方式通常是在JDK1.4版本之前常用的编程方式一、编程实现的过程: 先在服务端启动一个ServerSocket来监听网络请求,客户端启动Socket发起网络请求,默认情况下ServerSocket会建立一个线程来处理此请求,如果服务端没有线程可用,客户端则会阻塞等待或者遭到拒绝,并且建立好的连接,在通信过程中是同步的,在并发处理上效率较低; 同步并阻塞,服务器实现模式为一个连...
2019-06-18 15:46:02
324
原创 Unix提供的五种IO模型
用户发起read操作为例,有这样两步操作:等待数据准备;将数据从用户空间拷贝到用户空间;Unix提供的五种IO模型:阻塞IO非阻塞IOIO复用信号驱动IO异步IO...
2019-06-18 12:06:10
228
原创 TCP -- 三次握手、四次挥手
TCP建立连接和终止连接会涉及到TCP首部的确认字段,相关知识在上一篇博客里:https://mp.csdn.net/mdeditor/90704793#一、三次握手 – 建立一个TCP连接三次握手过程:客户端发起,第一次握手时,SYN=1(指明客户端打算连接的服务器的地址),客户端发起第一次握手后处于SYN-SENT状态;服务端接收到消息后,发起第二次握手作为应答,SYN=1,ACK=...
2019-05-31 17:52:52
210
原创 UDP -- 用户数据报协议
一、UDP协议:User DatagramProtocol 一种无连接的传输层协议,提供面向事务的简单不可靠的信息传送服务特点:非面向连接,传输不可靠,可能丢失数据;数据传输时不会进行事前连接和事后断开连接;发送方不管对方是否准备好,接收方收到也不会确认;可以广播发送;非常简单的协议,开销小; 进程的每个输出操作都正好产生下一个UDP数据报,并组装成一份待发送的IP数据报,...
2019-05-31 17:26:55
227
原创 TCP --传输控制协议
一、TCP为应用层提供的服务TCP是一种面向连接的、可靠的字节流服务: 面向连接意味着两个使用TCP的应用(通常是Server和Client),在彼此交换数据之前必须先建立一个TCP连接; TCP通过下列方式来提供可靠性:应用数据被分割成TCP认为最适合发送的数据块(UDP应用程序产生的数据报长度是保持不变的),由TCP传递给IP的信息单位称为报文段或段(segment);当TCP...
2019-05-30 20:18:43
355
原创 基于UDP协议的Socket的网络编程模拟一对一的在线交流
一、需求:老师和学生在线一对一交流二、分析:使用基于UDP协议的Socket网络编程实现;不需要利用I/O流实现数据的传输;每个数据发送单元被统一封装成数据包的方式,发送方将数据;包发送到网络中,数据包在网络中去寻找它的目的地;三、发送端思路:1、使用DatagramSocket 指定端口,创建发送端;2、将基本类型 转成字节数组;3、封装成DatagramPacket包...
2019-05-30 19:32:50
547
1
原创 使用基于TCP协议的Socket编程模拟多用户网络登陆
一、需求:完成多用户网络登陆功能用户输入用户名密码,服务器给出登陆成功或失败的提示二、分析:使用基于TCP协议的Socket网络编程实现TCP协议基于请求-响应模式在网络通信中,第一次主动发起通讯的程序被称作客户端(Client)程序第一次通知等待连接的程序被称为服务器端(Server)程序利用IO流实现数据的传输三、服务器端思路1、指定端口,使用Serve...
2019-05-30 19:12:50
963
原创 OSI、TCP/IP模型及网络相关基础知识
网络: 将不同区域的电脑连接在一起,组成局域网、城域网、广域网,把分布在不同地理区域的计算机与专门的外部设备用通信线路互联成一个规模大、功能强的网络系统,从而使众多的计算机可以方便的互相传递信息,共享硬件、软件、数据信息等资源。功能:资源共享信息传输与集中处理负载均衡与分布处理通讯协议: 计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤...
2019-05-30 17:32:06
295
原创 线程池
一、为什么要有线程池 使用线程的时候就去创建一个线程,这样很方便,但是如果并发数量很多,每一个线程都是经过短暂的使用就结束,这样频繁的创建和销毁线程需要时间,就会降低系统的效率; 为了减少创建和销毁线程的次数,让每个线程可以多次使用,线程池可以使线程得以复用,在执行完一个任务之后不被销毁,而是可以继续执行其他任务,这样可以根据系统情况调整执行的线程数量,防止消耗过多内存。优点:降低资...
2019-05-09 00:39:18
195
原创 ConcurrentHashMap
ConcurrentHashMap是线程安全且高效的HashMap,不了解HashMap的童鞋可以戳这篇文章HashMap源码解析(JDK 1.7)一、使用ConcurrentHashMap的原因1、 HashMap不能搞保证线程安全,在并发编程中使用HashMap进行put操作会导致程序进入死循环 多线程会导致HashMap中的Entry形成环形链表,那么Entry.next永远不为nu...
2019-04-26 13:22:20
379
原创 LinkedBolckingQueue
LinkedBolckingQueue LinkedBlockingQueue是一个用链表实现的有界阻塞队列。此队列的默认和最大长度为Integer.MAX_VALUE。此队列按照先进先出的原则对元素进行排序。原理: LinkedBlockingQueue底层维持着两把锁,putLock用于put操作添加元素,takeLock用于take操作移除元素,同一时刻只能有一个线程进行put操作...
2019-04-25 00:15:39
475
原创 ArrayBlockingQueue
ArrayBolckingQueue ArrayBlockingQueue是一个用数组实现的有界阻塞队列。此队列按照先进先出(FIFO)的原则对元素进行排序。 ArrayBlockingQueue内部只有一把锁,就是说同一时刻只能有一个线程可以进行put或者take操作。 默认情况下不保证线程公平的访问队列,所谓公平访问队列是指阻塞的线程,可以按照阻塞的先后顺序访问队列,即先阻塞线程先...
2019-04-25 00:15:17
359
原创 阻塞队列---BlockingQueue
BlockingQueue1、BlockingQueue类的结构2、继承关系public interface BlockingQueue<E> extends Queue<E> BlockingQueue继承自Queue接口,在此基础上增加了阻塞操作,可以支持两个附加操作:支持阻塞的加入方法:在队列满的时候添加元素会被阻塞,直至队列可以添加成功才返回(put(...
2019-04-24 23:26:19
163
原创 线程间通信
引入:每个线程都拥有自己独立的栈空间,从线程被启动到终止,如果每个运行中的线程都是独立的运行那只能带来很少的价值,我们需要多个线程彼此之间相互协作的来完成工作一、等待/通知机制 等待和通知的相关方法是任意Java对象都具备的,这些方法被定义在所有方法的超类java.lang.Object上;方法名称描述wait()调用该方法的线程进入WAITING状态,只有等待另外线...
2019-04-24 18:15:38
241
原创 重入锁ReentrantLock
一、ReentrantLock 重入锁ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。在同步器中,当一个线程调用Mutex的lock()方法获取锁之后,如果再次调用lock()方法,则该线程将会被自己所阻塞,原因是Mutex在实现tryAcquire(int acquires)方法时没有考虑占有锁的线程再次获取锁的场景,而在调用try...
2019-04-23 14:00:53
192
1
原创 锁的升级与对比
为减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在JavaSE 1.6中,锁一共有4中状态,级别从高到低依次是:无锁状态–>偏向锁状态–>轻量级锁状态–>重量级锁状态,这几个状态会随着竞争逐渐升级。注意:锁只可以升级,但不能降级,即轻量级锁升级为重量级锁后不能再降级为轻量级锁;这种锁只能升级不能降级的策略,目的是为了提高获得锁和释放锁的效率;一...
2019-04-22 23:55:05
207
原创 Java对象头
一、Java对象头锁存在Java对象头中,如果对象是数组类型,则虚拟机用3个字宽(Word)存储对象头,如果对象是非数组类型,则用2字宽存储对象头。在32位虚拟机中,1字宽等于4字节,即32bit如果对象是数组类型,则虚拟机用3个字宽(Word)存储对象头,如果对象是非数组类型,则用2字宽存储对象头。在32位虚拟机中,1字宽等于4字节,即32bit...
2019-04-22 23:30:44
191
原创 CAS
CAS(compare and swap):Java中通过循环CAS的方式来实现原子操作一、乐观锁和悲观锁1. 悲观锁: 总假设是最坏的情况,每次对数据的操作都会担心数据被其他线程修改(不一定会被修改),所以在每次操作时都需要加锁操作,只有获取锁的线程才能操作该数据,当其他线程想要,操作该数据就会被阻塞(synchronized锁是悲观锁的体现)点击synchronized关键字;使...
2019-04-20 19:26:57
185
原创 原子操作
一、原子操作1. 定义 原子(atomic)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。2. 处理器如何实现原子操作1)使用总线锁保证原子性 总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以...
2019-04-20 18:36:14
1334
原创 Synchronized关键字
一、线程同步 线程同步:当两个或两个以上线程访问同一资源时,需要某种方式来确保资源在某一时刻只被一个线程使用; 处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象,这时候就需要用到线程同步,线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面的线程使用完毕后,下一个线程再使用; 由于同一进程的多个线程共享同一块存储空间,在...
2019-04-19 17:23:25
335
原创 volatile关键字
一、先看一个例子:统计一秒内可以进行多少次加操作public class TestVolatile { static boolean flag = false; static class subThread extends Thread { @Override public void run() { System.out.p...
2019-04-16 15:36:10
190
原创 线程控制方法
线程的常用方法Thread t = new Thread(); 1. 启动线程 shart()t.stat(); //启动线程2. 停止线程注意:不建议使用stop()和destory()方法(已过时),调用其可能会产生不可预料的结果;线程停止有两种情况:线程体执行结束时线程结束;人为干预,典型做法是提供一个boolean类型的终止变量,当这个变量置为false,终止线...
2019-04-15 18:03:17
787
原创 leetcode[034] -- 在排序数组中查找元素的第一个和最后一个位置
一、题目给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7...
2019-04-11 00:14:44
224
1
原创 线程状态和生命周期
一、线程状态线程在生命周期中可以处于下列状态之一,对应于java.lang.Thread.State枚举新建状态(new):用new语句创建的线程处于新建状态,尚未启动,此时它和其他Java对象一样,仅仅在堆区中被分配了内存;就绪状态(Runnable) :当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态,Java虚拟机会为它创建方法调用栈和程序计数器。...
2019-04-10 23:39:46
221
原创 leetcode[141] --环形链表
一、题目给定一个链表,判断链表中是否有环;为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [1,2], pos =...
2019-04-09 01:01:24
133
原创 leetcode[160] --相交链表
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
2019-04-09 00:45:10
154
原创 leetcode[707] -- 设计链表的实现
一、题目设计链表的实现可以选择使用单链表或双链表;单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用;如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的;在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如...
2019-04-07 23:47:33
480
原创 leetcode[237] -- 删除链表中的节点
一、题目请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。现有一个链表 – head = [4,5,1,9],它可以表示为:示例 1:输入: head = [4,5,1,9], node = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示...
2019-04-03 23:31:38
150
原创 leetcode[021] -- 合并两个有序链表
一、题目将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4二、编码 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ...
2019-04-03 16:42:01
113
原创 leetcode[019] -- 删除链表的倒数第N个节点
一、题目描述给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。/** * Definition for singly-linked list....
2019-04-03 16:30:43
98
原创 线程的创建以及常用的方法
一、创建线程的方式有以下三种:继承Thread类实现Runnable接口 少用继承多用实现实现Callable接口1. 继承Thread类的方式创建新线程创建自定义的类继承Thread类,并且重写方法;实例化自定义类;通过实例化对象调用start方法,来创建新线;public class ExtendsThread extends Thread...
2019-04-02 18:53:49
213
原创 进程与线程
一、进程与线程1. 先看下概念进程:是资源进行分配的单位,是具有一定独立功能的程序关于某个数据集合上的一次运行活动,换句话说,在操作系统中运行中的程序就是进程;线程:是进行资源调度和执行的单位 ;2. 进程与线程的区别区别进程线程根本区别作为资源分配的单位调度和执行的单位开销每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销线程可以看成...
2019-04-02 00:20:21
172
原创 优先级队列
一、优先级队列优先级队列是零个或多个元素的集合,每个元素都有一个优先级;优先级队列:在入队列时,给每个元素都分配一个数字来标记其优先级,假设数字越小,对应元素的优先级越高,这样就可以在一个元素集合中访问优先级最高的元素并对其进行查找和删除操作。对优先级队列执行的操作有插入(入队)出队(删除优先级最高的元素)删除 (指定优先级的元素)查找(指定优先级的元素)查找队首的元...
2019-04-01 19:13:56
166
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人