- 博客(37)
- 收藏
- 关注
原创 Shell
Shell脚本命令的工作方式有两种1.交互式(Interactive):用户每输入一条命令就立即执行2.批处理(bash):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。查看SHELL变量可以发现当前系统已经默认使用Bash作为命令行终端解释器:echo $SHELL/bin/bash接收用户参数参数描述$0当前shell脚本程序的名称$#总共是有几个参数$*显示上一次命令的执行返回值$1、$2…分别对.
2021-04-30 00:12:44
129
原创 Vim常用命令
命令模式:命令作用a在光标后面一位切换到输入模式i在光标当前位置切换到输入模式o在光标下面创建一个空行并切换到输入模式dd删除(剪切)光标所在整行5dd删除(剪切)从光标处开始的5航行yy复制光标所在整行5yy复制从光标处开始的5行n显示搜索命令定位到的下一个字符串N显示搜索命令定位到的上一个字符串u撤销上一步操作p将之前删除(dd)或复制(yy)过的数据粘贴到光标后面末行模式:命令作用
2021-04-26 17:43:29
129
原创 Linux常用命令
Linux常用命令1.新建目录和文件2.复制目录和文件3.移动目录和文件4.重命名目录和文件5.删除目录和文件6.当前目录1.新建目录和文件mkdir testtouch test.txt2.复制目录和文件把目录user复制到haha下cp -r user haha/把目录user复制到haha下,不包含user目录cp -r user/. haha/把user.txt复制到user目录下cp user.txt user3.移动目录和文件移动user到haha下mv us
2020-12-22 16:05:48
170
原创 Mac安装Python3.9
mac系统自带python环境,不过都是2.x版本。我们使用mac的brew命令安装python3.9。mac默认python目录/System/Library/Frameworks/Python.framework/Versions, 使用python可以查看当前安装python版本brew命令无法使用打开网站https://www.ipaddress.com/查询一下 raw.githubusercontent.com对应的IP 地址修改这个文件/etc/hosts增加一行 199...
2020-12-20 21:49:56
11596
原创 Java 希尔排序
/** * 希尔排序 * * @Author ZhangGJ * @Date 2020/12/18 06:29 */public class Shell { public static Comparable[] sort(Comparable[] a) { int n = a.length; int h = 1; while (h < n / 3) { h = 3 * h + 1; }
2020-12-18 06:45:10
140
原创 Java 插入排序
/** * 插入排序 * * @Author ZhangGJ * @Date 2020/12/17 07:37 */public class Insertion { public static Comparable[] sort(Comparable[] a) { int n = a.length; for (int i = 1; i < n; i++) { for (int j = i; j > 0 &&am
2020-12-17 08:21:59
74
原创 Java 选择排序
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换),其次,在剩下的元素中找到最小元素,将它与数组的第二个元素交换位置。如此往复,知道整个数组排序,这种算法叫做选择排序,因为它在不断地选择剩余元素中的最小者。交换元素的代码写在内循环之外,每次交换都能排定一个元素,因此交换的总次数是n,所以算法的时间效率取决于比较的次数。对于长度为n的数组,选择排序需要大约n²/2次比较和n次交换。特点:1.运行时间和输入无关。一个已经排序的数组和一个.
2020-12-17 07:34:41
133
原创 Java Dijkstra双栈算数表达式求值算法
/** * ( 1 + ( ( 6 - 3 ) * ( 10 / 5 ) ) ) * * @Author ZhangGJ * @Date 2020/12/15 07:24 */public class Evaluate { public static void main(String[] args) { Stack<String> operator = new Stack<>(); Stack<Double> value
2020-12-15 22:53:45
166
1
原创 Java 计算调和级数
/** * 调和级数 * * @Author ZhangGJ * @Date 2020/12/06 21:22 */public class HarmonicProgression { public static double harmonic(int number) { double sum = 0.0; for (int i = 0; i <= number; i++) { sum += 1.0 / i;
2020-12-06 21:27:43
369
2
原创 Java 计算平方根(牛顿迭代法)
/** * @Author ZhangGJ * @Date 2020/12/06 21:01 */public class SquareRoot { public static double sqrt(double number) { if (number < 0) { return Double.NaN; } double err = 1e-15; double t = number;
2020-12-06 21:19:45
306
原创 Java 是否是素数
/** * @Author ZhangGJ * @Date 2020/12/06 11:36 */public class PrimeNumber { public static boolean isPrimeNumber(int number) { boolean result = true; if (number < 2) { result = false; } for (int i = 2;
2020-12-06 21:00:43
73
原创 Java 典型数组操作算法
典型数组处理代码1、颠倒数组元素的顺序2、矩阵相乘二维数组:1、颠倒数组元素的顺序/** * @Author ZhangGJ * @Date 2020/12/06 09:59 */public class ArrayReverseOrder { private static int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; /** * 颠倒数组元素的顺序 * * @param original *
2020-12-06 11:35:25
64
原创 Java 欧几里得算法(Euclid Algorithm)
自然语言描述: 计算两个非负整数p和q的最大公约数:若q是0,则最大公约数为p。否则,将p除以q得到余数r,p和q的最大公约数即为q和r的最大公约数。/** * @Author ZhangGJ * @Date 2020/12/06 09:18 */public class Euclid { public static int euc(int p, int q) { if (q == 0) { return p; }
2020-12-06 09:28:18
315
原创 Java I/O
I/O一、File类1. File2.目录实用工具3.目录的检查以及创建一、File类1. FileFile(文件)类这个名字有一定的误导性,我们可能认为它指代的是文件,实际上却并非如此,它技能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称,如果它指定的是一个文件集,我们就可以对此集合调用list()方法,这个方法会返回一个字符数组。class DirFilter implements FilenameFilter { private Pattern pattern;
2020-12-06 06:42:41
182
原创 Java散列和散列码
散列的价值在于速度:散列使得查询得以快速进行,由于瓶颈位于键的查询速度,因此解决方案之一就是保持键的排序状态,然后使用Collections.binarySearch()进行查询。 散列则更进一步,它将键保存在某处,以便能够快速找到,存储一组元素最快的数据结构是数组,所以使用它来表示键的信息(键的信息,而不是键本身),但是因为数组不能调整容量,因此就有一个问题:我们希望在Map中保存数量不确定的值,但是如果键的数量被数组的容量限制了,该怎么办呢? 答案就是:数组并不保存键本身,而是通过键对象生成
2020-12-04 07:31:11
248
原创 Java Set常用的操作
Set1.set常用集合运算1.set常用集合运算/** * @Author ZhangGJ * @Date 2020/11/28 07:26 */public class Sets { /** * 合并两个Set * * @param a * @param b * @param <T> * @return */ public static <T> Set<T> union
2020-11-28 07:39:22
195
原创 正则表达式
.任意字符[abc]包含a、b和c的任意字符(和a|b|c作用相同)[^abc]除了a、b和c之外的任意字符(否定)[a-zA-Z]从a-z或从A-Z的任意字符(范围)[abc[hij]]任意a、b、c、h、i和j字符(与a|b|c|h|i|j作用相同(合并)[a-z&&[hij]]任意h、i或j(交集)\s空白符(空格、tab、换行、换页和回车\S非空白符([^\s])\d数字[0-9]\D非数字...
2020-11-26 23:17:00
178
原创 Java String
1.无意识的递归编译器看到一个String对象后面跟着一个“+”,而再后面的对象不是String,于是编译器试着将this转换成一个String,它怎么转换呢?正是通过调用this上的toString()方法,于是就发生了递归调用。如果你真的想要打印出对象的的内存地址,应该调用Object.toString()方法,而不应该使用this,应该使用super.toString()方法。/** * @Author ZhangGJ * @Date 2020/11/26 08:38 */public c
2020-11-26 08:41:04
70
1
原创 Java String常用的操作
String常用的操作1.去掉String最后一个字符(逗号,空格等):1.去掉String最后一个字符(逗号,空格等):result.delete(result.length() - 2, result.length())public class UsingStringBuilder { public static Random rand = new Random(47); @Override public String toString() { Stri
2020-11-26 08:33:29
71
原创 Java 异常(Exception)
异常1. 重抛异常2. 异常链1. 重抛异常重新抛出异常会把异常抛给上一级环境中的异常处理程序,同一个try块的后续catch子句将被忽略,此外,异常对象的所有信息都得以保持,所以高一级环境中捕获此异常的处理程序可以从这个异常对象中得到所有信息。如果只是把当前异常对象重新抛出,那么printStackTrace()方法显示的将是原来异常抛出点的调用栈信息,而并非重新抛出点的信息,要想更新这个信息,可以调用fillInStackTrace()方法,将返回一个Throwable对象,它是通过把当前调用栈信
2020-11-25 08:30:29
144
原创 Spring Cloud Redis 接口幂等性
幂等性原本是数学上的概念,即使公式:f(x)=f(f(x)) 能够成立的数学性质。用在编程领域,则意为对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的。接口的增删改查操作:1.查询是天然的幂等操作;2.删除一次和多次删除都是把数据删除。(返回结果可能不一样,删除的数据不存在,返回0,删除的数据多条,返回结果多个,在不考虑返回结果的情况下,删除操作也具有幂等性);3.修改大多数是幂等的,但如果是增量修改需要保证幂等性;4.新增当然不是幂等的。流程如下:1.前端弹出表
2020-11-23 10:56:34
692
原创 Java内部类
内部类什么是内部类使用.this和.new什么是内部类可以将一个类的定义放在另一个类的定义内部,这就是内部类。内部类能访问其外围对象的所有成员,而不需要任何特殊条件,此外,内部类还拥有其外围类的所有元素的访问权,这是怎么做到的呢?当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用,然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。使用.this和.new/** * @Author ZhangGJ * @Date 2020/11/
2020-11-18 08:20:30
181
原创 Spring Cloud Nacos整合Seata 1.4.0
整合Seata1.4.0步骤1、Seata下载2、Seata配置3、Seata SQL4、POM依赖:5、代码配置6、启动命令1、Seata下载地址: https://github.com/seata/seata/releases2、Seata配置registry.conf:registry { # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa type = "nacos" loadBalance = "RandomLoadBalance
2020-11-17 11:00:10
1316
原创 Java final关键字
final使用的三种情况:数据、方法和类。1.final数据对于基本类型,final使数值恒定不变,而对于对象引用,final使引用恒定不变,一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象,然而对象自身是可以被修改的。空白final必须在域的定义处或者在构造器中赋值。2.final方法使用final方法的原因有两个,第一个是把方法锁定,以防任何继承类修改它的含义,这是出于设计考虑,想要确保在继承中使方法行为保持不变,并且不会被覆盖,过去建议使用final方法的第二个原因是效率,现在由
2020-11-16 06:55:58
95
原创 什么是多态(向上转型)
将导出类看做是它的基类的过程成为向上转型(upcasting)void doSomethings(Shape shape) { shape.erase(); shape.draw();}Circle circle = new Circle();Triangle triangle = new Triangle();Line line = new Line();doSomethings(circle);doSomethings(triangle);doSomethings(line);
2020-11-15 09:37:18
516
原创 Java 构造器与类内部初始化顺序
构造器是初始化对象,并不是创建对象。调用new关键字,会为对象分配存储空间,并调用构造器初始化类。- 在构造器中调用构造器/** * @Author ZhangGJ * @Date 2020/11/14 10:37 */public class Flower { int petalCount = 0; String s = "initial value"; Flower(int petals) { petalCount = petals;
2020-11-15 07:44:21
405
原创 Java finalize()
finalize()一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。在本地方法中,也许会调用C的malloc()函数系列来分配存储空间,而且除非调用了free()函数,否则存储空间将得不到释放,从而造成内存泄漏,当然free()时C和C++中的函数,所以需要在finalize()中用本地方法调用它。finalize()可以验证终结条件:class Book { boolean checkedOu.
2020-11-14 11:38:17
55
原创 Java this关键字
this关键字:class Banana { void peel(int i) { }}/** * @Author ZhangGJ * @Date 2020/11/14 08:42 */public class BananaPeel { public static void main(String[] args) { Banana a = new Banana(), b = new Banana(); a.pee
2020-11-14 08:55:48
122
原创 Java对象赋值(别名问题)
对一个对象进行操作的时候,我们真正操作的是对对象的引用,所以,倘若“将一个对象赋值给另一个对象”,实际是将”引用”从一个地方赋值到另一个地方,这意味着假若对对象使用c=d,那么c和d都指向原本只有d指向的那个对象。class Tank { int level;}/** * @Author ZhangGJ * @Date 2020/11/14 06:55 */public class Assigment { public static void main(String[] a
2020-11-14 07:07:13
364
1
原创 Java static关键字
使用static的两种情形:1.只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象;2.希望某个方法不与包含它的类的任何对象关联在一起,也就是说,即使没有创建对象,也能够调用这个方法。当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起,所以你即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。class StaticTest { static int i = 47;}StaticTe
2020-11-12 08:21:24
690
2
原创 RocketMQ发送事务消息:发送的消息需要用到本地事务的结果集问题,无法保持事务一致
为了方便说明问题,如下图:如图,RocketMQ正常的事务消息流程(除了红色部分)。问题:如果第三步执行了插入数据,需要返回到data中,即已经发送的Half Message中,第三步中是无法修改data和message的,为了保证data包含本地事务的结果集,可以把本地事务放到发送Half Message之前,即第三步移到第一步,如果这样处理,就无法保证事务一致(1处的事务与其他事务不一致)。不知道官方是否会认为这是个bug,并且修复。解决办法:1.使用全局唯一ID(UUID,等),保证发送的
2020-11-09 11:49:48
583
原创 java动态绑定(后期绑定)
程序绑定的概念:绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定.静态绑定:编译器将产生一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由编译器或其它连接程序实现。例如:C。针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中final,static,private和构造方
2020-09-22 08:03:53
734
原创 New关键字(实例化对象)
New关键字Point originOne = new Point(23, 94);Rectangle rectOne = new Rectangle(originOne, 100, 200);Rectangle rectTwo = new Rectangle(50, 100);为Point的对象创建了一个实例,在内存里开辟了两个空间:一块空间在堆,存放new Point()这个对象;另一块空间在栈,存放originOne,originOne值即new Point(23, 94)这个对象的内存地址
2020-09-21 08:18:06
2753
转载 面向对象的七大设计原则
一、开闭原则(The Open-Closed Principle ,OCP)二、里氏替换原则(Liskov Substitution Principle ,LSP)三、 迪米特原则(最少知道原则)(Law of Demeter ,LoD)四、单一职责原则五、接口分隔原则(Interface Segregation Principle ,ISP)六、依赖倒置原则(Dependency Inversion Principle ,DIP)七、组合/聚合复用原则(Composite/Aggregate
2020-09-10 08:07:53
505
原创 纯粹的面向对象程序设计方式
纯粹的面向对象程序设计方式Smalltalk 作为第一个成功的面向对象并影响了 Java 的程序设计语言 ,Alan Kay 总结了其五大基本特征。通过这些特征,我们可理解“纯粹”的面向对象程序设计方法是什么样的:1.万物皆对象 你可以将对象想象成一种特殊的变量。它存储数据,但可以在你对其“发出请求”时执行本身的操作。理论上讲,你总是可以从要解决的问题身上抽象出概念性的组件,然后在程序中将其表示为一个对象。2.程序是一组对象,通过消息传递来告知彼此该做什么 要请求调用一个对象的方法,你需要向该对象发送
2020-09-08 08:01:54
316
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人