自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

深海的鱼

好的生活应该是平静的生活 生活的理想就是理想地生活

  • 博客(205)
  • 资源 (1)
  • 收藏
  • 关注

原创 Oracle数据库精讲(八)PLSQL、光标、例外

PLSQL:可以对SQL进行编程。开发工具:plsql developeroracle sql developerplsql:set serveroutput on;declare --定义变量、常量、光标(游标)、例外(自定义异常) psex char(3) := '男'; pname varchar2(10) (也可以不写死,emp.ename%type) ; emp_info emp%rowtype; begin //写代码 select ename into pname

2020-06-27 23:31:29 132

原创 Oracle数据库精讲(七)序列、索引、同义词

序列:模拟自增本质就是内存中的数组,默认长度为20创建序列create sequene 序列名increment by 步长start with 起始值maxvalue | nomaxvalueminvalue | nominvaluecycle | nocyclecache n | no cache ;//序列有两个属性nextval:下一个值currval:当前值序列会接着上一次的值 继续使用。循环序列不能用于给 主键/唯一约束的健 赋值。可能会出现裂缝:(断电、

2020-06-27 17:34:50 179

原创 Oracle数据库精讲(六)事务操作与隔离级别

事务概念:作为单个逻辑工作单元执行的一系列操作。四大特性:ACIDAtomicity原子性:要么都成功,要么都失败Consistency一致性:事务执行前后,总量保持一致Isolation隔离性:各个事务并发执行时,彼此独立Durability持久性:持久化操作事务的生命周期MySQL:自动提交,自动将每一条DML语句直接commitOracle:手工提交事务的开始标识:第一条DML事务的中间过程:各种DML操作结束有两种:a.提交(两种) i.显示提交:commit,ii.

2020-06-27 11:03:58 182

原创 Oracle数据库精讲(五)

三大范式NF:1NF:确保每列的原子性(不可再分)2NF:宏观:每张表只描述一件事情(例如,一个student表,描述的全部是学生字段)微观:通过2NF的定义,除了主键以外的其他字段,都依赖于主键3NF:微观:除了主键以外的其他字段,都不传递依赖于主键要满足第N范式,必须先满足N-1范式。三大范式可以帮助我们规范数据库的设计,好处是防止数据混乱、数据冗余(重复)缺点:很难严格排除所有不满足的表,并且难以拆分;会一定程度影响性能。建议:三大范式只是一个建议,不必严格遵守。

2020-06-27 01:24:11 98

原创 Oracle数据库精讲(四)约束

六种约束及列级表级约束常见6个约束检查约束(check) name > 4唯一约束(Unique) id:1 2 3 4 null主键约束(Primary key) 类似唯一约束外键约束(Foreign key) 两张表非空约束(Not null) 不能为null默认约束(Default) 默认值主键和唯一的区别:a. 主键不能为null,唯一可以为nullb.主键可以是符合主键,也可以是单值主键(id)c.一张表中只能设置一次主键(复合主键),但唯一健可以设

2020-06-27 00:00:05 192

原创 Oracle数据库精讲(三)

内连接多张表通过相同字段进行匹配,只显示匹配成功的数据。//1.select * from emp e,dept d where e.deptno=d.deptno;//2.select * from emp e inner join dept d on e.deptno=d.deptno;外连接左外连接以左表为基准(左表数据全部显示),去匹配右表数据,如果匹配成功,则全部显示;匹配不成功,显示部分(无数据部分用null填充)a.(oracle独有)select * fro

2020-06-26 18:50:55 158

原创 Oracle数据库精讲(二)

SQL语句的类型DQL:数据查询语言,selectDML:数据操作语言,insert、delete、update 可以回退(事务)DDL:数据定义语言,create / drop / truncate / alter tableDCL:数据控制语言,grant、revokeDML:增加数据insertinsert into 表名(字段名1,字段名2,...) values(字段值1,字段值2,...)批量插入数据1.创建新表(批量插入之前不存在)create table myca.

2020-06-26 00:50:56 138

原创 Oracle数据库精讲(一)

概述Oracle数据库是一种网络上的数据库,它在网络上支持多用户,支持服务器/客户机等部署(或配置)服务器与客户机是软件概念,它们与计算机硬件不存在一一对应关系,即:同一台计算机既可以充当服务器又可以充当客户机,或者,一台计算机只充当服务器或只充当客户机。安装超级管理员:sys/change_on_install普通管理员:system/manager普通用户:scott/tiger安装完成即可连接数据库。命令nvl(comm,0):相当于if,如果comm为null,则显示成

2020-06-25 23:08:10 232

原创 使用JProfiler工具分析OOM原因

在一个项目中,突然出现了OOM故障,那么该如何排除,研究为什么出错?能够看到代码第几行错:内存快照分析工具,MAT,JProfilerDebug,一行行分析代码MAT,JProfiler作用:分析Dump内存文件,快速定位内存泄露获得堆中的数据获得大的对象JVM参数:-Xms:设置初始化内存分配大小 1/64-Xmx:设置最大分配内存,默认1/4-XX:+PrintGCDetails,打印GC垃圾回收信息-XX:+HeapDumpOnOutOfMemoryError,打印OO

2020-06-01 23:11:59 674

原创 新生区、永久区、堆内存调优

JDK8之前堆的结构是这样的:JDK8将永久存储区改为了元空间。新生区:类:诞生和成长的地方,直至死亡;伊甸园:所有对象都是在伊甸园区 new出来的!幸存者区(0,1)老年区:真理:经过研究,99%的对象都是临时对象!永久区:jdk1.6之前 :永久代,常量池是在方法区jdk1.7 :永久代,但是慢慢的退化了,去永久代,常量池在堆中jdk1.8之后 :无永久代,常量池在元空间这个区域是常驻内存的。用来存放JDK自身携带的Class对象,Interface元数据,存储的

2020-06-01 17:56:34 236

原创 Native详解

Native:凡是带了Native关键字的,说明Java的作用范围达不到了,会去调用底层C语言的库!会进入本地方法栈,调用本地方法本地接口JNI(Java Native Interface),JNI的作用是扩展Java的使用,融合不同的编程语言为Java所用,最初是想融合C、C++。因为Java诞生的时候,C、C++横行,想要立足,必须要有调用C、C++的程序,它在内存区域中专门开辟了一块标记区域,Native Method Stack,登记Native方法,在最终执行的时候,通过JNI加载本地方法库中

2020-06-01 16:11:27 2260

原创 Git 的工作原理

工作区域Git 本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果再加上远程的git 仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:Workspace:工作区,就是你平时存放项目代码的地方Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表的信息Repository:仓库区(.

2020-05-28 18:06:26 236

原创 如何实现大整数相加?

public class BigNumberSum { public static String bigNumberSum(String bigNumberA,String bigNumberB){ int maxLength = bigNumberA.length() > bigNumberB.length() ? bigNumberA.length() : bigNumberB.length(); int[] arrayA = new int[maxLe

2020-05-25 13:38:28 189

原创 寻找全排列的下一个数

题目:给出一个正整数,找出这个正整数所有数字全排列的下一个数。说通俗点就是在一个整数所包含数字的全部组合中,找到一个大于且仅大于原数的新整数,举几个栗子:如果输入12345,则返回12354。如果输入12354,则返回12435。如果输入12435,则返回12453。思路:固定的几个数组,在逆序排列的情况下最大,在顺序排列的情况下最小。为了和原数接近,需要尽量保持高位不变,低位在最小的范围内变换顺序。变换顺序的范围大小,则取决于当前整数的逆序区域。获得全排列下一个数的3个步骤:1.从.

2020-05-24 17:17:46 272 1

原创 如何用栈实现队列?

题目:用栈来模拟一个队列,要求实现队列的两个基本操作:入队、出队。public class StackQueue { private Stack<Integer> stackA = new Stack<>(); private Stack<Integer> stackB = new Stack<>(); /** * 入队 * @param element */ public void e.

2020-05-24 14:14:43 319

原创 如何求出最大公约数?

写一段代码,求出两个整数的最大公约数,尽量优化算法的性能。(1)暴力枚举:从较小整数的一半开始,试图找到一个合适的整数 i,看看这个整数能否被 a 和 b 同时整除。public static int getGreatestCommonDivisor(int a,int b){ int big = a > b ? a : b; int small = a < b ? a :b; if(big%small == 0){ return small;.

2020-05-20 00:36:54 573

原创 最小栈的实现

实现一个栈,该栈带有出栈(pop)、入栈(push)、取最小元素(getMin)3个方法。要保证这3个方法的时间复杂度都是O(1)。入栈、出栈场景都应考虑到。解题思路:1.设原有的栈叫做栈A,此时创建一个额外的 “备胎” 栈B,用于辅助栈A。2.当第1个元素进入栈A时,让新元素也进入栈B。这个唯一的元素是栈A的当前最小值。3.之后,每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素进入栈B,此时栈B的栈顶元素就是栈A当前最小值。4.每当栈A有元素出.

2020-05-19 23:09:58 150

原创 如何判断链表有环?

一个单向链表,链表中可能出现 “环”,就像下图这样。如何用程序判断该链表是否为有环链表呢?解题思路:有一个很巧妙的方法,这个方法利用了两个指针。创建两个指针p1和p2(在Java里就是两个对象引用),让他们同时指向这个链表的头结点。然后开始一个大循环,在循环体中,让指针p1每次向后移动1个节点,让指针p2每次向后移动2个节点,然后比较两个指针指向的节点是否相同。如果相同,则判断链表有环,如果不同,则继续下一循环。假设链表的节点数量是n,则该算法的时间复杂度是O(n)。除两个结点外,没有使用任何.

2020-05-19 21:39:45 151

原创 桶排序算法

桶排序需要创建若干个桶来协助排序。桶的区间范围:区间跨度=(最大值-最小值)/(桶的数量-1)桶排序的总体时间复杂度是O(n),空间复杂度也是O(n)。public class BucketSort { public static double[] bucketSort(double[] array){ //1.得到数列的最大值和最小值,并算出差值d double max = array[0]; double min = array[0

2020-05-19 21:00:43 351

原创 计数排序算法

利用数组下标来确定元素元素的正确位置,适用于一定范围内的整数排序。如果原始数列的规模是n,最大和最小整数的差值是m,则计数排序的时间复杂度是O(n+m),空间复杂度是O(m)。public class CountSort { public static int[] countSort(int[] array){ //1.得到数列的最大值和最小值,并算出差值d int max = array[0]; int min = array[0];

2020-05-19 20:42:44 230

原创 堆排序算法

堆的自我调整:以最大堆为例,如果删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我调整,第2大的元素就会被交换上来,成为最大堆的新堆顶。二叉堆实际存储在数组中,可以归纳出堆排序算法的步骤:把无序数组构建成二叉堆。需要从小到大排,则构建最大堆;需要从大到小排,则构建最小堆。循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。public class HeapSort { /** * "下沉"调整 * @param array 待调整的堆

2020-05-18 22:28:07 154

原创 快速排序(非递归)

绝大多数的递归逻辑,都可以用栈的方式来代替。每次进入一个新方法,就相当于入栈,每次有方法返回,就相当于出栈。public class Sort { public static void QuickSort(int[] arr,int startIndex,int endIndex){ // 用一个集合栈来代替递归的函数栈 Stack<Map<String,Integer>> quickSortStack = new Stack&l

2020-05-18 21:28:12 150

原创 快速排序(递归)

快排之所以快,是因为采用了分治法,在每一轮挑选一个基准元素,并让其他比它大的元素移到数动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成两个部分。快排的平均时间复杂度是O(nlogn),但在极端情况下(数列的第一个元素为最小值或最大值),时间复杂度为O(n2n^2n2)。快排有两种方法:双边循环法、单边循环法。双边循环法是选定基准元素pivot,并设置两个指针left、right,指向数列的最左和最右两个元素。先从 right 指针开始,让指针指向的元素与基准元素比较,如果大于或等于pi

2020-05-18 18:25:43 2854

原创 鸡尾酒排序算法

鸡尾酒排序是基于冒泡排序的一种升级排序法,冒泡排序是从左到右来比较元素,进行单向的位置交换的,鸡尾酒排序的元素和交换是双向的,一轮从左到右比较,一轮从右到左比较。代码外层的大循环控制着所有排序回合,大循环内包含2个小循环,第1个小循环从左向右比较并交换元素,第2个小循环从右向左比较并交换元素。鸡尾酒排序的优点是能够在特定条件下,减少排序的回合数,缺点就是代码量几乎增加了一倍,它能发挥优势的场景是大部分元素已经有序的情况。public static void sort(int[] array){ in

2020-05-16 13:25:41 317

原创 冒泡排序Bubble Sort算法最优解

public class BubbleSort { public static void main(String[] args) { int[] array = {3,4,2,1,5,6,7,8}; sort(array); System.out.println(Arrays.toString(array)); } public static void sort(int[] array){ //记录最后一次交换的位置

2020-05-16 10:46:29 581 1

原创 08- 动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?

90% 的程序员都直接或间接的使用过动态代理,无论是日志框架或 Spring 框架,它们都包含了动态代理的实现代码。动态代理是程序在运行期间构建代理对象和动态调用代理方法的一种机制。那么,如何实现动态代理?JDK Proxy 和 CGLib 有什么区别?动态代理的常用实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以...

2020-04-08 15:12:18 299

原创 07- 深克隆和浅克隆有什么区别?它的实现方式有哪些?

使用克隆可以为我们快速的构建出一个已有对象的副本,它属于 Java 基础的一部分,也是面试中常被问到的知识点之一。那么,什么是浅克隆和深克隆?如何实现克隆?浅克隆(Shadow Clone)是把原型对象中成员变量为值类型的属性都复制给克隆对象,把原型对象中成员变量为引用类型的引用地址也复制给克隆对象,也就是原型对象中如果有成员变量为引用对象,则此引用对象的地址是共享给原型对象和克隆对象的。简...

2020-04-07 22:38:45 437

原创 06- 谈谈你对锁的理解?如何手动模拟一个死锁?

在并发编程中有两个重要的概念:线程和锁,多线程是一把双刃剑,它在提高程序性能的同时,也带来了编码的复杂性,对开发者的要求也提高了一个档次。而锁的出现就是为了保障多线程在同时操作一组资源时的数据一致性,当我们给资源加上锁之后,只有拥有此锁的线程才能操作此资源,而其他线程只能排队等待使用此锁。那么,如何手动模拟一个死锁?谈谈你对锁的理解?死锁是指两个线程同时占用两个资源,又在彼此等待对方释放锁资源...

2020-04-07 11:35:15 503

原创 05- synchronized 和 ReentrantLock 的实现原理是什么?它们有什么区别?

在JDK 1.5 之前共享对象的协调机制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的机制 ReentrantLock,该机制的诞生并不是为了替代 synchronized,而是在 synchronized 不适用的情况下,提供一种可以选择的高级功能。那么,synchronized 和 ReentrantLock 是如何实现的?它们有什么区别?synch...

2020-04-07 00:17:34 416 1

原创 04- 详解 ThreadPoolExecutor 的参数含义及源码执行流程

线程池是为了避免线程频繁的创建和销毁带来的性能消耗,而建立的一种池化技术,它是把已创建的线程放入 “池” 中,当有任务来临时就可以重用已有的线程,无需等待线程的创建,这样就可以有效提高程序的响应速度。但如果要说线程池的话一定离不开 ThreadPoolExecutor,在阿里巴巴的《Java开发手册》中是这样规定线程池的:线程池不允许使用 Executor 去创建,而是通过 ThreadPool...

2020-04-06 13:45:01 547 1

原创 03- 线程的状态有哪些?它是如何工作的?

线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在。一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源、更加轻量化,也因此被称为轻量级的进程。线程的状态在 JDK 1.5 之后以枚举的方式被定义在 Thread 的源码中,它总共包含以下 6 个状态:NEW,新建状态,线程被创建出来,但尚未启动时的线程状态;RUN...

2020-04-05 23:49:42 399

原创 02- HashMap 底层实现原理是什么?JDK 8 做了哪些优化?

在 JDK 1.7 中 HashMap 是以数组加链表的形式组成的,JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且容量大于 64 时,链表结构会转换成红黑树结构,它的组成结构如下图:数组中的元素我们称之为哈希桶,它的定义如下:static class Node<K,V> implements Map.Entry<K,V> { final int h...

2020-04-05 21:33:31 221

原创 01- String的特点是什么?它有哪些重要的方法?

以主流的JDK版本1.8来说,String内部实际存储结构为char数组,源码如下:public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // 用于存储字符串的值 private final char value[]; // 缓存字符串的...

2020-04-05 15:52:23 366

原创 浙江大学-翁恺-C语言程序设计-编程练习

猜数游戏让计算机来想一个数,然后让用户来猜,用户每输入一个数,就告诉它是大了还是小了,知道用户猜中为止,最后还要告诉用户它猜了多少次。#include <stdio.h>int main(){ srand(time(0)); int number = rand()%100+1; int count = 0; int a = 0; ...

2020-03-30 23:00:29 3283 2

原创 离散数学图论

离散数学图论学习一、图1. 图的基本概念2. 连通性3. 矩阵表示二、欧拉图、哈密顿图三、最短路径四、平面图五、对偶与着色六、树1. 树的定义2. 生成树3. 根树一、图1. 图的基本概念【定义】一个图表示为G=<V(G),E,其中V(G):是G的顶点的非空集合,简记成V。E(G):是G的边的集合,简记成E。结点(Vertices):用о表示,旁边标上该结点的名称。边(...

2020-03-28 10:23:16 1587 3

原创 初识 Seata

分布式问题:单体应用被拆分成微服务应用,原来的三个模块被拆分成三个独立的应用,分别使用三个独立的数据源,业务操作需要调用三个服务来完成。此时每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题没法保证。Seata是什么?Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。官网地址:https://seata.io/zh-cn/...

2020-03-25 19:34:00 851 2

原创 Sentinel 流控

流控规则基本介绍:资源名:唯一名称,默认请求路径针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)阈值类型/单机阈值:QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流线程数:当调用该api的线程数达到阈值的时候,进行限流是否集群:(不)需要集群流控模式:直接:api达到限流条件时,直...

2020-03-24 16:34:17 1282

原创 Sentinel 初始化监控

1.启动服务注册中心 Nacos88482.新建module cloudalibaba-sentinel-service8401<!--pom.xml依赖--><dependencies> <!--springcloud alibaba nacos--> <dependency> <groupId>com...

2020-03-24 14:37:58 1108

原创 初识 Sentinel

代替了Hystrix官网:https://github.com/alibaba/Sentinel下载地址:https://github.com/alibaba/Sentinel/releasesSentinel分为两个部分:核心库(Java客户端)不依赖任何框架/库,能够运行于所有Java运行时环境,同时对Dubbo/Spring Cloud等框架也有较好的支持。控制台(Dashboa...

2020-03-24 13:31:15 845

原创 Nacos 集群和持久化

集群官网:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html上图翻译一下:默认Nacos使用嵌入式数据库(derby)实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持Mysql的存储。Nacos支持三种...

2020-03-24 13:00:55 1428

seata-server-1.0.0.zip.xltd

seata-server-1.0.00资源下载。Seata 融合了阿里巴巴和蚂蚁金服在分布式事务技术上的积累,并沉淀了新零售、云计算和新金融等场景下丰富的实践经验,但要实现适用于所有的分布式事务场景的愿景,仍有很长的路要走

2020-06-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除